Pagination AOP avec LIKE

Aug 18 2020

Le code PHP SQL suivant montre une erreur Erreur fatale récupérable: L'objet de la classe PDOStatement n'a pas pu être converti en chaîne dans /home/customer/xxxx/fetch_data.php à la ligne 28 J'essayais d'afficher les informations sur les produits de la table filterIl y en a deux $statement->execute();, un consiste à compter le total des résultats de la recherche et une autre consiste à afficher les produits pour la page en cours. Je suis nouveau dans la méthode PDO et je ne suis pas un expert en codage global.

Le cause des problèmes. Avec cela et les fonctions associées, le code fonctionne et affiche des données. Mais si je l'active, l'erreur apparaît.$filter_query = $stmt . 'LIMIT '.$start.', '.$limit.'';

    $limit = '5';
$page = 1; if($_POST['page'] > 1)
{
  $start = (($_POST['page'] - 1) * $limit); $page = $_POST['page']; } else { $start = 0;
}
$search = "%samsung%"; $stmt = $connect->prepare("SELECT * FROM filter WHERE product_name LIKE :needle"); $stmt->bindParam(':needle', $search, PDO::PARAM_STR); ## ## $filter_query = $stmt . 'LIMIT '.$start.', '.$limit.''; $statement->execute();
    $total_data = $stmt->rowCount();
    
    $stmt = $connect->prepare($filter_query); $stmt->execute();
    $result = $stmt->fetchAll();
    $total_filter_data = $stmt->rowCount();
    
    $output = ' <h3> '.$total_data.' results found </h3>  
    and display each product

J'ai essayé le code suivant comme suggéré par Your Common Senseet la pagination et le nombre total de résultats de recherche fonctionnent correctement, mais aucun produit ne s'affiche.

    $limit = '5'; $page = 1;
    if($_POST['page'] > 1) { $start = (($_POST['page'] - 1) * $limit);
      $page = $_POST['page'];
    }
    else
    {
      $start = 0; } $name=str_replace(' ', '%', $_POST['query']); $search = "%$name%"; $base_sql = "SELECT %s FROM filter WHERE product_name LIKE ?";
    ##
    
    ##
    ####
    $count_sql = sprintf($base_sql, "count(*)");
    $stmt = $connect->prepare($count_sql); $stmt->execute([$search]); $total_data = $stmt->fetchColumn(); #### $data_sql = $count_sql = sprintf($base_sql, "*")." LIMIT ?,?";
    $stmt = $connect->prepare($data_sql); $stmt->execute([$search, $start, $limit]); $result = $stmt->fetchAll(); ## $output = '
   <h3> '.$total_data.' results found </h3> '; if($total_data > 0)
{
  foreach($result as $row)
  {
            and display each product

L'utilisation de la ligne suivante permet au code d'afficher certaines données, mais la pagination ne fonctionne pas.

$data_sql = sprintf($base_sql, "*");
    $stmt = $connect->prepare($data_sql); $stmt->execute([$search]); $result = $stmt->fetchAll();

Réponses

YourCommonSense Aug 18 2020 at 08:23

Ce n'est pas une tâche triviale car nous devons exécuter la même requête deux fois mais avec des différences mineures. La première requête utilisera la count(*)fonction SQL pour obtenir le nombre total d'enregistrements correspondant aux critères de recherche. La deuxième requête sélectionnera les champs réels avec la clause LIMIT pour obtenir les données pour la page unique.

$base_sql = "SELECT %s FROM filter WHERE product_name LIKE ?"; $count_sql = sprintf($base_sql, "count(*)"); $stmt = $connect->prepare($count_sql);
$stmt->execute([$search]);
$total = $stmt->fetchColumn();

$data_sql = $count_sql = sprintf($base_sql, "*")." LIMIT ?,?"; $stmt = $connect->prepare($data_sql);
$stmt->execute([$search, $start, $limit]);
$data = $stmt->fetchAll();

Important: pour que ce code fonctionne, assurez-vous que vous vous connectez correctement à mysql . la connexion appropriée laissera une clause LIMIT accepter les espaces réservés et vous avertira également en cas de problème.