我正在尝试设置一个管理搜索功能,该功能从搜索字段中获取值,将查询发送到由名为“data”的表和一个名为“tag”的表组成的 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
部分,这里似乎有一点拼写错误 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
您收到以下异常:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY data.id' at line 1' in /var/www/admin.php:96 Stack trace: #0 /var/www/admin.php(96): PDOStatement->execute(Array) #1 {main} thrown in /var/www/admin.php on line 96
因此,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;
关于php - 计算搜索查询返回的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22320939/