【问题标题】:Question mark issue with ADOdb and MSSQLADOdb 和 MSSQL 的问号问题
【发布时间】:2016-03-31 14:55:07
【问题描述】:

我遇到了 ADOdb 的 PHP 库 (https://sourceforge.net/projects/adodb/) 和 MSSQL Server 2012 的问题

我正在使用占位符做一个简单的更新语句,就像这个一样,但它失败了,说我没有给 Execute 函数提供足够的参数:

UPDATE report SET custom='Is this ok?' WHERE ID = ?

我检查了 adodb-mssql.inc.php 并在 Prepare 函数中简单地替换了每个 ?使用 MSSQL 的 @P 语法,而不是检查什么是占位符,什么不是:

function Prepare($sql)
{
    $sqlarr = explode('?',$sql);
    if (sizeof($sqlarr) <= 1) return $sql;
    $sql2 = $sqlarr[0];
    for ($i = 1, $max = sizeof($sqlarr); $i < $max; $i++) {
        $sql2 .=  '@P'.($i-1) . $sqlarr[$i];
    }
    return array($sql,$this->qstr($sql2),$max,$sql2);
}

所以在我的查询中,我得到了 2 个 @P 参数(引号内的 @P0(不用作占位符),@P1 作为真正的占位符),导致已经说过的错误,因为我只给了 Execute 函数 1 参数替换而不是两个。

这是 ADOdb 库的已知限制吗?在执行查询之前,我是否必须检查每个字段并将未用作占位符的问号替换为不同的内容,还是我遗漏了什么?

【问题讨论】:

  • 这是无限工具的一个已知限制,这些工具使用哑字符串替换来模拟准备好的语句。但这看起来太糟糕了,不可能是真的。您确定您已获取最新版本吗?
  • 5.18,现在升级到 5.20 只是为了测试这个问题是否得到了某种修复,但是 Prepare 功能在两个版本中看起来都一样。编辑:升级到 5.20,同样的问题:警告:mssql_query():消息:必须声明标量变量“@P1”。

标签: php sql-server adodb-php


【解决方案1】:

我一直是browsing the code。这个库非常过时(它是为 PHP/4 编写的!)而且 mssql 驱动程序特别糟糕。如果您可以使用 PDO 或 SQLSRV 驱动程序(至少它们似乎使用本机准备好的语句),您可能会有更好的运气,但我猜它是一个现有的遗留应用程序,或者您一开始就不会使用这样的库。

如果您无法切换驱动程序(或者这样做并不能解决问题),我认为您将不得不忍受这个错误并将静态字符串作为参数传递,这样可以:

$sql = "UPDATE report SET custom='Is this ok?' WHERE ID = ?";

...进入这个:

$sql = "UPDATE report SET custom = ? WHERE ID = ?";

【讨论】:

    【解决方案2】:

    除非您尝试通过 FreeTDS 或类似方式访问数据库,否则您使用的驱动程序错误。您应该使用最初由 Microsoft 提交给项目的 mssqlnative ADOdb 驱动程序。

    如果您仍然遇到问题,您应该在Github 提交问题,看看是否可以在驱动程序中解决此问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-27
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多