PDO-Paginierung mit LIKE

Aug 18 2020

Der folgende PHP-SQL-Code zeigt einen Fehler an. Behebbarer schwerwiegender Fehler: Objekt der Klasse PDOStatement konnte nicht in Zeichenfolge in /home/customer/xxxx/fetch_data.php in Zeile 28 konvertiert werden. Ich habe versucht, Produktinformationen aus der Tabelle anzuzeigen. filterEs gibt zwei $statement->execute();, eine dient zum Zählen der gesamten Suchergebnisse und zum Anzeigen von Produkten für die aktuelle Seite. Ich bin neu in der PDO-Methode und kein Experte für die Gesamtcodierung.

Das verursacht Probleme. Mit dieser und verwandten Funktionen arbeitet der Code und zeigt Daten an. Aber wenn ich es aktiviere, wird der Fehler angezeigt.$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

Ich habe den folgenden Code wie vorgeschlagen ausprobiert Your Common Senseund die Paginierung und die Gesamtzahl der Suchergebnisse funktionieren einwandfrei, aber es werden keine Produkte angezeigt.

    $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

Wenn Sie die folgende Zeile verwenden, werden im Code einige Daten angezeigt, aber die Paginierung funktioniert nicht.

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

Antworten

YourCommonSense Aug 18 2020 at 08:23

Dies ist keine triviale Aufgabe, da wir dieselbe Abfrage zweimal ausführen müssen, jedoch mit geringfügigen Unterschieden. Die erste Abfrage verwendet die count(*)SQL-Funktion, um die Gesamtzahl der Datensätze zu ermitteln, die den Suchkriterien entsprechen. Bei der zweiten Abfrage werden tatsächliche Felder mit der LIMIT-Klausel ausgewählt, um die Daten für die einzelne Seite abzurufen.

$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();

Wichtig: Damit dieser Code funktioniert, stellen Sie sicher, dass Sie eine ordnungsgemäße Verbindung zu MySQL herstellen . Durch die ordnungsgemäße Verbindung kann eine LIMIT-Klausel Platzhalter akzeptieren und Sie bei Problemen warnen.