LIKE를 사용한 PDO 페이지 매김

Aug 18 2020

다음 PHP SQL 코드 쇼 복구 치명적인 오류를 오류 : 클래스 PDOStatement의 개체 내가 테이블에서 디스플레이 제품 정보를하려고했던 라인 (28)에 /home/customer/xxxx/fetch_data.php에서 문자열로 변환 할 수없는 filter두 가지가있다 $statement->execute();, 하나 총 검색 결과를 계산하는 것이고 다른 하나는 현재 페이지에 대한 제품을 표시하는 것입니다. 나는 PDO 방법을 처음 접했고 전체 코딩 전문가가 아닙니다.

는 문제를 일으키는 것입니다. 그와 관련 기능을 사용하면 코드가 작동하고 데이터를 표시합니다. 하지만 활성화하면 오류가 나타납니다.$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

에서 제안한대로 다음 코드를 시도했는데 Your Common Sense페이지 매김 및 총 검색 결과 수가 제대로 작동하지만 제품이 표시되지 않습니다.

    $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

다음 줄을 사용하면 코드에 일부 데이터가 표시되지만 페이지 매김이 작동하지 않습니다.

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

답변

YourCommonSense Aug 18 2020 at 08:23

동일한 쿼리를 두 번 실행해야하지만 사소한 차이가 있으므로 이는 사소한 작업이 아닙니다. 첫 번째 쿼리는 count(*)SQL 함수를 사용 하여 검색 기준과 일치하는 총 레코드 수를 가져옵니다. 두 번째 쿼리는 단일 페이지에 대한 데이터를 가져 오기 위해 LIMIT 절이있는 실제 필드를 선택합니다.

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

중요 : 이 코드가 작동 하려면 mysql에 제대로 연결되어 있는지 확인하십시오 . 적절한 연결은 LIMIT 절이 자리 표시자를 허용하고 문제가 발생할 경우 경고합니다.