簡體   English   中英

計算搜索查詢返回的行數

[英]Counting the number of rows returned from a search query

我正在嘗試建立一個管理員搜索功能,該功能從搜索字段中獲取值,將查詢發送到由名為“數據”的表和名為“標簽”的表組成的SQL數據庫,並返回兩個結果,和行數。 結果工作得很好,但結果數量卻沒有。 以下是相關代碼:

    $query="SELECT * FROM data";
    $where="";
    $params=array();
    if(!empty($idsearch)){
        $where.=" id = ? AND";
        $params[]=$idsearch;
    }
    if(!empty($approvedsearch)&&$approvedsearch!=="A"){
        $where.=" approved = ? AND";
        $params[]=$approvedsearch;
    }
    if(!empty($namesearch)){
        $where.=" name LIKE ? AND";
        $params[]=$namesearch."%";
    }
    if(!empty($emailsearch)){
        $where.=" email LIKE ? AND";
        $params[]=$emailsearch."%";
    }
    if(!empty($fileurlsearch)){
        $where.=" (url LIKE ? OR fileid LIKE ?) AND";
        $params[]="%".$fileurlsearch."%";
        $params[]="%".$fileurlsearch."%";
    }
    if(!empty($datesearch)){
        $where.=" timedate LIKE ? AND";
        $params[]=$datesearch."%";
    }
    if(!empty($tagsearch)){
        $query.=" INNER JOIN tags ON tag.data_id = data.id";
        $tags=explode(" ",$tagsearch);
        $tagMarks=substr(implode(array_pad(array(),count($tags),"?, ")),0,-2);
        $where.=" tag.name IN (".$tagMarks.") AND";
        $params=array_merge($params,$tags);
    }
    if($where !== ""){
        $where=substr($where,0,-4);
        $query.=" WHERE ".$where/*." LIMIT ".$lowlim.", ".$uplim*/;
    }
    $countQuery="SELECT count(DISTINCT data.id) as count FROM data ".$where;
    $countQuery.=" INNER JOIN tags ON tag.data_id = data.id";
    $countQuery.=" WHERE ".$where;
    $countQuery.=" GROUP BY data.id";
    $countQuery=$con->prepare($countQuery);
    $countQuery->execute($params);
    $rowResult=$countQuery->fetchAll(PDO::FETCH_ASSOC);
    $totalRows=$rowResult[0]['count'];
    $query.=" GROUP BY data.id";
    $query=$con->prepare($query);
    $query->execute($params);
    $results=$query->fetchAll(PDO::FETCH_ASSOC);
    $datas=array();
    foreach($results as $result){
        $result['tag']=array();
        $datas[$result['id']]=$result;
    }
    $dataIds=array_keys($datas);
    $dataMarks=substr(implode(array_pad(array(),count($dataIds),"?, ")),0,-2);
    $query=$con->prepare("SELECT * FROM tag WHERE data_id IN (".$dataMarks.")");
    $query->execute($dataIds);
    $results=$query->fetchAll(PDO::FETCH_ASSOC);
    foreach($results as $result){
        $dataId=$result['data_id'];
        $datas[$dataId]["tag"][]=$result;
    }
    foreach($datas as $data){
        $tags=array();
        foreach($data['tag'] as $tag){
            $tags[]=$tag['tag_name'];
        }
?>
<tr>
    <td><?=$data['id']?></td>
    <td><?=$data['approved']?></td>
    <td><?=$data['name']?></td>
    <td><?=$data['email']?></td>
    <td><?=$data['fileid']?><?=$data['url']?></td>
    <td><?=$data['notes']?></td>
    <td><?=$data['timedate']?></td>
    <td><?=implode(", ",$tags)?></td>
</tr>    
<?php }?>

我認為countQuery是一個有問題的問題,但是引發的錯誤是Notice: Undefined offset: 0 in /var/www/admin.php on line 97 ,即$totalRows=$rowResult[0]['count'];

我想我發現了您的mysql語法錯誤:

$where查詢中兩次添加了$where部分,並且似乎在這里有一些拼寫錯誤: tags ON tag.data_id

$countQuery="SELECT count(DISTINCT data.id) as count FROM data ".$where;
$countQuery.=" INNER JOIN tags ON tag.data_id = data.id";
$countQuery.=" WHERE ".$where;
$countQuery.=" GROUP BY data.id";

嘗試修復它:

$countQuery="SELECT count(DISTINCT data.id) as count FROM data ";
$countQuery.=" INNER JOIN tags ON tags.data_id = data.id";
$countQuery.=" WHERE ".$where;
$countQuery.=" GROUP BY data.id";

編輯

請按如下所示在PDO中設置錯誤處理:

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

使用此設置,將引發異常。 我還發現了拼寫錯誤。 參見上文( tagstag.data_id

編輯2

您收到以下異常:

致命錯誤:消息“ SQLSTATE [42000]”未捕獲的異常“ PDOException”:語法錯誤或訪問沖突:1064 SQL語法有錯誤; 在/var/www/admin.php:96堆棧跟蹤:#0 / var / www / admin中,檢查與您的MySQL服務器版本相對應的手冊以獲取正確的語法,以在'GROUP BY data.id'在第1行'附近使用.php(96):PDOStatement-> execute(Array)#1 {main}在第96行的/var/www/admin.php中拋出

因此, GROUP BY無效,這是有道理的,因為您只計算在內。 去掉它:

$countQuery="SELECT count(DISTINCT data.id) as count FROM data ";
$countQuery.=" INNER JOIN tags ON tags.data_id = data.id";
$countQuery.=" WHERE ".$where;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM