Ошибка PDO FreeTDS - PullRequest
       21

Ошибка PDO FreeTDS

2 голосов
/ 11 октября 2010

Я только что обновил свой сервер с 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]: недопустимый номер параметра: число связанных переменных не соответствует количеству токенов

Кажется, работаетправильно, если я удалю символ N перед параметром.Тем не менее, у меня есть тысячи подобных заявлений, и было бы трудно убрать их.Я предпочел бы выяснить, почему это происходит, и исправить это.

Есть идеи, как заставить эту работу работать?

Спасибо

Позже отредактировать: благодаря тому, что все еще ниже, я нашелиспользование неназванных параметров (вопросительный знак) работает.Но это все еще оставляет меня с большим количеством утверждений.

Так что это работает:

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

1 Ответ

0 голосов
/ 26 ноября 2011

INSERT INTO IP (IP, PosterId, Note, DateAdded, Status, IsClass) ЗНАЧЕНИЯ (: ip,: posterid, N: note, GETUTCDATE (),: status,: isclass)

Прежде всего, когда вы используете подготовленное утверждение, PDO обычно будет выглядеть так. $ STM-> bindParam ( ': отметить', $ примечание); $ STM-> Execute ();

когда PDO смотрит на этот параметр, он обычно запускает ваш параметр через безопасный анализатор вставки, такой как mysql_escape_string (), и помещает одинарные кавычки вокруг вашего значения, так что ... N: note превращается в N'somevalue. Обычно, когда вы вставляете токены, они полностью независимы от любых других специальных символов и дополняются пробелами или символами табуляции. Возможно, вы захотите избегать использования именованных параметров, это может помочь, но может показаться необычным иметь вставку, такую ​​как N'somevalue, если вы не говорите PDO, что это целочисленное значение, которое будет избегать использования одинарных кавычек при вставке.

...