首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ADOdb和MSSQL中的问号问题

问ADOdb和MSSQL中的问号问题
EN

Stack Overflow用户
提问于 2016-03-31 14:55:07
回答 2查看 544关注 0票数 1

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

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

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

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

代码语言:javascript
复制
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库的一个已知限制吗?在执行查询之前,我是否必须检查每个字段并将未用作占位符的问号替换为不同的位置,还是遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-31 15:20:41

我曾经是浏览代码。这个库非常过时(它是为PHP/4编写的!)而且mssql驱动程序特别糟糕。如果您可以使用PDO或SQLSRV驱动程序(至少它们似乎使用本机准备的语句),那么您可能会更幸运,但我想这是一个现有的遗留应用程序,否则您一开始就不会使用这样的库。

如果您不能切换驱动程序(或者这样做并不能解决问题),我认为您将不得不接受这个错误,并将静态字符串作为参数传递,然后转到下面的代码:

代码语言:javascript
复制
$sql = "UPDATE report SET custom='Is this ok?' WHERE ID = ?";

..。这方面:

代码语言:javascript
复制
$sql = "UPDATE report SET custom = ? WHERE ID = ?";
票数 1
EN

Stack Overflow用户

发布于 2016-05-24 23:39:14

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

如果您仍然有问题,您应该在Github提交一个问题,看看这个问题是否可以在驱动程序中解决。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36336945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档