簡體   English   中英

反斜杠在mysql中是否轉義引號?

[英]Do backslashes escape quotes in mysql?

這是失敗的查詢的var_dump

string 'INSERT INTO event(name, description, location, image, datetime) VALUES('Nica\'s Weight Loss Class', 'Description goes here!', 'Location', 'Nica's Weight Loss Class.png', '2015-01-01T01:00')' (length=189)`

錯誤是

您的SQL語法有誤; 檢查與您的MySQL服務器版本相對應的手冊,以在'Weight Loss Class.png','2015-01-01T01:00')'附近使用正確的語法

創建查詢字符串的代碼行是:(所有變量都經過轉義)

$query = "INSERT INTO event(name, description, location, ".($imageForEvent?"image, ":"")."datetime) VALUES('$evName', '$evDescription', '$evLocation', ".($imageForEvent?"'".basename($imageForEvent)."', ":"")."'$evDatetime')";

根據mysql docs ,反斜杠字符用於轉義單引號。

但是, 如何在MySql中轉義撇號(')? ,正確的方法似乎是將引號加倍。

我已經測試了這兩種方式,並且它們在同一位置給出了相同的錯誤。 誰能闡明這個問題?

您僅轉義字符串中的第一個' 您擁有Nica's...兩個地方Nica's...但是您只是逃避了第一個。 第二個似乎是圖像名稱。 如果您堅持使用mysql_ *函數,則應該在查詢中的每個變量上使用mysql_real_escape_string 引號不是唯一需要轉義的字符,並且可以正確地將它們全部轉義。

但是,您真正應該做的是使用mysqli或pdo並將您的值綁定到查詢中。 mysql_ *函數已被棄用,將引發錯誤,並將在以后的版本中刪除。 避免他們。 綁定很容易做到,並且可以完全解決此問題,以至您永遠不必擔心它。

您的MySQL查詢本身是正確的。 由於單引號位於單引號中的字符串文字中,因此需要使用反斜杠將其轉義,以便將其解析為字符串文字的一部分而不是字符串文字的結尾。 您的第一個參考文獻MySQL文檔鏈接指出,您也可以使用兩個單引號來實現相同的目的。

但是,問題在於您可能將MySQL查詢作為字符串文字分配給了PHP變量(您在問題中共享的輸出僅來自var_dump,因此不清楚在何處分配SQL查詢)。 與MySQL類似,PHP要求您在單引號引起來的字符串文字中轉義單引號字符,否則它將被解釋為字符串文字的結尾。

為了使其正常工作,您需要轉義兩次。 一次用於PHP,然后一次用於MySQL:

$query = 'INSERT INTO event(name, description, location, image, datetime) VALUES('Nica\\\'s Weight Loss Class', 'Description goes here!', 'Location', 'Nica's Weight Loss Class.png', '2015-01-01T01:00')';

注意\\\\\\' 當PHP解釋該行並將查詢發送到MySQL時,它將為\\' ; 第一個\\\\轉義單個反沖。

UPDATE

OP已更新了問題。 SQL查詢的那一部分來自變量。 這是一種不好的做法,可能會導致許多問題,直至XSS漏洞利用。 最好將綁定與自動執行轉義的PDO或其他SQL庫一起使用。 然而,為了回答這個問題,通過運行你的變量addslashes會解決MySQL錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM