php - 计算搜索查询返回的行数

标签 php mysql sql search pdo

我正在尝试设置一个管理搜索功能,该功能从搜索字段中获取值,将查询发送到由名为“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);

使用此设置将引发异常。我还发现了一个拼写错误。请参阅上文(tagstag.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/

相关文章:

Mysql - 从前一天的输入中减去值

php - WHERE 或停止 LIKE 工作

java - 管理对单个数据库的多线程访问的各种方法有哪些?

php - 使用命名空间的第一步

php - 在 Laravel 5.4 的浏览器中预览 Mailables 时出错

mysql - 如何在项目 symfony 中更新实体(添加和删除某些列)而不使用数据库迁移

sql - 插入临时值(选择....按 ID 排序)

php - 按值获取所有数组键

php - 寻求有关 : accessing MySql db via Android app 的建议

mysql - 如何使用 MYSQL 创建 3 路 LEFT JOIN?