2011-09-22 87 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! –

相關問題