2012-12-13 105 views
8

我使用PHP 5.3版,並試圖在我的代碼使用mysql_real_escape_string($unescaped_string),但我得到的錯誤:mysql_real_escape_string未定義

Fatal error: Call to undefined function mysql_real_escape_string() 
in /var/www/engine/database.php on line 38 

我仍然可以連接到數據庫但是。爲什麼不可用?

我正在使用PHP版本5.3。

+2

請告訴我們你的代碼 – GBD

+0

嘗試函數mysql_escape_string()來代替 – jtheman

+1

@jtheman你爲什麼要更換提示功能更強大的(即需要服務器配置到賬戶),更糟的功能(只是簡單的字符串替換)? – Vyktor

回答

16

comment提到的更新mysql_一直deprecated since 5.5

The mysql extension has been deprecated since PHP 5.5. The mysqli or PDO extension should be used instead. The deprecation has been decided in mysql_deprecation , where a discussion of the reasons behind this decision can be found.

在PHP 7刪除。


mysql_real_escape_string()MySQL function "batch"標準的一部分,如果擴展是否正確裝入始終有效。

是否有其他mysql_函數有效? (它不應該)

確保,你有這樣的行註釋掉您php.ini

extension=mysql.so 

而且它會是明智的使用mysqliPDO代替(mysql_ is deprecated),它們都可以照顧逃避你。

+1

對不起,這個問題是我的錯。當我使用sudo apt-get安裝php5-mysql時失敗了,我認爲我的其他連接語句正常工作。我想你只是得到了一個自由的正確答案。 – MichaelH

+0

@MichaelH在想知道你的代碼出了什麼問題之前,首先需要檢查系統配置(更新之後)。 – Vyktor

+0

MySQL擴展[自PHP 5.5以來不可用](https://wiki.php.net/rfc/remove_deprecated_functionality_in_php7);改爲使用ext/mysqli或ext/pdo_mysql。 –

1

有趣的是,在這裏探討所有其他的解決方案之後,我意識到這個問題實際上是由於該php5-mysql擴展沒有尚未安裝 - 它並不是默認安裝一個新鮮的Ubuntu,既不安裝新鮮的PHP。所以,對我來說,解決方案變成了:安裝PHP5-MySQL擴展:

sudo apt-get install php5-mysql 

在此之後,我沒有得到那些討厭的mysql_ *錯誤再次;-)

因爲PHP 5.5
0

MySQL擴展已被棄用。因此,mysql_real_escape_string()在PHP 7中不可用。這意味着用戶輸入無法正確轉義,並使代碼面臨SQL注入攻擊。

PHP的官方解決方案是replace ext/mysql with MySQLi, PDO或其他支持的數據庫擴展。

爲防止SQL注入攻擊,建議在與數據庫交談時使用prepared statements and parameterized queries

+0

任何可用的數據庫API(mysql,mysqli,PDO等等)都有一個函數來正確地轉義值或直接使用數據庫的預處理語句API(更好的方法開始)。如果'real_escape_string'或等價物不可用,那意味着整個數據庫API不可用,並且無論如何你都有更大的問題。永遠不需要重新實現這個功能。至關重要的是,你沒有實現任何編碼問題,這仍然讓你打開注入某些多字節編碼。 – deceze

+0

@deceze:回答更改爲關注「MySQL擴展已過時」部分。刪除了模仿mysql_real_escape_string()的函數。 –