我正在尝试对我的数据库应用程序(对于类)进行一些安全性和清理。首先,我正在尝试使用mysql_real_escape_string,但每当我使用它时,它总是返回一个空字符串!
这是连接代码:
include_once ("./connect.php");
$db_connection = new mysqli($SERVER, $USERNAME, $PASSWORD, $DATABASE);
if (mysqli_connect_errno()) {
echo("Can't connect to MySQL Server. Error code: " . mysqli_connect_error());
return null;
}
$field = mysql_real_escape_string($_GET['value']);
$upc = $_GET['upc'];
$type = $_GET['field_type'];
echo $field;
echo $upc;
echo $type;
当php实际执行时,$ upc和$ type会被打印出来,但是没有$ field字段。香港专业教育学院尝试使用中间字符串,但我得到相同的结果。我真的很不知道这里出了什么问题。
另外,我在$field
上完成了一个var_dump,它声称mysql_real_escape_string
返回FALSE
,这应该在没有连接(?)时发生,但是有一个。
答案 0 :(得分:18)
您使用mysqli而不是mysql进行连接,因此需要mysqli_real_escape_string
虽然您可以在mysqli中轻松使用预处理语句,但您不需要......
答案 1 :(得分:8)
请参阅PHP文档http://php.net/manual/en/function.mysql-real-escape-string.php
MySQL连接。如果未指定链接标识符,则假定mysql_connect()打开的最后一个链接。如果没有找到这样的链接,它将尝试创建一个,就好像没有参数调用mysql_connect()一样。如果未找到或建立连接,则会生成E_WARNING级别错误。
表示您需要有效连接才能使用此功能
如果您没有看到任何错误,请尝试
error_reporting(E_ALL);
ini_set('display_errors','On');
mysql_real_escape_string
替代
使用
$escaped = htmlspecialchars($_GET['value'], ENT_QUOTES, "ISO-8859-1");
OR
$escaped = filter_var($_GET['value'], FILTER_SANITIZE_STRING);
答案 2 :(得分:5)
你得到任何空字符串,因为该函数有两个参数;实际连接到数据库,然后是字符串。使用此:
$sanitizedField = mysqli_real_escape_string($connection, $field);
答案 3 :(得分:2)
“自PHP 5.5.0起,此扩展已弃用,将来将被删除。而应使用MySQLi或PDO_MySQL扩展。”来自http://php.net/manual/en/function.mysql-real-escape-string.php
简单地将“i”添加到函数名称不是解决方案。请注意,链接标识符参数不再是可选的http://www.php.net/manual/en/mysqli.real-escape-string.php
PS:对于downvotes,我坚持我的回答。问题中的函数将从PHP中删除,这是一个大问题,我觉得需要指出,因为没有其他人提到它。你不同意吗?原始问题的细节很重要,但许多人(包括我自己)来到这里寻找有关mysql_real_escape_string()的信息,在查找有关mysql_real_escape_string()的信息时,您应该意识到的第一件事是它已被弃用。系统管理员迟早要升级PHP,毫无疑问,大量的应用程序仍在使用这个已弃用的功能。答案 4 :(得分:0)
我们也面临同样的问题。 mysql_real_escape_string正在开发我们的Linux系统,但没有在测试台上工作。我们想知道为什么它在我们的系统上运行而不是在测试台上,即使所有的php rpms都是相同的版本。在引用PHP文档之后,发现在调用mysql_real_escape_string之前必须有与MySQL的活动连接。如果没有活动连接,则PHP在内部尝试使用默认参数连接到MySQL。当PHP内部尝试连接到我们的开发机器上的数据库时它工作但是它在我们的测试台上失败并导致调用mysql_real_escape_string的空响应。在mysql_real_escape_string()之前添加对mysql_connect()的调用之后,我们的问题就解决了。
以下是我们运行mysql命令时的错误,并且在我们的开发计算机上没有看到此错误,并且命令已成功连接到数据库服务器。 ERROR 1045(28000):用户'root'@'localhost'拒绝访问(使用密码:NO)
结论是我们必须在调用mysql_real_escape_string之前显式连接到mysql。 php连接到数据库的内部尝试可以在某些系统上运行,并在某些其他系统上失败,具体取决于安全级别或登录凭据。
答案 5 :(得分:0)
@ jeroen似乎在解释它。虽然它应该可以在没有连接到本地服务器上的数据库的情况下工作(很多事情都是这样工作的)但是除了你在mysql_rea之前连接到数据库之外它不会在web服务器上.....我只是尝试了它并且它工作了。这就是为什么他赢得了我的投票