У меня есть код, подобный следующему:
$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 () без изменений.