2011-09-22 48 views
6

我正在使用mysql_real_escape_string没有任何问题的数据到我的数据库。在PHP中,如何制作包含引号和撇号的mySQL select查询?

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

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\ 

我该干什么克错了?

回答

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> 

看起来更路清晰,可读性和方便

+0

这正是我遇到的问题。我希望我可以选择两个答案,因为虽然这完全解决了我的特殊问题,但Tomas T.的答案非常丰富,并且可能当人们到达这里时也会搜索。万分感谢! –

+0

另外...关于这一切都被echo'd PHP ...这一切都在PHP的递归循环内 - 无论如何,我不认为我可以退出PHP而不会搞砸这类事情。 –

+0

绝对没有什么可以混淆的。在循环中一切都会好起来的。 –

-1

打印您sentece “SELECT * FROM some_table WHERE some_column LIKE '%$ USER_INPUT%'”,看看它在做什么(和逃脱)。

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

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)每次你提交..although如果只有“和”这就是影响可能不是怎样都无所谓

+0

是的,但我认为OP也有问题与查询。 – roymustang86

+0

不幸的是,这根本不起作用。我得到警告:mysql_query()期望参数2是资源,在第19行search_results.php中给出的字符串,以及警告:mysql_fetch_array()期望参数1是资源,null在第20行的search_results.php中给出。 ..也许最有说服力的是...你给我的输入给出了与我完全相同的东西,搜索框中只包含1/4“Steve而不是1/4”史蒂夫的lugnuts。 –

+0

,你使用了我后来写的第一部分,如:$ search_row = mysql_query($ query);跟着你一会儿...? –

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()

编辑:关于你原来的问题 - 如果你纠正你的报价,你可以的话当然在字符串,包括单引号和双引号使用任意字符。

+1

这是一个非常好的答案!这是让人们想要使用StackOverflow的那种东西,我想---!虽然Shrapnel上校专门回答了我的问题,但这个问题的范围很大,我会经常参考你的答案。 Upvote for you! –