PHP MSSQL num_rows() 无法在 Codeigniter 中使用 sqlsrv 驱动程序
PHP MSSQL num_rows() not working with sqlsrv driver in Codeigniter
我在一个应该 return 多行的简单查询中收到以下错误:
Type: Error
Message: Call to a member function num_rows() on boolean
Filename:
/var/www/cfc-dev/docroot/project/system/database/DB_query_builder.php
Line Number: 1428
我正在使用 Codeigniter 3.1.9。我最近开始使用 PHP7.2 和 sqlsrv 驱动程序连接到 MSSQL 数据库。
在其他一些 post 中,有人提到应将可滚动设置为不同于 SQLSRV_CURSOR_FORWARD 的选项,因此我转储 $this- 的值>scrollable in sqlsrv_driver.php 发现它的值是buffered
/**
* 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() 的查询都没有问题。
谢谢
您所有的 SELECT
查询都可以使用您的方法,但我猜您也在执行 UPDATE
或 INSERT
或 DELETE
或者使用相同的方法方法,在这些情况下你应该使用 $this->db->affected_rows()
您可以在 中看到参考资料。还有更多的代码和您的查询示例会非常好。
测试计数行的其他方法。 $query->count_all_results();
或 $query->affected_rows();
没有实际源代码总是很难回答,但这些解释可能对您有所帮助。
您收到的错误(我希望我们谈论的是相同的 CodeIgniter 版本)在 public 函数 count_all_results($table = '', $reset = TRUE)
中,当 if ($result->num_rows() === 0)
被执行时。
-> 语法是访问对象上的 property/method。在布尔值上使用它只会触发错误。变量 $result
保存 $this->query()
函数的 return 值。
当“READ”类型查询为 运行 时,query()
函数 return 是一个数据库结果对象,您可以使用它来显示结果。
当“WRITE”类型查询是 运行 时,它只是 returns TRUE
或 FALSE
取决于成功或失败。
您可以尝试在 $result->num_rows()
调用之前回显 $result
以查看实际值。
所以,出现这种错误的可能原因可能是执行了INSERT/UPDATE/DELETE语句或者错误的T-SQL语句。
尝试将 count_all_results() with affected_rows() 替换为 INSERT/UPDATE/DELETE 语句。
您也可以使用 SQL Management Studio 检查 T-SQL 语句。
关于$scrollable
属性。你是对的 sqlsrv_num_rows() 需要客户端(缓冲)、静态或键集游标,如果你使用前向游标或 return FALSE
一个动态游标。但这不能成为您出错的原因,因为 class CI_DB_sqlsrv_driver
的 $scrollable
成员具有默认值 FALSE
或 SQLSRV_CURSOR_CLIENT_BUFFERED
,并且 num_rows()
class CI_DB_sqlsrv_result
的成员似乎没有引发错误。
找到问题了!显然,sqlsrv 驱动程序似乎没有将双引号字符串转换为单引号。所以:
$tmp = 'SELECT * FROM tmpTable WHERE tmpName="test"';
执行此查询时返回错误,Codeigniter 将其评估为 FALSE。我在两个不同的实例中得到了相同的应用程序,一个是 PHP5.6,另一个是 PHP7.2。对于 PHP5.6(不同的驱动程序)实例,我没有这个问题,只有 PHP7.2 和 sqlsrv 驱动程序。我假设 5.6 converts
的驱动程序
$tmp = 'SELECT * FROM tmpTable WHERE tmpName="test"';
到
$tmp = "SELECT * FROM tmpTable WHERE tmpName='test'";
我在一个应该 return 多行的简单查询中收到以下错误:
Type: Error
Message: Call to a member function num_rows() on boolean
Filename: /var/www/cfc-dev/docroot/project/system/database/DB_query_builder.php
Line Number: 1428
我正在使用 Codeigniter 3.1.9。我最近开始使用 PHP7.2 和 sqlsrv 驱动程序连接到 MSSQL 数据库。
在其他一些 post 中,有人提到应将可滚动设置为不同于 SQLSRV_CURSOR_FORWARD 的选项,因此我转储 $this- 的值>scrollable in sqlsrv_driver.php 发现它的值是buffered
/**
* 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() 的查询都没有问题。 谢谢
您所有的 SELECT
查询都可以使用您的方法,但我猜您也在执行 UPDATE
或 INSERT
或 DELETE
或者使用相同的方法方法,在这些情况下你应该使用 $this->db->affected_rows()
您可以在
测试计数行的其他方法。 $query->count_all_results();
或 $query->affected_rows();
没有实际源代码总是很难回答,但这些解释可能对您有所帮助。
您收到的错误(我希望我们谈论的是相同的 CodeIgniter 版本)在 public 函数 count_all_results($table = '', $reset = TRUE)
中,当 if ($result->num_rows() === 0)
被执行时。
-> 语法是访问对象上的 property/method。在布尔值上使用它只会触发错误。变量 $result
保存 $this->query()
函数的 return 值。
当“READ”类型查询为 运行 时,query()
函数 return 是一个数据库结果对象,您可以使用它来显示结果。
当“WRITE”类型查询是 运行 时,它只是 returns TRUE
或 FALSE
取决于成功或失败。
您可以尝试在 $result->num_rows()
调用之前回显 $result
以查看实际值。
所以,出现这种错误的可能原因可能是执行了INSERT/UPDATE/DELETE语句或者错误的T-SQL语句。 尝试将 count_all_results() with affected_rows() 替换为 INSERT/UPDATE/DELETE 语句。 您也可以使用 SQL Management Studio 检查 T-SQL 语句。
关于$scrollable
属性。你是对的 sqlsrv_num_rows() 需要客户端(缓冲)、静态或键集游标,如果你使用前向游标或 return FALSE
一个动态游标。但这不能成为您出错的原因,因为 class CI_DB_sqlsrv_driver
的 $scrollable
成员具有默认值 FALSE
或 SQLSRV_CURSOR_CLIENT_BUFFERED
,并且 num_rows()
class CI_DB_sqlsrv_result
的成员似乎没有引发错误。
找到问题了!显然,sqlsrv 驱动程序似乎没有将双引号字符串转换为单引号。所以:
$tmp = 'SELECT * FROM tmpTable WHERE tmpName="test"';
执行此查询时返回错误,Codeigniter 将其评估为 FALSE。我在两个不同的实例中得到了相同的应用程序,一个是 PHP5.6,另一个是 PHP7.2。对于 PHP5.6(不同的驱动程序)实例,我没有这个问题,只有 PHP7.2 和 sqlsrv 驱动程序。我假设 5.6 converts
的驱动程序$tmp = 'SELECT * FROM tmpTable WHERE tmpName="test"';
到
$tmp = "SELECT * FROM tmpTable WHERE tmpName='test'";