6

我正在使用 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\

我究竟做错了什么?

4

4 回答 4

5

搜索字段(应该填充他们已经输入的内容)只有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>

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

于 2011-09-22T16:44:00.293 回答
4

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

  1. mysql查询的字符串值
  2. likemysql查询表达式
  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()

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

于 2011-09-22T16:49:40.117 回答
0

打印你的句子 "SELECT * FROM some_table WHERE some_column LIKE '%$user_input%'" 看看它在做什么(和转义)。

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

于 2011-09-22T16:25:26.427 回答
0

不知道它是否确实有帮助,但是您不应该为查询而逃避,而为 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)..尽管如果它只有 ' 和 " 受影响,它可能无论如何都无关紧要

于 2011-09-22T16:36:24.133 回答