Paginación PDO con LIKE

Aug 18 2020

El siguiente código PHP SQL muestra un error Error fatal recuperable: el objeto de la clase PDOStatement no se pudo convertir a una cadena en /home/customer/xxxx/fetch_data.php en la línea 28 Estaba tratando de mostrar información de productos de la tabla filterHay dos $statement->execute();, uno es contar el total de resultados de búsqueda y otro es mostrar productos para la página actual. Soy nuevo en el método PDO y no soy un experto en codificación general.

El está causando problemas. Con eso y funciones relacionadas, el código funciona y muestra datos. Pero si lo habilito, aparece el error.$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

Probé el siguiente código según lo sugerido por Your Common Sensey la paginación y el recuento total de resultados de búsqueda funcionan bien, pero no se muestran productos.

    $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

El uso de la siguiente línea hace que el código muestre algunos datos, pero la paginación no funciona.

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

Respuestas

YourCommonSense Aug 18 2020 at 08:23

Esa no es una tarea trivial, ya que necesitamos ejecutar la misma consulta dos veces, pero con pequeñas diferencias. La primera consulta utilizará la count(*)función SQL para obtener el número total de registros que coinciden con los criterios de búsqueda. La segunda consulta seleccionará los campos reales con la cláusula LIMIT para obtener los datos de una sola página.

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

Importante: para que este código funcione, asegúrese de conectarse correctamente a mysql . la conexión adecuada permitirá que una cláusula LIMIT acepte marcadores de posición y también le advertirá en caso de cualquier problema.