2015-01-08 64 views
0

這似乎是一個常見的問題,因爲我已經看到很多類似的問題。在php和mysql中用於搜索的多個複選框?

但是,沒有一個答案實際上指出如何從mysql數據庫中進行選擇,這是我的問題。

基本上我有一個表,我在其中存儲搜索數據。

它看起來像這樣:

id blond darkHair busty  curvy 
--------------------------------------------------- 

1  blond    busty 

2    dark hair busty  curvy 

3  blond       curvy 

4  blond       curvy 

,我有一個表格複選框,像這樣:

<form action="search.php" method="post"> 
    <input name="keyword[]" type="checkbox" value="blond" /> 
    <input name="keyword[]" type="checkbox" value="dark hair" /> 
    <input name="keyword[]" type="checkbox" value="busty" /> 
    <input name="keyword[]" type="checkbox" value="curvy" /> 
</form> 

和PHP代碼是這樣的:

if(isset($_POST['keyword'])) 
{ 

    $keyword = $_POST['keyword']; 

foreach ($_POST['keyword'] as $keyword) { 

    $keywordarray[] = mysqli_real_escape_string($conx, $keyword); 


    } 
    $keywords = implode (",", $keywordarray); 

    $sql = "SELECT * FROM girlsStaff 
      WHERE (`blond` LIKE '%".$keyword."%') OR (`darkHair` LIKE '%".$keyword."%') OR (`busty` LIKE '%".$keyword."%') OR (`thin` LIKE '%".$keyword."%')" or die(); 


    $query = mysqli_query($conx, $sql); 

現在,除了從將此代碼轉換爲PDO或準備好的聲明,還有另一個我不明白的問題!

沒關係我有多少chechboxes選擇...它總是返回從MySQL數據庫最後一次檢查/選擇複選框值的結果....

是有,我失去了一些東西?

我也是,echo $keywords在我的頁面頂部看到什麼被髮送到頁面,我得到所有選定/檢查框的值正確發送..所以我知道這個問題不存在。

任何幫助或建議,將不勝感激。

+1

'$ SQL = 「...」 或死亡()'是毫無意義的。建立/分配一個字符串不是可以用'或die()'測試的東西。無論如何,可能發生的故障將是致命的錯誤。你需要在mysqli_query()函數中調用或者死掉()。 –

回答

1

您需要動態地建立查詢您的查詢實際執行。

<?php 
$clause = " WHERE ";//Initial clause 
$sql="SELECT * FROM `girlsStaff` ";//Query stub 
if(isset($_POST['submit'])){ 
    if(isset($_POST['keyword'])){ 
     foreach($_POST['keyword'] as $c){ 
      if(!empty($c)){ 
       $sql .= $clause."`".$c."` LIKE '%{$c}%'"; 
       $clause = " OR ";//Change to OR after 1st WHERE 
      } 
     } 
    } 
echo $sql;//Remove after testing 
} 
?> 
<form method="POST" action="#"> 
<form action="search.php" method="post"> 
Blond: <input name="keyword[]" type="checkbox" value="blond" /> 
Dark Hair: <input name="keyword[]" type="checkbox" value="dark hair" /> 
Busty : <input name="keyword[]" type="checkbox" value="busty" /> 
Curvy; <input name="keyword[]" type="checkbox" value="curvy" /> 
<input type="submit" name="submit" value="Submit"> 
</form> 

示例查詢

2個複選框填充

SELECT * FROM `girlsStaff` WHERE `dark hair` LIKE '%dark hair%' OR `curvy` LIKE '%curvy%' 

4填充

SELECT * FROM `girlsStaff` WHERE `blond` LIKE '%blond%' OR `dark hair` LIKE '%dark hair%' OR `busty` LIKE '%busty%' OR `curvy` LIKE '%curvy%' 
1

我認爲從$關鍵字到$關鍵字的小改變將解決您的問題:) 現在您正在尋找像$ _POST ['keyword']數組中的最後一個值的項目。

這條線:

$sql = "SELECT * FROM girlsStaff WHERE (`blond` LIKE '%".$keyword."%') OR (`darkHair` LIKE '%".$keyword."%') OR (`busty` LIKE '%".$keyword."%') OR (`thin` LIKE '%".$keyword."%')" or die(); 

你也應該使用,而不是一樣,如果你有名單AAA,BBB,CCC ......,但你會尋找那些在那些完全一樣的字符串元素領域。

改變$關鍵字後,您將擁有:

... WHERE (`blond` LIKE '%".$keywords."%') 

也將無法正常工作,由於這將意味着:

... WHERE (`blond` LIKE '%aaa,bbb,ccc%') 

如果你想喜歡使用(如果在數據庫字段只包含然後我建議在foreach循環中構建你的查詢。例如:

$sql = "SELECT * FROM girlsStaff WHERE ". 
foreach ($_POST['keyword'] as $keyword) { 
    $sql .= "(`blond` LIKE '%".$keyword."%') OR "; 
} 
//and here cut last four character " OR " part that will be unusefull 
+0

我已經試過這個,我根本沒有結果。 – william

+0

您正在使用LIKE與IN運算符一起使用的值,請參閱更新的回覆,如果您的值完全匹配來自DB的值,請使用IN,如果不是在foreach循環中構建您的查詢 – Grzesiek

+0

對不起,我不確定爲什麼,但我在您的語法錯誤最後的代碼!此外,該代碼看起來不正確。 – william

0

錯別字:

$keywords = implode (",", $keywordarray); 
     ^--- with an S 

WHERE (`blond` LIKE '%".$keyword."%') 
           ^--- without an S 

你在你原來的$_POST['keyword']陣列餡。在字符串上下文數組是字面字Array,從而

WHERE (`blond` LIKE '%Array%') 
+0

我已經用S試過了WHERE('blond' LIKE'%「。$ keywords。」%'),但我根本沒有得到任何結果..甚至沒有得到最後一個選中的複選框。 – william

+0

在這裏粘貼'var_dump($ sql)'。看看生成的SQL真的看起來像什麼。 –

+0

它看起來像這樣:'string(193)「SELECT * FROM girlsStaff WHERE('blond' LIKE'%blond,dark hair%')或('darkHair' LIKE'%blond,dark hair%')OR(' ('瘦金髮','黑髮')''' – william