我在一个简单的查询中遇到以下错误,该查询应该返回许多行:
类型:错误
消息:在布尔值上调用成员函数num_rows()
文件名: /var/www/cfc-dev/docroot/project/system/database/DB_query_builder.php
行号:1428
我正在使用Codeigniter 3.1.9。我最近开始使用PHP7.2和sqlsrv驱动程序来连接到MSSQL数据库。
在其他帖子中,有人提到应该将scrollable设置为与 SQLSRV_CURSOR_FORWARD 不同的选项,因此我将$ this-> scrollable的值转储到sqlsrv_driver.php中,发现其值是缓冲
/**
* Execute the query
*
* @param string $sql an SQL query
* @return resource
*/
protected function _execute($sql)
{
echo $this->scrollable; die();
return ($this->scrollable === FALSE OR $this->is_write_type($sql))
? sqlsrv_query($this->conn_id, $sql)
: sqlsrv_query($this->conn_id, $sql, NULL, array('Scrollable' => $this->scrollable));
}
不太确定为什么会失败。到目前为止,任何其他不包含num_rows()的查询都可以。 谢谢。
答案 0 :(得分:0)
您所有的SELECT
查询都可以使用您的方法,但是我想您也正在执行UPDATE
或INSERT
或DELETE
或其他使用相同方法的查询,在这种情况下,您应该改用$this->db->affected_rows()
您可以在here中看到参考。另外,还要多加一些代码,查询示例将非常好。
答案 1 :(得分:0)
测试计数行的其他方法。 $query->count_all_results();
或$query->affected_rows();
答案 2 :(得分:0)
如果没有实际的源代码,总是很难回答,但是这些说明可能会对您有所帮助。
执行count_all_results($table = '', $reset = TRUE)
时,您收到的错误(我希望我们正在谈论相同的CodeIgniter版本)在公共功能if ($result->num_rows() === 0)
中。
->语法用于访问对象的属性/方法。在布尔值上使用它只会触发错误。变量$result
保存着$this->query()
函数的返回值。
运行“ READ”类型的查询时,query()
函数将返回数据库结果对象,可用于显示结果。
运行“ WRITE”类型查询时,它仅根据成功或失败返回TRUE
或FALSE
。
您可以尝试在调用$result
之前回显$result->num_rows()
来查看实际值。
因此,发生此类错误的可能原因可能是INSERT / UPDATE / DELETE语句的执行或错误的T-SQL语句。 对于INSERT / UPDATE / DELETE语句,尝试用count_all_results()替换affected_rows()。 您也可以使用SQL Management Studio检查T-SQL语句。
关于$scrollable
属性。没错,sqlsrv_num_rows()需要客户端(缓冲),静态或键集游标,如果使用前向游标或
动态游标。但这不是您出错的原因,因为FALSE
类的$scrollable
成员具有默认值CI_DB_sqlsrv_driver
或FALSE
,而SQLSRV_CURSOR_CLIENT_BUFFERED
是类的成员num_rows()
似乎没有引发错误。
答案 3 :(得分:0)
发现了问题!显然,sqlsrv驱动程序似乎不会将双引号字符串转换为单引号。所以:
$tmp = 'SELECT * FROM tmpTable WHERE tmpName="test"';
执行此查询时,将返回错误,该错误由Codeigniter评估为FALSE。我在两个不同的实例中有一个相同的应用程序,一个使用PHP5.6,另一个使用PHP7.2。对于PHP5.6(不同的驱动程序)实例,只有PHP7.2和sqlsrv驱动程序没有此问题。我认为驱动程序可以进行5.6转换
$tmp = 'SELECT * FROM tmpTable WHERE tmpName="test"';
到
$tmp = "SELECT * FROM tmpTable WHERE tmpName='test'";