ADOdb 和 MSSQL 的问号问题
Question mark issue with ADOdb and MSSQL
我 运行 遇到了 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 作为真正的占位符),导致已经说过的错误,因为我只给执行函数 1要替换的参数而不是两个。
这是 ADOdb 库的已知限制吗?在执行查询之前,我是否必须检查每个字段并将未用作占位符的问号替换为不同的内容,或者我是否遗漏了什么?
我去过 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 = ?";
除非您尝试通过 FreeTDS 或类似工具访问数据库,否则您使用了错误的驱动程序。您应该使用最初由 Microsoft 提交给项目的 mssqlnative ADOdb 驱动程序。
如果您仍然遇到问题,您应该在 Github 提交问题,以查看是否可以在驱动程序中解决此问题
我 运行 遇到了 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 作为真正的占位符),导致已经说过的错误,因为我只给执行函数 1要替换的参数而不是两个。
这是 ADOdb 库的已知限制吗?在执行查询之前,我是否必须检查每个字段并将未用作占位符的问号替换为不同的内容,或者我是否遗漏了什么?
我去过 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 = ?";
除非您尝试通过 FreeTDS 或类似工具访问数据库,否则您使用了错误的驱动程序。您应该使用最初由 Microsoft 提交给项目的 mssqlnative ADOdb 驱动程序。
如果您仍然遇到问题,您应该在 Github 提交问题,以查看是否可以在驱动程序中解决此问题