2017-02-22 95 views
0

我試圖執行一個腳本來更新數據庫的工作原理:SQL語句失敗,但在命令行

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執行失敗:您的SQL語法錯誤; 檢查對應於您MariaDB的服務器版本 在1號線附近使用「[0]」在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]); 

這樣,你避免代碼注入的風險,隨時隨地的表達被允許在SQL語法,你需要prepare一次爲許多不同的execute電話

佔位符是有效的。這意味着,例如,您不能爲表名提供佔位符,因爲您無法在普通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