我知道之前已经问过这个问题,但似乎解决方案已经针对所提出的问题。
我有一个包含数百个实例的代码库,其中使用了mssql_num_rows。
代码示例:
$db->execute($sql);
if ($db->getRowsAffected() > 0) {
$total = $db->fetch();
在db class中:
$this->rowsaffected = mssql_num_rows($this->query_result);
SELECT count(*) FROM table
查询,因为我有太多特定的select语句。preg_replace
删除SELECT and FROM
之间的所有内容,然后替换为COUNT(*)
并运行第二个查询,但这假设所有查询都以某种方式设置。fetchAll
然后count()
结果,但这意味着要升级if语句的所有实例。如果有人将代码更新为PDO,那么对于* _num_rows函数来说,最好的替换是什么?不是解决特定问题的东西,而是取代* _num_rows功能的东西。如果那是不可能的,那么它之前是否可以实现?
答案 0 :(得分:5)
如果要计算行数,可以使用PDO执行此操作:
HashMap<String, Integer>
在PDO中使用$sql = 'select * from users';
$data = $conn->query($sql);
$rows = $data->fetchAll();
$num_rows = count($rows);
语句时,无法直接计算行数。
答案 1 :(得分:-2)
所以在大家的帮助下,这就是我所建立的。
function getRowsAffected() {
$rawStatement = explode(" ", $this->query);
$statement = strtoupper($rawStatement[0]);
if ($statement == 'SELECT' || $statement == 'SHOW') {
$countQuery = preg_replace('/(SELECT|SHOW)(.*)FROM/i', "SELECT count(*) FROM", $this->query);
$countsth = $this->pdo->prepare($countQuery);
if ($countsth->execute()) {
$this->rowsaffected = $countsth->fetchColumn();
} else {
$this->rowsaffected = 0;
}
}
return $this->rowsaffected;
}
如果语句是带有$ sth-&gt; rowCount()的INSERT,UPDATE或DELETE,那么$ this-&gt; rowsaffected已在执行阶段进行更新,所以我只需要在SELECT和SHOWS上运行第二个查询
if ($statement == 'INSERT' || $statement == 'UPDATE' || $statement == 'DELETE') {
$this->rowsaffected = $this->sth->rowCount();
}
我感觉很糟糕,因为就像我在我的问题中提到的那样,我正在寻找一个整体解决方案,我似乎偶然发现了一个适合我的特定解决方案,因为代码已经要求使用的行数功能。如果代码是这样做的:
if (mysql_num_rows($result) > 0) {
然后这个解决方案仍然会创建工作来更新所有实例以使用该自定义函数。