11

我正在尝试在我的数据库应用程序(对于一个类)中进行一些安全性和清理工作。首先,我正在尝试使用 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 没有任何内容。我试过使用中间字符串,但我得到了相同的结果。我对这里出了什么问题感到非常茫然。

另外,我在 var_dump 上做了一个$field,它声称mysql_real_escape_string返回FALSE,这应该在没有连接时发生(?),但有一个。

4

6 回答 6

18

您正在使用 mysqli 连接,而不是 mysql,所以您需要mysqli_real_escape_string

虽然您可以轻松地在 mysqli 中使用准备好的语句,但您也不需要...

于 2012-04-26T20:17:53.527 回答
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");

或者

   $escaped = filter_var($_GET['value'], FILTER_SANITIZE_STRING);     
于 2012-04-26T19:49:40.343 回答
6

你得到任何空字符串,因为该函数有两个参数;到数据库的实际连接,然后是字符串。用这个:

$sanitizedField = mysqli_real_escape_string($connection, $field);
于 2013-12-05T20:53:10.117 回答
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:至于否决票,我支持我的回答。问题中的函数将从 PHP 中删除,这很重要,我觉得需要指出它,因为没有其他人提到它。你不同意吗?原始问题的细节很重要,但是很多人(包括我自己)来这里寻找有关 mysql_real_escape_string() 的信息,而在寻找有关 mysql_real_escape_string() 的信息时,您应该意识到的第一件事是它已被弃用。系统管理员迟早必须升级 PHP,毫无疑问,大量应用程序仍在使用这个已弃用的功能。

于 2013-07-08T20:20:34.750 回答
0

我们也面临同样的问题。mysql_real_escape_string 在我们的开发 Linux 系统上工作,但不在测试台上工作。我们想知道为什么它可以在我们的系统上运行,而不是在测试平台上运行,即使所有的 php rpm 都是相同的版本。参考 PHP 文档后,发现在调用 mysql_real_escape_string 之前必须有与 MySQL 的活动连接。如果没有活动连接,则 PHP 在内部尝试使用默认参数连接到 MySQL。当 PHP 在内部尝试连接到我们开发机器上的数据库时,它可以工作,但在我们的测试台上失败,并导致对 mysql_real_escape_string 的调用响应为空。在 mysql_real_escape_string() 之前添加对 mysql_connect() 的调用后,我们的问题得到了解决。

下面是我们运行 mysql 命令时的错误,在我们的开发机器上没有看到这个错误,并且命令成功连接到数据库服务器。错误 1045 (28000): 用户 'root'@'localhost' 的访问被拒绝(使用密码:否)

结论是我们必须在调用mysql_real_escape_string之前显式连接mysql。php 连接到数据库的内部尝试可以在某些系统上工作,而在某些其他系统上失败,具体取决于安全级别或登录凭据。

于 2014-01-22T06:37:04.597 回答
0

@jeroen 似乎可以解释。虽然它应该在不连接到本地服务器上的数据库的情况下工作(很多事情都是这样工作的)但它不会在 Web 服务器上,除非你在 mysql_rea 之前连接到数据库.....我只是尝试过它并且它工作。这就是为什么他赢得了我的选票

于 2015-07-27T08:22:38.033 回答