2017-02-22 12 views
0

Я пытаюсь выполнить скрипт для обновления базы данных:SQL заявление терпит неудачу под Perl, но работает из командной строки

my $sql_hash_update = 'UPDATE user SET hash = $hash , updated = 1 WHERE id = $row[0]'; 
my $sth_hash_update = $dbh->prepare($sql_hash_update); 
$sth_hash_update->execute(); 

Я получаю ошибку, что это не правильный синтаксис, но это работает в самой SQL ,

DBD :: mysql :: st execute failed: У вас возникла ошибка в синтаксисе SQL; проверьте руководство, которое соответствует версии сервера MariaDB для правильный синтаксис для использования вблизи «[0]» в строке 1 на conexion.pl линии 32.

Любые идеи, что я делаю не так?

+0

Можете ли вы напечатать '$ sql_hash_update' и поделиться результатами с нами? Кроме того, если вы используете подготовленный оператор, зачем использовать подстановку переменных при построении SQL? – Mureinik

+0

@Mureinik Я сам получаю переменные. Я попытаюсь объединить переменные вместо их добавления, как если бы это был PHP. – prgrm

+0

@PathikVejani: Пожалуйста, удалите свой комментарий; это вводит в заблуждение. – Borodin

ответ

5

Вы используете одиночные кавычки, так это заявление

my $sql_hash_update = 'UPDATE user SET hash = $hash , updated = 1 WHERE id = $row[0]' 

не будет интерполировать значения $hash и $row[0] в оператор SQL. Вместо этого они будут оставлены, как они есть, и поэтому оператор не является допустимым SQL

Вы можете просто переключиться на двойные кавычки, которые действительно интерполиро-, но лучше всего использовать заполнители как это

my $sql_hash_update = 'UPDATE user SET hash = ?, updated = ? WHERE id = ?'; 

my $sth_hash_update = $dbh->prepare($sql_hash_update); 

$sth_hash_update->execute($hash, 1, $row[0]); 

Таким образом, можно избежать риска инъекции коды, и вы должны prepare только один раз для многих различных execute вызовов

заполнителей действительны везде, где выражение допускаются в синтаксисе SQL. Это означает, например, что вы не можете предоставить местозаполнитель для имени таблицы, потому что вы не могли поместить выражение там в обычный оператор SQL

1

Perl не интерполирует одинарные кавычки, поэтому $row[0] не расширяется. Вы хотите двойные кавычки.

Однако вы также должны передать $ row [0] в качестве параметра привязки.

Что-то вроде:

my $sql_hash_update = 'UPDATE user SET hash = ? , updated = 1 WHERE id = ?'; 
my $sth_hash_update = $dbh->prepare($sql_hash_update); 
$sth_hash_update->execute($hash, $row[0]); 
1

использовать двойные кавычки вместо одинарных кавычек

my $sql_hash_update = "UPDATE user SET hash = $hash , updated = 1 WHERE id = $row[0]"; 
+1

@Borodin Я думаю, вы думаете о четвертом ответе, который был удален. Это было совершенно неправильно. Этот ответ технически хорошо, лучше использовать заполнители в заявлении. – dgw

+1

@dgw: Возможно, вы правы. Спасибо что подметил это. – Borodin

+0

@Borodin Он работал для меня, одинарная кавычка рассматривала его как строку – PravinS