【问题标题】:Apostrophe issue撇号问题
【发布时间】:2023-03-27 05:18:01
【问题描述】:

我已经使用 php 和 mysql 构建了一个搜索引擎。

问题: 当我提交一个带有撇号的单词并使用 $_GET 将值返回到文本字段时,撇号已被反斜杠替换,并且撇号后面的所有字符都丢失了。

示例: 提交词:Just can't get enough
返回值(使用 $_GET):Just can\
网址也像这样出现:search=just+can%27t+get+enough

如您所见,' 已被替换为 \ 并且 get enough 丢失了。

问题: 有谁知道导致这种情况发生的原因以及解决此问题的解决方案是什么?

代码: http://tinypaste.com/11d62

【问题讨论】:

  • 表格中是否正确?如果没有,也许您在保存数据时没有转义它。 Apos 必须加倍,例如 update ... set col1 = 'I don't know' ...
  • 您能展示更多代码示例吗?这不会发生在我身上。
  • 尝试在 get 上运行 urldecode,然后运行 ​​mysql_real_escape_string(以确保数据库使用安全)。不知道这是否是问题,但值得一试。就像 MGwynne 说的,当你访问 get 变量时不应该发生这种情况,但是当你将它添加到数据库时可能会发生这种情况

标签: php mysql search-engine


【解决方案1】:

如果您运行的 PHP 版本低于 5.3.0,斜线可能会由 Magic Quotes 添加,您可以在 .ini 文件中将其关闭。

【讨论】:

    【解决方案2】:

    根据您对“文本字段的值”的描述,我推测您的输出代码如下:

     Redisplay
     <input value='<?=$_GET['search']?>'>
    

    在这种情况下,包含的单引号将终止 html 属性。单引号后面的任何东西对浏览器来说都是垃圾。在这种情况下,将htmlspecialchars 应用于输出会有所帮助。

    (反斜杠可能是由于magic_quotes或mysql_*_escape在输出文本之前造成的。我怀疑这个问题在这里描述了数据库错误。)


    更新:看来这里确实是输出问题:

      echo "<a href='searchmusic.php?search=$search&s=$next'>Next</a>";
    

    无论您使用单引号还是双引号,您都需要:

      echo "<a href='searchmusic.php?search="
          . htmlspecialchars(stripslashes($search))
          . "&s=$next'>Next</a>";
    

    (请注意,此处使用stripslashes 是一种解决方法。您应该保留原始搜索文本,或者使用disable the magic_quotes。)


    好吧,我忘记了一些重要的事情。 htmlspecialchars 需要 ENT_QUOTES 参数 - 总是,尤其是在您的情况下:

    // prepare for later output:
    $search = $_GET['search'];
    $html_search = htmlspecialchars(stripslashes($search), ENT_QUOTES);
    

    然后在任何你想显示 $search 之前使用它:

      echo "<a href='searchmusic.php?search=$html_search&s=$next'>Next</a>";
    

    【讨论】:

    • 你需要应用htmlspecialchars() 任何地方你试图输出$search。为简单起见,我建议您执行一次$html_search = htmlspecialchars($search, ENT_QUOTES);,然后打印$html_search
    • 是的,对不起,我已经更新了答案。 (这在评论中实在是太难以理解了。)
    • 替换后 $search = $_GET['search']; $html_search = htmlspecialchars($search, ENT_QUOTES);它不会让我搜索任何东西。如果我输入一些内容,它说您必须输入超过 3 个字符。
    • 不,你仍然需要这两行。 $search 用于数据库查询。以及用于 html 输出的 $html_search
    • 我在哪里放 $html_search = htmlspecialchars($search, ENT_QUOTES);
    【解决方案3】:

    单引号在 PHP 和 MySQL 中很重要。

    单引号是PHP中字符串的分隔符,例如:

    $str = 'my string';
    

    如果你想在字符串中包含文字引号,你必须告诉 PHP 引号 不是 字符串的结尾。用反斜杠转义,例如:

    $str = 'my string with a quote \' inside it';
    

    有关更多信息,请参阅PHP Strings

    MySQL 以类似的方式运行。一个示例查询可能是:

    $username = 'andyb';
    $quert = "SELECT * FROM users WHERE user_name = '$username'";
    

    单引号分隔字符串参数。如果$username 包含单引号,这将导致查询过早结束。正确转义参数是一个需要熟悉的重要概念,因为它是侵入数据库的一种攻击媒介 - 请参阅 SQL Injection 了解更多信息。

    处理这种转义的一种方法是使用mysql_real_escape_string()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多