[英]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);
使用此設置,將引發異常。 我還發現了拼寫錯誤。 參見上文( tags
和tag.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.