2012-12-13 104 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()的函数。 –