2011-08-29 116 views
1

使用單引號VS有什麼區別。在整個SQL查詢中使用雙引號?PHP - 單引號或雙引號SQL查詢?

哪個更好:

這種方法(單引號):

$username = mysql_real_escape_string($username); 
    $password = mysql_real_escape_string($password); 

    $sql = 'SELECT * FROM users WHERE username = "' . $username . '" AND password = "' . $password . '" LIMIT 1'; 

或者這種方法(使用雙引號):

$username = mysql_real_escape_string($username); 
    $password = mysql_real_escape_string($password); 

    $sql = "SELECT * FROM users WHERE username = '{$username}' AND password = '{$password}' LIMIT 1"; 

有沒有什麼更好的方法來做到這一點?

對我來說,我喜歡第一種方法,因爲我總是比較喜歡PHP中的單引號。所以我想確保在整個SQL查詢周圍使用單引號是確定的,並且圍繞變量或數據使用雙引號是可以的,並且是跨平臺的,並且可以用於MySQL以外的數據庫!

+0

我可能會誤會,但我記得插值(你的第二種方法)比連接(你的第一種)更快 – Phil

+3

由於[SQL注入攻擊](http://xkcd.com/327/)的易感性, 。強烈建議PDO或準備好的聲明。 –

+0

@OMG小馬:即使他們使用'mysql_real_escape_string'? – icktoofay

回答

9

使用PDO而不是這些方法之一。它將允許您使用參數而不是字符串。

$sth = $dbh->prepare('SELECT * FROM users WHERE username = :username AND password = :password LIMIT 1'); 
$sth->bindParam(':username', $username, PDO::PARAM_STR); 
$sth->bindParam(':password', $password, PDO::PARAM_STR); 
$sth->execute(); 

順便說一句,請確保您沒有在純文本中同時使用密碼。

+0

感謝您的回答。有一件事,你能向我解釋你的意思是「確保你沒有同時使用純文本密碼」嗎?我不明白你的意思(也許是因爲我太困了,腦子幾乎停止思考!)。 – XO39

+1

@Amir Raminfar:感謝您編輯鏈接。 – XO39

+0

@ XO39,您提供的示例暗示您以人們輸入密碼的方式存儲密碼。這不好!你不應該以純文本存儲密碼。您應該始終通過帶鹽的單向加密函數傳遞它們。所以如果有人訪問你的數據庫,你並沒有讓他們訪問所有地方的每個人的賬戶。請參閱:http://stackoverflow.com/questions/1581610/how-can-i-store-my-users-passwords-safely – acrosman

3

他們都同樣可怕。 :)忘記你曾經聽說過mysql_real_escape_string,並使用acrosman提到的PDO。具體看準備聲明:http://www.php.net/manual/en/pdo.prepare.php。這一點尤其重要,你甚至可以說:「是跨平臺的,可以用於MySQL以外的數據庫!」不是試圖以混蛋的形式出現,而是提示:調用以mysql_開頭的方法的代碼可能不是跨平臺的;)。然而,使用PDO,允許您使用Mysql以外的數據庫。當然,這裏有不同風格的sql的明顯警告,但至少你沒有不同的風格,如果你使用參數化查詢,那麼需要轉義的字符串。