ADOdb和MSSQL的问号问题

时间:2016-03-31 14:55:07

标签: php sql-server adodb-php

我遇到了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库的已知限制吗?在执行查询之前,我是否必须检查每个字段并替换未用作占位符的问号,或者我遗漏了什么?

2 个答案:

答案 0 :(得分:1)

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

如果你无法切换驱动程序(或者这样做并不能解决问题)我认为你必须忍受这个bug并将静态字符串作为参数传递,转而这样:

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

......进入这个:

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

答案 1 :(得分:0)

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

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