Postgres / PHP PDO :: PDOStatement-> bindParam () в символьное (1) поле - PullRequest
1 голос
/ 19 октября 2010

У меня есть код, подобный следующему:

$data['someField'] = (isset($_POST['someField'])) ? 'Y' : 'N';
$stmt = $db->prepare("INSERT INTO public.someTable (someField) VALUES (':someField');");
$stmt->bindParam(':someField', ($data['someField']), PDO::PARAM_STR, 1);
$db->beginTransaction();
$stmt->execute();
$db->commit();

Поле представляет собой символ (1), который содержит либо Y, либо N (я бы предпочел использовать bool / int (1), но я не могу изменить это, к сожалению). Как видите, это берет данные POST из HTML-формы и устанавливает Y или N на основе флажка. Переменная выглядит правильно установленной, когда я повторяю это. Запрос работает, если я вручную вставляю в оператор «Y» или «N», но при использовании bindParam () я получаю следующую ошибку:

SQLSTATE[22001]: String data, right truncated: 7 ERROR: value too long for type character(1)

Действительно странная вещь, даже если я делаю что-то вроде этого:

$stmt->bindParam(':someField', substr($data['someField'], -1), PDO::PARAM_STR, 1);

Я все еще получаю ошибку. Из комментариев пользователей на странице функций на php.net:

Steve M 19-Nov-2009 07:28 Обратите внимание, что при использовании PDOStatement :: bindParam an целое число заменено на строковое значение после PDOStatement :: execute (). (Испытано с MySQL).

Больше нет упоминаний об этом или о том, как обойти это. Я предполагаю, что это корень проблемы. Я также пытался использовать bindValue () без изменений.

1 Ответ

1 голос
/ 19 октября 2010

Нашел ответ для этой проблемы здесь: Проблема кодирования строки в PdoStatement-> bindParam ()?

В основном PDO автоматически экранирует параметр для вас, поэтому, когда я сделал запрос:

"INSERT INTO public.someTable (someField) VALUES (':someField');"

Как только PDO был сделан с ним, он в конечном итоге выглядел так:

"INSERT INTO public.someTable (someField) VALUES (''Y'');"

Правильное использование функции prepare ():

$stmt = $db->prepare("INSERT INTO public.someTable (someField) VALUES (:someField);");
...