在 PHP 中,如何创建包含引号和撇号的 mySQL 选择查询?

Posted

技术标签:

【中文标题】在 PHP 中,如何创建包含引号和撇号的 mySQL 选择查询?【英文标题】:In PHP, how do I make a mySQL select query that contains both quotation marks and apostrophes? 【发布时间】: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\

我做错了什么?

【问题讨论】:

【参考方案1】:

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

不是一个解决方案,但看看 mysqli 或 pdo (http://***.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!引用时,您总是为某些特定输出引用文本,例如:

    mysql查询的字符串值 like mysql 查询表达式 html代码 json mysql 正则表达式 php 正则表达式

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

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

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

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

【讨论】:

这是一个真的很好的答案!正是这种东西让人们想要使用 ***,我想——!虽然上校 Shrapnel 专门回答了我的问题,但它的范围很广,我会经常参考你的回答。为你点赞!

以上是关于在 PHP 中,如何创建包含引号和撇号的 mySQL 选择查询?的主要内容,如果未能解决你的问题,请参考以下文章

C - 引号和撇号之间的区别(“ vs ')[重复]

声明包含单引号/撇号的 char 值的最清晰方法

导入 CSV 文件时处理逗号和撇号

如何插入包含撇号(单引号)的值?

如何在 PHP 中去除特殊的引号字符?

bash中双引号单引号反撇号的用法