2

サーバーをphp5.2から5.3.3にアップグレードしたところ、PDO(DBLIBを使用)で奇妙なエラーが発生しました。

SQL Server 2005に接続しています。パラメータの前に「N」文字が付いているステートメントにエラーが表示されます(SQL Serverにユニコード文字列であることを通知するため)。

クエリは次のようになります。

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

古い設定で正しく機能するために使用され、新しい設定は例外をスローします
。SQLSTATE [HY093]:無効なパラメーター番号:バインドされた変数の数がトークンの数と一致しません

パラメータの前のN文字を削除すると、正しく機能するようです。しかし、私にはそのような何千ものステートメントがあり、それを取り除くのは苦痛でしょう。なぜこれが起こるのかを調べて修正したいと思います。

これを機能させる方法はありますか?

ありがとう

後で編集:以下に静止しているおかげで、名前のないパラメーター(疑問符)を使用すると機能することがわかりました。しかし、それでも多くのステートメントを変更する必要があります。

したがって、これは機能します。

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

1 に答える 1

0

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

まず、プリペアドステートメントを使用すると、PDOは通常次のようになります。$ stm-> bindParam(':note'、$ note); $ stm-> execute();

PDOがこのパラメーターを調べるとき、通常はmysql_escape_string()などの安全な挿入パーサーを介してパラメーターを実行し、値を一重引用符で囲みます。したがって... N:noteは通常N'somevalue'になります。トークンは、他の特殊文字から完全に独立しており、スペースまたはタブが埋め込まれています。名前付きパラメーターの使用を避けることを検討するかもしれませんが、これは役立つかもしれませんが、挿入時に一重引用符の使用を避ける整数値であるとPDOに指示しない限り、N'somevalue'などの挿入があるのはちょっと珍しいようです。

于 2011-11-26T08:12:37.310 に答える