2013-02-08 105 views
1

因此,我有一個非常簡單的應用程序,它將數據存儲在MySQL數據庫中,數據發佈到一個php文件中,然後將其包裝在一個mysql_escape_string()中,然後將其插入數據庫。MySQL存儲字符在一臺服務器上轉義但不是另一臺

在我本地安裝的運行php和mysql的apache上,它可以正常工作,但是在我的主機帳戶中,它存儲了任何'和「字符,前面有一個\兩個數據庫使用相同的latin1_swedish_ci字符集,兩者都運行相同的版本的mysql:5.5.27但明顯表現不同

我在這一個感謝

+4

我的想法是[魔術引號](http://www.php.net/manual/en/security.magicquotes.what.php)。你也應該停止使用'mysql_'函數。 – Kermit 2013-02-08 20:03:58

+0

像@njk建議的那樣,從PHP 5.5.0開始已經不推薦使用mysql()*',使用[mysqli](http://www.php.net/manual/en/book.mysqli.php)或[PDO ](http://www.php.net/manual/en/ref.pdo-mysql.php)。 – 2013-02-10 10:12:09

回答

2

由於@njk評論的損失,很可能是你的託管服務提供商已經在他們的PHP環境中啓用魔術引號! 。所以PHP代碼中的參數在你的代碼看到它們時已經包含了轉義,然後你使用mysql_real_escape_string(),它將轉義應用到「\」轉義字符中,結果是文字「\」字符最終在您的數據庫中。

您可以通過上傳快速PHP腳本來驗證託管PHP環境中的當前設置,該腳本將檢查get_magic_quotes_gpc()並根據結果輸出「是」或「否」。您也可以從phpinfo()檢查報告。

通常,您應該始終將您的開發環境與您的託管環境的PHP版本和PHP設置進行匹配,以便您可以測試代碼,並確保在部署時它們的工作方式相同。

另一種解決方案是編寫您的應用程序,以便在運行時有條件地撤銷魔術引號,如果啓用了魔術引號。然後像平常一樣應用mysql轉義。這裏有一個PHP代碼示例的鏈接,用於在運行時撤消魔術引號:http://php.net/manual/en/security.magicquotes.disabling.php

第三條建議是切換託管提供程序。很好的一個人,他仍然不能使PHP已經過時的,不贊成使用的功能。這沒有任何藉口!

+0

你是正確的!謝謝。在php.ini中關閉了Magic Quotes,它完美運行。我總是忘記那些愚蠢的主人在默認情況下離開的古老東西。哈哈哈。 – rcooper102 2013-02-08 20:29:43

+0

給你一個新的主人! ;-) – 2013-02-08 20:30:32

+0

哈,客戶提供了主機。 – rcooper102 2013-02-08 21:34:40

相關問題