2010-10-11 82 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這是一個整數值,它將避免在插入時使用單引號。