2016-10-07 2 views
-1
use DBI; 

my $jobID = 1; 

$dbh = DBI->connect("dbi:mysql:$database:$db_server", $user, $password) or die "Connection ERROR!"; 
$dbh->do('USE MultiRunScheduler'); 
$dbh->do('UPDATE Scheduler SET RequestStatus="CANCELED" WHERE ID="$jobID";') 
print "Scheduled Jobs deleted"; 

Я пытаюсь изменить RequestStatus поля базы данных, основанные на ID, но она не работает через UPDATE заявления. Он печатает Scheduled Jobs deleted, и вся программа работает успешно, но не обновляет базу данных RequestStatus. Если я удалю ID="$jobID" и изменим его на ID=1, тогда запись в базе данных изменится на RequestStatus.UPDATE запрос не работает в DBI

Любая идея, как обойти это?

ответ

2

Perl не расширяет переменные внутри строк с одной кавычкой.

http://perldoc.perl.org/perldata.html#Scalar-value-constructors в частности, говорится:

Строковые литералы обычно разделяются одинарные или двойные кавычки. Они работают так же, как кавычки в стандартных оболочках Unix: строковые литералы с двойными кавычками подвержены обратной косой чертой и замене переменных; одиночные кавычки не являются (кроме \ 'и \).

Также вы должны использовать одиночные кавычки для строковых разделителей внутри вашего SQL.

Так что:

$dbh->do('UPDATE Scheduler SET RequestStatus="CANCELED" WHERE ID="$jobID";') 

Должно быть так:

$dbh->do("UPDATE Scheduler SET RequestStatus='CANCELED' WHERE ID='$jobID'"); 

Если вы действительно хотите использовать лучшие методы, параметры использования привязки в вашем SQL вместо того, чтобы переменные внутри строки. Тогда вам не нужно беспокоиться о том, какие котировки вы используете. Даже если этот параметр является строковым типом, вы не помещаете его в кавычки в SQL.

Пример:

$dbh->do("UPDATE Scheduler SET RequestStatus='CANCELED' WHERE ID=?", undef, $jobID); 
+1

Это сработало, и я буду держать эту концепцию в виду! Большое спасибо! –

Смежные вопросы