在 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 选择查询?的主要内容,如果未能解决你的问题,请参考以下文章