【发布时间】:2015-10-01 13:45:15
【问题描述】:
来自手册:
PDOStatement::rowCount() 返回受 相应的最后执行的 DELETE、INSERT 或 UPDATE 语句 PDOStatement 对象。
如果关联的 PDOStatement 执行的最后一条 SQL 语句是 SELECT 语句,某些数据库可能会返回行数 由该语句返回。但是,不能保证这种行为 适用于所有数据库,不应依赖于便携式 应用程序。
所以PDOStatement::rowCount() 不适用于我的SELECT 查询。我有查询,我必须能够将AND 条件添加到WHERE 子句,如下所示:
$sql = "SELECT * FROM customers WHERE 1=1";
if ($name)
$sql .= " AND `name` LIKE :name";
if ($type)
$sql .= " AND `type` = :type";
if ($category)
$sql .= " AND `category` = :category";
if ($group)
$sql .= " AND `group` = :group";
if ($area)
$sql .= " AND `area` = :area";
$query = $pdo->prepare($sql);
if ($name)
$query->bindValue(':name', '%' . $name . '%');
if ($type)
$query->bindValue(':type', $type);
if ($category)
$query->bindValue(':category', $category);
if ($group)
$query->bindValue(':group', $group);
if ($area)
$query->bindValue(':area', $area);
$query->execute();
我需要像下面的代码那样做还是有更简单的方法来做?
$sql = "SELECT * FROM customers WHERE 1=1";
$count = "SELECT COUNT(*) FROM customers WHERE 1=1";
if ($name) {
$sql .= " AND `name` LIKE :name";
$count .= " AND `name` LIKE :name";
}
if ($type) {
$sql .= " AND `type` = :type";
$count .= " AND `type` = :type";
}
if ($category) {
$sql .= " AND `category` = :category";
$count .= " AND `category` = :category";
}
if ($group) {
$sql .= " AND `group` = :group";
$count .= " AND `group` = :group";
}
if ($area) {
$sql .= " AND `area` = :area";
$count .= " AND `area` = :area";
}
$query = $pdo->prepare($sql);
if ($name)
$query->bindValue(':name', '%' . $name . '%');
if ($type)
$query->bindValue(':type', $type);
if ($category)
$query->bindValue(':category', $category);
if ($group)
$query->bindValue(':group', $group);
if ($area)
$query->bindValue(':area', $area);
$query->execute();
【问题讨论】:
-
Row count with PDO的可能重复
-
@GeraldSchneider,我们的问题有点不同,我只是在寻找是否有更简单的方法来做到这一点。例如,我可以使用相同的连接赋值运算符
.=向$sql和$count添加内容吗? -
你问的完全一样。第二个答案(不是公认的)很好地解释了可能性。
-
这是一个例子,我问我能不能做得更容易。
-
使用 SQL 您可以返回诸如有关数据“组”的计数之类的信息,或者返回单个数据行。在一次查询中,在一次数据传递中同时做到这两点并不容易。