мой Mysql DBD вставка вызов неожиданно молча - PullRequest
2 голосов
/ 15 декабря 2011

use DBI ();

Что приводит к сбою этой вставки с ошибкой 1, вызов SELECT работает нормально, поэтому проблема не связана с учетными данными.

$dbh = DBI->connect("DBI:mysql:$dbname:$dbhost","$dbuser","$dbpass");
my $sth = $dbh->prepare( "INSERT INTO call_fields VALUES ( ?, ?, ?, ? )" ) or die print "$DBI:errstr";
$sth->execute( "NULL", 0, 0, "testing" ) or die print "er $DBI::errstr";

mysql ver 5.5 ЭтоPerl 5, версия 14, Subversion 1 (v5.14.1), построенная для MSWin32-x64

ПРИМЕЧАНИЕ. Этот синтаксис работает нормально:

$ dbh-> do (q / вставьте в значения call_fields (ноль, 0,0, "тестирование") /) или умри "$ dbh :: errstr";

Ответы [ 4 ]

6 голосов
/ 15 декабря 2011

Установите атрибут соединения RaiseError и разрешите DBI обрабатывать ошибки.

Значение SQL NULL представляется в Perl как undef, а не в кавычках NULL.

use strictures;
use DBI qw();
my $dbh = DBI->connect("DBI:mysql:$dbname:$dbhost", $dbuser, $dbpass, { RaiseError => 1 });
my $sth = $dbh->prepare('INSERT INTO call_fields VALUES ( ?, ?, ?, ? )');
$sth->execute(undef, 0, 0, 'testing');
4 голосов
/ 15 декабря 2011

Заявление

die print "$DBI:errstr";

подозрительно. Как отметил Алан Хаггай Алави в комментариях, вам не хватает двоеточия. Это должно быть $DBI::errstr. Кроме того, он отображает 1 в stdERR (не stdout), потому что вы связываете die с print. print возвращает 1 для успешной печати, которая возвращается к die и затем отображается.

Он также должен отображать print - в stdout - или, по крайней мере, предупреждение о неопределенном значении при печати, но если вы не используете use warnings, он будет довольно тихим. (Это может вывести :errstr.)

Итак:

die $DBI::errstr;

Должно улучшить вашу ситуацию. Добавление

use strict;
use warnings;

, если его еще нет, это еще больше улучшит его.

3 голосов
/ 15 декабря 2011

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

Я прокомментировал изменения, внесенные в каждую строку.

# Declared $dbh
# Removed unnecessary quote marks.
my $dbh = DBI->connect("DBI:mysql:$dbname:$dbhost", $dbuser, $dbpass);

# Removed unnecessary call to print
# Replaced $DBI::errstr with $sth->errstr
my $sth = $dbh->prepare( 'INSERT INTO call_fields VALUES ( ?, ?, ?, ? )' )
  or die $sth->errstr;

# Replaced string "NULL" with undef (which DBI treats as NULL)
# Removed unnecessary call to print
# Replaced $DBI::errstr with $sth->errstr
$sth->execute( undef, 0, 0, 'testing' ) or die $sth->errstr;

Я подозреваю, что удаление ненужных вызовов print и переключение "NULL" на undef действительно решит вашу проблему.

Кроме того, я настоятельно рекомендую а) установить флаг RaiseError при подключении к БД и б) добавить имена столбцов в оператор INSERT, а затем полностью удалить первый обнуляемый столбец из оператора.

2 голосов
/ 15 декабря 2011

Ошибка печати:

... or die print "er $DBI::errstr";

не выглядит правильно.

Как уже упоминал Алан, вы исправили двойное двоеточие, но вызов print, который выполняет die, возвращает 1. (1 == успешная печать ... где-то)

Измените синтаксис вашего кубика следующим образом:

... or die "er $DBI::errstr";

Вы должны получить что-то вроде этого:

er {DBI_ERROR_MESSAGE} at {Script_Name} line XXX.

Вы написали:

$dbh = DBI->connect("DBI:mysql:$dbname:$dbhost","$dbuser","$dbpass");
my $sth = $dbh->prepare( "INSERT INTO call_fields VALUES ( ?, ?, ?, ? )" ) or die print "$DBI:errstr";
$sth->execute( "NULL", 0, 0, "testing" ) or die print "er $DBI::errstr";

и еще один пример:

$dbh->do(q/insert into call_fields values(null,0,0,"testing") /) or die "$dbh::errstr";

Это сравнение "яблок и апельсинов".Первый делает вставку строки «NULL», а второй вставляет значение «null».

Я предполагаю, что ваша таблица call_fields, которая получает первое подготовленное входное значение, не принимает строки,и, следовательно, $ sth-> execute не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...