【问题标题】:using MySQL LIKE to select an escaped string in database使用 MySQL LIKE 在数据库中选择转义字符串
【发布时间】:2012-07-28 13:43:18
【问题描述】:

我对放入我的数据库的内容使用 mysql_real_escape_string,所以像 Bob's Shop 这样的东西会变成 Bob\'s Shop。并且,例如,如果我尝试选择所有包含 Bob\'s 的条目,我的选择语句如下所示:

SELECT * FROM tbl WHERE name LIKE '%Bob\\\'s%' 

无论出于何种原因,它都不起作用,即使它完全可以起作用。

【问题讨论】:

  • mysql_real_escape_string() 转义要由 API 插入的引号,但不存储转义的引号。当您查看数据库时,您不应该看到转义引号!。应该可以只做'%Bob\'s%'
  • 如果您确实在数据中看到了转义引号,则可能除了 mysql_real_escape_string() 之外,您还调用了诸如 addlashes() 之类的东西,或者您在 PHP 中打开了魔术引号。跨度>
  • 嗯,这很奇怪,它总是将它存储为对我来说已转义。就像我认为如果我输入一个',该函数会将其转换为\\\',因此它会存储为\'。而且我只使用 mysql_real_escape_string,没有添加斜杠
  • 检查get_magic_quotes_gpc() 你应该关闭魔术引号...
  • @user1330341 恐怕您需要进入并修复所有现有数据以摆脱额外的反斜杠。 magic_quotes_gpc 在 PHP 中是一个糟糕的想法,不幸的是,在人们意识到它是愚蠢的很多年后,人们仍在为它买单。

标签: php mysql string escaping


【解决方案1】:

如果该撇号被mysql_real_escape_string 函数转义,则在 DB 中输入的值将不包括反斜杠,这仅用于安全目的。所以你的数据库中的最终值应该是Bob's。这就像在用引号括起来的字符串中转义相同的引号,例如 "double \"quotes\""'single \'quotes\''

您是否尝试按原样查询%Bob\'s%name 列的数据类型是什么?我无法复制您的问题,它适用于您和我的示例。

【讨论】:

    【解决方案2】:

    我修复了它(感谢迈克尔向我展示了如何)。我将发布我所做的以防其他人遇到此问题。

    从来没有想过如何在 LIKE 中正确放置转义字符,但问题是我打开了魔术引号,所以每当我使用 mysql_real_escape_string 时,它都会添加额外的转义字符,这样它就不会被存储为 Bob 的,而是存储为 Bob 的。这是禁用魔术引号的文档:http://www.php.net/manual/en/security.magicquotes.disabling.php 对我来说,将php_flag magic_quotes_gpc Offphp_value magic_quotes_gpc Off 放在.htaccess 中是行不通的,因为我使用的是购买的主机,而主机不允许这样的设置。因此,我将magic_quotes_gpc = Off 放在一个名为 php.ini 的文件中,并将其放在我需要的每个目录中。

    由于我的 MySQL 数据库中已经有很多行包含额外的反斜杠,所以我需要在关闭魔术引号时删除它们。您可以通过发出如下查询轻松做到这一点:UPDATE tbl SET col=REPLACE(col,'\\\'','\'') WHERE col LIKE '%\'%' 将 tbl 替换为您的表名,将 col 替换为您正在使用的任何列。如果您需要修复其他转义字符,只需更改 REPLACE 和 LIKE 以反映这一点。可能有更好的代码可以一次性完成所有列和所有转义字符,但出于我的目的,我不需要。

    【讨论】:

      【解决方案3】:

      您好,我认为这对 mySQL 和 Java 有帮助,

      在 Java 中

      char quotes ='"';
      
      String sql =" SELECT * FROM tb1 where name LIKE "+quotes+"%Bob's%"+quotes+" ;";
      

      mySQL 查询

      SELECT * FROM tbl WHERE name LIKE "%Bob's%" 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-12
        • 2019-10-26
        • 1970-01-01
        • 2016-04-15
        • 1970-01-01
        • 1970-01-01
        • 2012-10-07
        相关资源
        最近更新 更多