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 查询都可以使用您的方法,但我猜您也在执行 UPDATEINSERTDELETE 或者使用相同的方法方法,在这些情况下你应该使用 $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 TRUEFALSE 取决于成功或失败。 您可以尝试在 $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 成员具有默认值 FALSESQLSRV_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'";