2012-12-07 34 views
0

我有我通過以下幾種運行後變量:PHP mysqli_real_escape_string問題

$input_name = mysqli_real_escape_string($dbc, trim($_POST['input_name'])); 

我已經運行幾個測試,我回聲$ input_name和其他類似變量插入查詢執行之前。回聲表明他們確實正在逃脫,因爲他們應該。

但是,當我登錄到phpmyadmin查看我在DB中的條目時,發現應該轉義的字符不是。我在這裏遇到問題嗎?在我的變量聲明和我不知道的查詢之間發生了什麼?

是否有PHP或服務器設置可能會影響到這?

注意:我知道PDO是要走的路,我只是不在這個特定時刻。

+0

該函數會將諸如「hel'lo」之類的內容更改爲「hel \ lo」,使其可以安全地插入到數據庫中,一旦它進入數據庫,它將再次看起來像「hel'lo」,但會有已插入並且不會導致SQL錯誤。 – Dale

+0

你逃脫了一些東西,並將它連接到你的'INSERT'查詢字符串,插入的東西將*看起來不像轉義。想想'insert into blah(field)VALUES(「This is \」stupid \「」)',它會插入'This is「stupid」'but * not *'這是\「stupid \」'。 –

+0

我建議如果你正在與mysqli讓你跳過的箍環戰鬥,並且它非常糟糕,你必須發佈到SO來解決它,這是開始查看PDO的一個理想時間。 –

回答

1

回聲表明他們確實正在逃脫,因爲他們應該。

這表示您的角色已被轉義。

當我登錄到phpMyAdmin來看看我在DB的條目

,我看這應該是轉義字符不

現在,當你在逃避,你要這些字符手段,因爲它是相當比PHP或你的數據庫將它們內部作爲分隔符。

就像你想在你的輸入中輸入'那樣,所以你正在逃避它。 因此,現在當數據庫(mysql)發現它已被轉義,因此它不會將其視爲用於MySQL中字符串文字的single quote

如果你不逃避它,那麼MySQL將把兩個'之間的所有部分視爲字符串文字。

所以一切都很好,不用擔心。

1

的*在PHP _real_escape_string功能只有在那裏,以防止SQL注入爲此它只會改變「到\」和「到\」,使下面的查詢:

SELECT * FROM users WHERE pass = '' OR '1'='1 -- 

將變爲:

SELECT * FROM users WHERE pass = '\' OR \'1\'=\'1 -- 

因此注入的值不起作用。