【问题标题】:PHP MSSQL num_rows() not working with sqlsrv driver in CodeigniterPHP MSSQL num_rows() 不能与 Codeigniter 中的 sqlsrv 驱动程序一起使用
【发布时间】:2018-07-23 19:17:13
【问题描述】:

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

类型:错误

消息:在布尔值上调用成员函数 num_rows()

文件名: /var/www/cfc-dev/docroot/project/system/database/DB_query_builder.php

行号:1428

我正在使用 Codeigniter 3.1.9。我最近开始使用 PHP7.2 和 sqlsrv 驱动程序连接到 MSSQL 数据库。

在其他一些帖子中,有人提到应该将可滚动设置为不同于 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() 的查询都很好。 谢谢。

【问题讨论】:

  • 您的查询具体是什么?谢谢!
  • 如果您发布查询和失败的代码会很有帮助。从错误消息看来,查询失败了。

标签: php sql-server codeigniter pdo sqlsrv


【解决方案1】:

您的所有SELECT查询都可以使用您的方法,但我想您也在执行UPDATEINSERTDELETE 或使用相同的方法,在这些情况下您应该使用@ 987654326@

您可以在here 中查看参考。还有更多代码和查询示例会非常好。

【讨论】:

    【解决方案2】:

    测试计数行的其他方法。 $query->count_all_results();$query->affected_rows();

    【讨论】:

      【解决方案3】:

      如果没有实际的源代码,总是很难回答,但这些解释可能会对您有所帮助。

      当执行if ($result->num_rows() === 0) 时,您收到的错误(我希望我们讨论的是相同的 CodeIgniter 版本)在公共函数 count_all_results($table = '', $reset = TRUE) 中。 -> 语法是访问对象的属性/方法。在布尔值上使用它只会触发错误。变量$result 保存$this->query() 函数的返回值。 query() 函数在运行“READ”类型查询时返回一个数据库结果对象,您可以使用它来显示结果。 当运行“WRITE”类型查询时,它只返回TRUEFALSE,具体取决于成功或失败。 您可以尝试在调用 $result->num_rows() 之前回显 $result 以查看实际值。

      因此,出现此类错误的可能原因可能是执行了 INSERT/UPDATE/DELETE 语句或错误的 T-SQL 语句。 对于 INSERT/UPDATE/DELETE 语句,尝试将 count_all_results() 替换为 affected_rows()。 您也可以使用 SQL Management Studio 检查 T-SQL 语句。

      关于$scrollable 属性。你是对的,sqlsrv_num_rows() 需要客户端(缓冲)、静态或键集游标,如果你使用前向游标或将返回 FALSE 一个动态游标。但这不能成为您出错的原因,因为 $scrollableCI_DB_sqlsrv_driver 的成员具有默认值 FALSESQLSRV_CURSOR_CLIENT_BUFFERED,而 num_rows()CI_DB_sqlsrv_result 的成员似乎不会引发错误。

      【讨论】:

        【解决方案4】:

        发现问题!显然,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'";
        

        【讨论】:

          猜你喜欢
          • 2012-06-09
          • 1970-01-01
          • 2012-08-03
          • 2018-02-22
          • 2021-04-17
          • 2012-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多