2014-10-19 41 views
2

爲什麼我看到在MySQL查詢的幾個例子語法:PHP - 圍繞在MySQL變量單引號通過PHP查詢

$q = "CREATE TABLE '$tablename' ('$t_id_name')"; 

或類似的東西來呢?我在詢問有關變量名稱的單引號。這是需要在MySQL字符串?如果我回顯字符串,它似乎擴大了引號是否存在的變量。

如果這樣做是爲了一個整數的東西,這會造成一個問題嗎?

+1

停止將它們視爲變量名稱,只是因爲您在代碼中使用了變量;這是你正在構建的MySQL聲明。使用反引號('),而不是單引號(')來封裝MySQL中的表和列名稱(儘管如果它們是MySQL保留字,混合大小寫或使用非字母數字字符,您只需要它們) – 2014-10-19 21:19:14

回答

3

要回答你的問題,引號是必要的,但不是擴大變量。一個典型的SQL查詢應該是這樣的:

$q = "SELECT * FROM `table` WHERE `first_name` = 'user3475234'"; 

現在,請看下面的例子:

<?php 
$tablename = "users"; 
$user = "user3475234"; 

$q = "SELECT * FROM `$tablename` WHERE `first_name` = '$user'"; 

echo $q; 

這將顯示:SELECT * FROM `users` WHERE `first_name` = 'user3475234'。請注意,引號不必輸出字符串,但它們是查詢的必要部分。

這就是說,像這樣的代碼將您的腳本打開SQL注入。我不會解釋太多,因爲有大量資源在討論它,但請考慮用戶名爲user3475234' OR 1==1--的示例。此用戶名將有效地返回表中的所有用戶。

+0

我很好奇是否你有意地分別輸入'和'?有沒有優先使用一個或者他們都只是應該只是普通的單引號?此外,我現在正在使用mysqli_real_escape_string來避免隨此附帶的SQL注入(但我不認爲它會檢查「字符」)。 – user3475234 2014-10-19 21:43:44

+1

反引號用於表名和列名,並且僅當表或列名是預留的MySQL關鍵字時才需要。另一方面,價值觀被引號包圍。 – 2014-10-19 21:55:20

2

如果字段或表名與mysql命令相同,則必須使用反引號(`)作爲字段或表名。你需要使用單引號(')作爲價值。