2010-02-18 58 views
2

剛纔我看到下面的代碼,但不明白爲什麼「,也有」使用。謝謝!PHP逃避問題

$sql='SELECT uid,name FROM users WHERE user="'.mysql_real_escape_string($_POST['login_name']).'" AND .. 

回答

2

這是一個PHP程序編寫一個SQL查詢(並將其存儲在一個字符串。)

目標SQL看起來是這樣的:

SELECT uid,name FROM users WHERE user="something" AND … 

所以在PHP方面:

$foo = 'SELECT uid,name FROM users WHERE user="something" AND …' 

但是你想用動態數據替換「某物」。在這種情況下,發佈的login_name - 但對MySQL安全。

$foo = 'SELECT uid,name FROM users WHERE user="' . 
     mysql_real_escape_string($_POST['login_name']) . 
     '" AND …' 

更好的方法是使用prepared statements

0

看起來像被用於PHP代碼如何形成的單引號查詢和雙引號是用於查詢本身

More on Single/Double quotes

可以隨時呼應了$ sql中值看單/雙引號執行SQL對一個數據庫之前的外觀。

類似:

$sql='SELECT uid,name FROM users WHERE 
user="'.mysql_real_escape_string($_POST['login_name']).'"; 

// Print the SQL 
echo $sql."<br />"; 
3

不應該有。

「正確的」 $sql可能是這樣的:

$sql="SELECT uid,name FROM users WHERE user='".mysql_real_escape_string($_POST['login_name'])."'; 

您在SQL中使用'說這是一個字符串/文字。

我建議你看看prepared statements,我不信任mysql_real_escape_string也不mysql_very_real_seriously_this_is_the_real_escape_string,即php-syndrome不信任。

+1

他應該使用PDO。 – 2010-02-18 13:11:09

+0

是的,這可能是理解準備好的狀態動物之後的一個自然步驟..不是嗎? – 2010-02-18 13:22:16

0

的「將字面上包含在最終的MySQL的請求,以便請求發送到MySQL數據庫將是:

SELECT uid,name FROM users WHERE user="loginname" AND .. 
2

單引號圍繞SQL語句(「SELECT ...」),雙引號括住字段「用戶」的數據(儘管我會用相反的方式使用引號)。

查詢會是這個樣子(使用單引號):

SELECT uid FROM users WHERE user='snake' 

爲此查詢分配給變量$ sql中,你必須放在引號,使用雙引號這個時候,所以PHP不承擔,該字符串之前「蛇」結尾:

$sql = "SELECT uid FROM users WHERE user='snake'"; 

正如你不會總是被要求「蛇」靜態,你交換「蛇」與動態的名字,退出/再次使用雙引號輸入$ sql-string:

$sql = "SELECT uid FROM users WHERE user='" . $dynamic . "'"; 

如果您只想要一種類型的引號,則必須轉義括住用戶字符串的引號。

0

單引號用於在PHP中定義您的字符串。雙擊在你的SQL查詢中分隔你的文本字段(login_name)。

這樣做是爲了避免轉義查詢的引號(如果使用相同的話)。

0

你可以使用單引號或雙引號在php中包裝字符串。但是,有差異。

使用單引號字符串,不能內聯變量(例如:$a = 'hi $name'),也不能轉義字符(例如:$a = 'hi!\n$name')。

這裏是一個很好的總結:http://www.jonlee.ca/php-tidbit-single-quotes-vs-double-quotes/

同樣在一個側面說明..不知道如果雙引號應該用於SQL字符串包圍。我相信你應該在大多數數據庫中使用單引號。

+0

是的,雙引號是不可移植的,即MS Sql Server使用「字段」來指示字段/表名(MySQL使用'field')。但是,因爲這是PHP,它可以適用於MySQL數據庫,而不是書面的vor可移植性,所以這應該不重要。 – dbemerlin 2010-02-18 13:12:37