2009-11-05 2 views
1

Я пытаюсь запустить простой пример сценария perl dbi для подключения к базе данных mysql и внесения некоторых вставок.Perl DBI Ошибка MySQL Msg: Не удается вызвать метод «do» по неопределенному значению

Код:

#! bin/usr/perl -w 

use strict; 
use warnings; 

use DBI(); 
my $dbh = DBI->connect(
    "DBI:mysql:database=SPM;host=IP Address", "username", "password", 
    {'RaiseError'=>1} 
); 

my $dbh->do(
    'INSERT INTO payment_methods(name, description)VALUES(CASH, DOLLAR)' 
); 
my $dbh->disconnect(); 

Но когда я пытаюсь запустить это с помощью perl filename.pl я получаю следующее

Can't call method "do" on an undefined value at perldbi.pl line 12

Вот где я использовал do впервые.

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

+0

Использование -w на притон линии является излишним, если вы 'использовать warnings'. См. 'Perldoc perllexwarn' для получения дополнительной информации: http://perldoc.perl.org/perllexwarn.html – daotoad

+2

Плюс, более чем вероятно, строка shebang неверна. –

+0

Спасибо всем за то, что вы навели меня на этот вопрос. – Rachel

ответ

10

У вас есть дополнительный my:

my $dbh->do(
    'INSERT INTO payment_methods(name, description)VALUES(CASH, DOLLAR)' 
); 

Избавиться от этого my.

Вы либо на самом деле не warnings включен в сценарии или вы не обращая внимания на предупреждения:

#!/usr/bin/perl 

use strict; 
use warnings; 

my $x = 1; 
my $x = 2; 
C:\Temp> t 
"my" variable $x masks earlier declaration in same scope at ...
+1

+1 Хорошая находка, это просто слишком легко упустить! – Andomar

+1

Только нашел это, потому что я редактировал сообщение OP, чтобы избежать горизонтальной прокрутки. Моя ненависть к горизонтальной прокрутке наконец окупилась. –

+0

Спасибо, Синан, за то, что он направил меня с этой ошибкой. – Rachel

1

Ошибка подключения к вашей базе данных. Таким образом, $dbh не определено.

Обновление: Оба комментария являются правильными. У Синана есть правильный ответ - OP использует мою в каждой строке.

+1

Я ввожу правильное имя пользователя и пароль, поэтому не должно быть причин для подключения к базе данных. Что еще может вызвать подключение к базе данных? – Rachel

+3

Поскольку у него есть «RaiseError» => 1, не будет ли его программа умирать, если она не сможет подключиться? – Andomar

1

Как указано, ваш DBI->connect вызов не работает. Проверьте настройки подключения, посмотрите, можете ли вы подключиться к базе данных из командной строки и т. Д. В вашем скрипте Perl всегда проверяйте возвращаемое значение DBI->connect(), чтобы узнать, было ли соединение успешным.

my $dbh = DBI->connect("DBI:mysql:database=SPM;host=IP Address",...) 
      or die sprintf('connect() failed. Error: %s', DBI->errstr); 

my $dbh->do(q{ 
    INSERT INTO payment_methods(name, description)VALUES(CASH, DOLLAR) 
}); 
... 
+0

Я могу подключиться к базе данных из командной строки, но когда я попытаюсь сделать это из Perl Script, это дает мне вышеупомянутое сообщение об ошибке. – Rachel

+0

@Sinan - спасибо, мой DBI ржавый, и я забыл о 'DBI-> errstr' – mob

+0

@Ingel: вы имели в виду' "...; host = IP-адрес" или должны быть '" ...: host = IP-адрес ""? – mob

2

Я сомневаюсь, что это причина сообщения об ошибке, но значения в вставке, вероятно, не так:

VALUES(CASH, DOLLAR) 

, вероятно, следует:

VALUES(\'CASH\', \'DOLLAR\') 

В \ требуется потому что вы используете строку стиля '. Если вы используете строку " стиль вместо этого, вы можете оставить из \:

"... VALUES('CASH','DOLLAR')" 
+2

Для таких вещей были созданы заполнители. –