我遇到了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库的已知限制吗?在执行查询之前,我是否必须检查每个字段并替换未用作占位符的问号,或者我遗漏了什么?
答案 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提交问题,看看是否可以在驱动程序中解决此问题