2015-09-06 29 views
0

在PHP函數中,$ time變量應該在mySQL數據庫中更新。 嘗試和錯誤使用單引號和雙引號我結束了這個工作任務後:在PHP語句中引用混淆PHP變量

$result = db_con->exec('UPDATE settings SET time = "'.$time.'" WHERE id = 1'); 

在Exec的功能我使用單引號的SQL語句。爲什麼現在必須使用這個已編纂的"'. $time .'"雙/單引號組合來使SQL接受PHP變量?

這似乎對我來說,有這個大的混亂。 在這個問題上的任何明確的答案?

+1

像這樣連接SQL查詢並等待SQL注入。你不能使用參數綁定? – lad2025

+0

@ lad2025你完全正確。這只是開發測試中的一個例子,讓事情變得簡單。不管怎麼說,還是要謝謝你。 – Ben

+0

'$ result = db_con-> exec('UPDATE settings SET time ='$ time'WHERE id ='1');'這個也可以工作,只是說。 – user5173426

回答

1

第一雙引號是MySQL的字符串,因爲字符串應該在引號/雙引號和其他單引號逃脫出來的PHP字符串和PHP變量拼接到它。但爲什麼不使用雙引號的PHP字符串?

+0

這個答案最適合我,所以我接受這個答案。其他的也很好,因爲它們給資源提供了很好的提示。我可以接受多個答案嗎? – Ben

+0

不客氣。不,你不能:) –

0

混淆在於你對字符串文字的理解。 在PHP中,可以使用單引號''或雙引號「」來表示字符串,但它們並不意味着相同。

請參考PHP String doc的解釋。

在你的情況下,你在單引號選擇詞組您的字符串(查詢語句)。但是,恰巧,您的查詢將討論MySql字符串(包含時間的字符串,該時間必須作爲字符串傳遞給MySql引擎)。

因此,你必須附上的時間表達,在引號。通常這應該是單引號(請參閱MySql文檔)。然而MySQL接受雙引號,這樣你的查詢可以是這樣的:

update settings set time = "2015-09-06" 

所以,很顯然,這給你在你的初始查詢。

然而,正如@ lad2025說,這是絕對的不好的做法,無法逃脫你的$時間參數(或使用PARAM綁定)。

0

有點多餘:但是,你不會有這個問題(和更清晰的代碼)與prepared statements and bound variables

你的實際問題是在那裏使用字符串連接,當你可以只使用string interpolation。使用雙引號來減少句法解決方法:

       variables work right there 
              ↓ 
xyz_query("UPDATE settings SET `time`='$time' WHERE id=1"); 
      ↑       ↑  ↑ 
     dbl quote     literal quotes 

更具可讀性。

你在別處經常看到的傻瓜'".字符串連接變體只是源於過時的(和錯誤的)微優化hogwash和教程。

+0

你的建議確實更具可讀性。但是由於任何原因,它不適合我。我會再試一次。 – Ben