LINUX.ORG.RU

Добавление данных в БД (mysql) при помощи перлового DBI


0

1
my $some_template = $dbh -> prepare ("insert into some_table (field1, field2, field3) values (?, ?, ?);");

и потом

$some_template -> execute ($var1, $var2, $var3);

Проблема: field1, field2, field3 имеют тип integer, а запрос в итоге формируется почему-то с кавычками, и перл ругается на синатксис:

DBD::mysql::st execute failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'values ('1', '26', '40', NULL, NULL, NULL, NULL, NULL)'

Вопрос: откуда кавычки и что с ними делать?

И в том ли ошибка синтаксиса, что возникли кавычки, или в том, что некоторые из переменных не инициализированы, и в запрос попадают NULL'ы?

★★★

Последнее исправление: pianolender (всего исправлений: 1)

Кавычки норм, сервер показывает, что ошибка начинается с values, а не с кавычек.

anonymous
()

На кавычки не смотри, MySQL скастует строки в числа если понадобится, проблема в другом.

Более того, prepare() и execute() не обязательно использовать для инсертов, иногда проще do().

Более того, терминатор запросов (точка с запятой) не обязательно использовать, запрос ведь один.

outtaspace ★★★
()

некоторые из переменных не инициализированы, и в запрос попадают NULL'ы

В некоторых DBI-драйверах это нормальное поведение, кастовать not defined в null. Судя по описанию ошибки, проблема не в приведении типа, а в синтаксисе запроса.

outtaspace ★★★
()
Ответ на: комментарий от Hater
$sh->bind_param(1, $date, SQL_DATE);
$sh->bind_param(2, $n, SQL_INTEGER);
$sh->execute()

А как-то покороче это записать можно? Сделать тот же бинд прямо в операции execute? что-то вроде такого:

execute ((SQL_DATE) date, (SQL_INTEGER) $n)
pianolender ★★★
() автор топика
Ответ на: комментарий от pianolender

В некоторых реализациях, в некоторых контекстах требует обрамлять кавычками ключевые слова. Видимо это не твой случай.

outtaspace ★★★
()

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

В общем, solved. Всем спасибо!

pianolender ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.