【问题标题】:PDO FreeTDS errorPDO FreeTDS 错误
【发布时间】:2010-10-11 15:31:18
【问题描述】:

我刚刚将我的服务器从 php 5.2 升级到 5.3.3,我在 PDO(使用 DBLIB)中遇到了一个奇怪的错误。

我正在连接到 SQL Server 2005。我遇到错误出现在任何以“N”字母作为参数前缀的语句中(告诉 SQL Server 这是一个 unicode 字符串)。

查询如下所示:

INSERT INTO IPs (IP, PosterId, Note, DateAdded, Status, IsClass)
VALUES (:ip, :posterid, N:note, GETUTCDATE(), :status, :isclass)

用于在旧设置上正常工作,新设置抛出异常:
SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens p>

如果我删除参数前面的 N 字符,似乎可以正常工作。但是,我有成千上万这样的陈述,删除它会很痛苦。我宁愿找出发生这种情况的原因并解决它。

知道如何进行这项工作吗?

谢谢

后来编辑:感谢仍然站在下面,我发现使用非命名参数(问号)有效。但它仍然让我改变很多陈述。

所以这行得通:

INSERT INTO IPs (IP, PosterId, Note, DateAdded, Status, IsClass)
VALUES (?, ?, N?, GETUTCDATE(), ?, ?)

【问题讨论】:

  • 你最好使用问号参数而不是命名参数。 : 搞砸了 PHP 对命名参数的解释。

标签: php sql-server pdo freetds


【解决方案1】:

插入 IP(IP、PosterId、Note、DateAdded、Status、IsClass)值(:ip、:posterid、N:note、GETUTCDATE()、:status、:isclass)

首先,当您使用准备好的语句时,PDO 通常看起来像。 $stm->bindParam(':note',$note); $stm->执行();

当 PDO 查看此参数时,它通常会通过安全插入解析器运行您的参数,例如 mysql_escape_string() 并将单引号放在您的值周围,所以... N:note 变成 N'somevalue' 通常,当您插入标记时,它们完全独立于任何其他特殊字符并用空格或制表符填充。您可能会考虑避免使用命名参数,这可能会有所帮助,但插入 N'somevalue' 似乎有点不寻常,除非您告诉 PDO 这是一个整数值,它将在插入时避免使用单引号。

【讨论】:

    猜你喜欢
    • 2015-04-06
    • 2017-05-10
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 2017-10-29
    • 2017-03-31
    • 2014-04-09
    相关资源
    最近更新 更多