2

我刚刚将我的服务器从 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

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

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

谢谢

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

所以这有效:

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

1 回答 1

0

插入 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 这是一个整数值,它将在插入时避免使用单引号。

于 2011-11-26T08:12:37.310 回答