【问题标题】:In PHP, how do I make a mySQL select query that contains both quotation marks and apostrophes?在 PHP 中,如何创建包含引号和撇号的 mySQL 选择查询?
【发布时间】:2011-11-23 00:04:57
【问题描述】:

我正在使用 mysql_real_escape_string 毫无问题地将数据输入我的数据库。

所以数据库中的一个条目可能是:

1/4" Steve's lugnuts

所以这完全在数据库中。
现在我想搜索那个确切的东西。但是,它会在 " 或 ' 上搞砸(我已经尝试了很多事情,但它总是在某个地方搞砸)。

这是我现在拥有的: (user_input来自上一页的一个表单)

$user_input=mysql_real_escape_string($_REQUEST['user_input']);
$search_row=mysql_query("SELECT * FROM some_table WHERE some_column LIKE '%$user_input%' ");
while($search = mysql_fetch_array($search_row))
            {stuff happens}

echo "<form action='search_results.php' method='post'>";
echo "<input name='user_input' type='text' size='50' value='" . $user_input. "'>";
echo "<input type='submit' value='Lookup Parts' />";
echo "</form>";

但问题是,除了错误,我似乎什么也得不到。
搜索字段(应该填充他们已经输入的内容)只有:

1/4\" Steve\

我做错了什么?

【问题讨论】:

    标签: php mysql escaping quoting


    【解决方案1】:

    打印您的语句“SELECT * FROM some_table WHERE some_column LIKE '%$user_input%'” 以查看它在做什么(并转义)。

    不是一个解决方案,但看看 mysqli 或 pdo (http://stackoverflow.com/questions/548986/mysql-vs-mysqli-in-php),它们有用于准备语句的实用程序。

    【讨论】:

      【解决方案2】:

      不知道它是否确实有帮助,但您不应该为查询而转义并为 html 转义一次吗?

      $query = sprintf("SELECT * FROM some_table WHERE some_column LIKE '%s' ", mysql_real_escape_string($user_input));
      
      echo "<input name='user_input' type='text' size='50' value='".htmlentities($user_input)."'>";
      

      编辑

      您可能不想每次提交时都更改(转义)您的输入 ($user_input) ..尽管如果它只有 ' 和 " 受影响,它可能无论如何都无关紧要

      【讨论】:

      • 是的,但我认为 OP 的查询也有问题。
      • 不幸的是,这根本不起作用。我收到警告:mysql_query() 期望参数 2 是资源,第 19 行的 search_results.php 中给出的字符串以及警告:mysql_fetch_array() 期望参数 1 是资源,第 20 行的 search_results.php 中给出的空值也.. .也许是最能说明问题的...你给我的输入和我的完全一样,搜索框只包含 1/4" Steve 而不是 1/4" Steve's lugnuts。
      • 你使用了我之后写的第一部分:$search_row=mysql_query($query);接下来是你的while...?
      【解决方案3】:

      搜索字段(应该填充他们已经输入的内容)只有1/4\" Steve\

      当然有!
      你错位了你的逃跑。 mysql_real_escape_string 仅用于 SQL!但是您正在将其结果用于 html。而对于 HTML,您必须使用完全不同的转义方式。

      那就去吧

      $user_input=mysql_real_escape_string($_REQUEST['user_input']);
      $search_row=mysql_query("SELECT * FROM some_table WHERE some_column LIKE '%$user_input%' ");
      while($search = mysql_fetch_array($search_row))
                  {stuff happens}
      
      
      $user_input =htmlspecialchars($_REQUEST['user_input'],ENT_QUOTES); // here it goes
      
      echo "<form action='search_results.php' method='post'>";
      echo "<input name='user_input' type='text' size='50' value='$user_input'>";
      echo "<input type='submit' value='Lookup Parts' />";
      echo "</form>";
      

      还请注意,回显如此大的 HTML 块是没有用的。只需关闭 PHP 标记,然后编写纯 HTML:

      ?>
      <form action='search_results.php' method='post'>
      <input name='user_input' type='text' size='50' value='<?=$user_input?>'>
      <input type='submit' value='Lookup Parts' />
      </form>
      

      看起来更清晰、可读和方便

      【讨论】:

      • 这正是我遇到的问题。我希望我可以选择两个答案,因为尽管这完美地解决了我的特定问题,但 Tomas T. 的答案非常有用,并且很可能人们到达这里时也会搜索什么。非常感谢!
      • 另外...关于这一切都被回显 PHP...无论如何,这都在 PHP 中的递归循环中——我不认为我可以退出 PHP 而不会弄乱那种事情了。
      • 绝对没有什么好惹的。在循环中一切都会好起来的。
      【解决方案4】:

      嗯,你的问题是正确的引用。您的问题是您需要对 MySQL 和 HTML 进行不同的引用,并且您可能还可以设置 magic_quotes_gpc!引用时,您总是为某些特定输出引用文本,例如:

      1. mysql查询的字符串值
      2. like mysql 查询表达式
      3. html代码
      4. json
      5. mysql 正则表达式
      6. php 正则表达式

      对于每种情况,您需要不同的引用,因为每种用法都存在于不同的语法上下文中。这也意味着 不应在 PHP 的输入中进行引用,而应在特定的输出中进行引用!这就是为什么magic_quotes_gpc 等功能被破坏的原因(确保它已关闭!!!)。

      那么,在这些特殊情况下,可以使用哪些方法进行引用? (请随时纠正我,可能有更现代的方法,但这些对我有用)

      1. mysql_real_escape_string($str)
      2. mysql_real_escape_string(addcslashes($str, "%_"))
      3. htmlspecialchars($str)
      4. json_encode() - 仅适用于 utf8!我将我的函数用于 iso-8859-2
      5. mysql_real_escape_string(addcslashes($str, '^.[]$()|*+?{}')) - 在这种情况下你不能使用 preg_quote 因为反斜杠会被转义两次!
      6. preg_quote()

      编辑:关于您的原始问题 - 如果您更正了引用,那么您当然可以在字符串中使用任何字符,包括单引号和双引号。

      【讨论】:

      • 这是一个真的很好的答案!正是这种东西让人们想要使用 StackOverflow,我想——!虽然上校 Shrapnel 专门回答了我的问题,但它的范围很广,我会经常参考你的回答。为你点赞!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 2010-12-27
      相关资源
      最近更新 更多