2012-02-01 374 views
3

例如,檢查以下查詢;大括號{}在SQL查詢中做了什麼?

$query = "SELECT * FROM users WHERE user='{$_POST['username']}'; 

有什麼用?

在字符串上下文中,我確實理解它解決的問題。
我可以做類似 $ animal =「cat」 echo「{$ animal} s」。 //輸出貓

但在上面發佈的SQL中,我只是不明白。 以下不會同樣好嗎?

$query = "SELECT * FROM users WHERE user='$_POST['username']' AND password='$_POST['password']'"; 

那麼,哪裏使用{和}會得心應手?欣賞SQL環境中的任何示例?

+0

你應該用另一種編程語言標記這個 - php? – Blorgbeard 2012-02-01 23:04:02

+0

您的查詢是與其他任何字符串一樣的字符串。唯一的區別是你的數據庫引擎可以做一些有用的事情。 – Arjan 2012-02-01 23:10:54

+0

@Arjan ..嘿..什麼? – Ben 2012-02-01 23:17:14

回答

8

http://www.php.net/manual/de/language.types.string.php#language.types.string.parsing爲雙引號字符串語法。

花括號用於複雜的變量表達式。它們由PHP解釋,而不是由SQL接口解釋。

$query = "SELECT * FROM users WHERE user='$_POST['username']' AND password='$_POST['password']'"; 

以上將導致解析錯誤。沒有花括號,你必須寫:

$query = "SELECT * FROM users WHERE user='$_POST[username]' AND password='$_POST[password]'"; 

注意缺乏關鍵引號。這隻適用於簡單的數組訪問,以及簡單的對象屬性表達式。對於任何更復雜的事情,請使用大括號。


現在你知道了,做一個小指頭髮誓,你永遠不會這樣做。由於直接插入用戶輸入不是一個好主意。 http://bobby-tables.com/

爲自己做個忙,並使用PDO with prepared statements所以要容易得多。


但舉個例子用於更復雜的花串的語法,這是我會怎麼做:

$query = "SELECT * FROM users WHERE user={$_POST->id->sql['username']}"; 

(做了一些在線過濾和引用正如例如,不起作用。與默認的PHP設置)。

+1

此外,大括號也可能會阻止PHP將太多字符解釋爲變量名稱。例如,如果您有'$ var'和'$ var2':'print「$ var_and_var2」將不起作用,您需要使用'print「{$ var} _and _ {$ var2}」'(... Or使用'printf()'或字符串連接...) – Carpetsmoker 2012-02-01 23:13:35

+1

[解析錯誤的例子](http://codepad.org/8qmdaBYy)。 – cmbuckley 2012-02-01 23:17:41

+0

PDO的+1 ..... – CountMurphy 2012-02-01 23:32:54

1

PHP無法直接在字符串中轉換字典項目。你必須這樣做:

query = "SELECT * FROM users WHERE user='" . $_POST['username'] . "' AND password='" . $_POST['password'] . "'"; 

的curlybrackets是其他的方式來寫這篇文章沒有concating串像我舉的例子