2010-10-11 83 views
2

我刚刚将我的服务器从php 5.2升级到5.3.3,并且在PDO(使用DBLIB)时出现了一个奇怪的错误。PDO FreeTDS错误

我正在连接到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]:无效的参数编号:绑定变量的数目不不匹配令牌数量

似乎正常工作,如果我删除参数前的N字符。但是,我有这样的成千上万的陈述,这将是一个痛苦的去除。我宁愿找出为什么发生这种情况并修复它。

任何想法如何使这项工作?

感谢

后来编辑:多亏了下面stillstanding,我发现,使用非命名参数(问号)的作品。但它仍然让我发表了很多陈述。

所以此工程:

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

您可能会更好地使用问号参数代替命名参数。 The:搞砸了PHP对named参数的解释。 – stillstanding 2010-10-11 15:55:50

回答

0

INSERT INTO IP地址(IP,PosterId,注意,DateAdded,状态,IsClass)VALUES(:IP,:posterid,N:注意,GETUTCDATE():状态,:isclass)

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

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