【问题标题】:PHP mysql_real_escape_string returns empty stringPHP mysql_real_escape_string 返回空字符串
【发布时间】:2012-05-07 12:53:30
【问题描述】:

我正在尝试对我的数据库应用程序(针对一个类)进行一些安全性和清理工作。首先,我尝试使用 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,这应该在没有连接时发生(?),但有一个。

【问题讨论】:

  • 确定有活动连接吗?你是怎么测试的?另外,如果您还没有开启错误报告功能。
  • 你怎么知道有连接?我还建议完全避免使用mysql_* 并使用PDO,或者至少使用一些 DB 包装器,如MDB2
  • 我知道我已连接到数据库,因为未显示 php。无需任何文本清理,我就可以编辑数据库中的项目。 (这就是在这种情况下需要做的事情,但我正在寻找一般的输入清理)并且,是的,我知道未清理的值已填充。
  • 请在一开始就这样做:error_reporting(~0); ini_set('display_errors', 1); - 然后注意不要再看到任何警告和通知。如果您仍有问题,请告诉我们。
  • 我把这两行放在 php 元素的最开始,没有任何改变。没有错误。

标签: php mysql database mysql-real-escape-string


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我们也面临同样的问题。 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命令时的错误,在我们的开发机器上没有看到这个错误,命令成功连接到数据库服务器。 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

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

    【讨论】:

      【解决方案3】:

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

      $sanitizedField = mysqli_real_escape_string($connection, $field);
      

      【讨论】:

      • OP 使用的是面向对象的风格,它只接受一个参数$connection->real_escape_string($field);。请参阅 PHP 文档中的 this 示例。
      • 谢谢!!这是唯一对我有帮助的答案。
      【解决方案4】:

      “此扩展自 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,毫无疑问,大量的应用程序仍在使用这个已弃用的功能。

      【讨论】:

        【解决方案5】:

        参见 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);     
        

        【讨论】:

        • 啊哈!我得到这个作为输出:警告:mysql_real_escape_string():访问被拒绝用户'www-data'@'localhost'(使用密码:NO)在/cslab/home/paw5k/public_html/cainedb/edit_execute_update_gn_query.php第70行警告:mysql_real_escape_string():无法在 /cslab/home/paw5k/public_html/canedb/edit_execute_update_gn_query.php 中的第 70 行 XXseries 更改成功?
        • 大声笑 .. 我也猜到了...您需要使用 mysql_connect 连接到数据库,或者您想要替换吗???
        • 刚刚看到你更新的代码..你需要的是mysqli_real_escape_string,正如 jeroen 所说的
        • 我希望我能将一个答案标记为有帮助,即使它严格来说是“正确的”。你很有帮助。先生或女士的帽子。
        • 天啊,“部分替换”。有人不知道。
        【解决方案6】:

        你是用mysqli连接的,不是mysql,所以你需要mysqli_real_escape_string

        虽然你可以很容易地在 mysqli 中使用准备好的语句,然后你也不需要...

        【讨论】:

        • 大声笑,像这样的愚蠢事情总是让我着迷。接下来我将编写准备好的语句...
        • @Panique 是的,因为您不应该将 mysql_ 与 mysqli 混合使用。
        • @Panique 请注意,mysql_real_escape_string 在错误时返回 false(例如没有 mysql 数据库连接时......),这相当于一个空字符串,这就是 OP 结束的原因加上一个空字段。
        • @PJBrunet 不要使用函数或“模拟”函数,使用不带任何函数的准备好的语句(当然,常规数据验证除外)。
        • @PJBrunet 我的回答是指 OP 遇到的问题。我会推荐准备好的语句(这样你就不用担心转义了),但是这个特定的问题是由于使用了错误的函数引起的。只要您牢记手册页上的警告,使用mysqli_real_escape_string 没有任何问题。顺便说一句,我以前什至没有看到你的答案,但现在我有,我根本看不到它是如何回答这个问题的,OP 已经在使用mysqli。这可能是投反对票的原因......
        猜你喜欢
        • 2013-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-23
        • 2017-07-03
        • 2015-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多