PHP MSSQL num_rows()无法与Codeigniter中的sqlsrv驱动程序一起使用

时间:2018-07-23 19:17:13

标签: php sql-server codeigniter pdo sqlsrv

我在一个简单的查询中遇到以下错误,该查询应该返回许多行:

  

类型:错误

     

消息:在布尔值上调用成员函数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()的查询都可以。 谢谢。

4 个答案:

答案 0 :(得分:0)

您所有的SELECT查询都可以使用您的方法,但是我想您也正在执行UPDATEINSERTDELETE或其他使用相同方法的查询,在这种情况下,您应该改用$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”类型查询时,它仅根据成功或失败返回TRUEFALSE。 您可以尝试在调用$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_driverFALSE,而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'";