2013-07-30 76 views
0

我想實現的目標:我正在嘗試創建一個篩選器,學生可以按級別,性別或主題篩選我的網站上的導師。爲此,我創建了一些複選框,如果提交爲「開」或檢查查詢,則會找到滿足該條件的導師。我使用了一個while循環來檢查哪些複選框已被檢查。從MySQL返回的結果相同 - 我知道爲什麼,但不知道解決方案

發生了什麼事:查詢返回正確的結果,但說一個導師教數學和英語,然後他將返回結果div兩次。這是因爲導師完成兩個查詢並返回兩次。

我不知道如何去解決這個問題,所以在此先感謝,我非常感謝所有幫助,下面是HTML和PHP編碼的相關部分。

<form action="" method="get" > 
    Name: 
    <input type="text" name="tutor_name"><br> 
    Level: 
    <input type="checkbox" name="check[]" value="gcse">GCSE 
    <input type="checkbox" name="check[]" value="a_level">A Level<br> 
    Gender: 
    <input type="checkbox" name="check[]" value="male">Male 
    <input type="checkbox" name="check[]" value="female">Female<br> 
    Subject: 
    <input type="checkbox" name="check[]" value="maths">Maths 
    <input type="checkbox" name="check[]" value="science">Science 
    <input type="checkbox" name="check[]" value="english">English<br> 
    <input type="submit" value="Go!"> 

<?php 

if(!empty($_GET['check'])){ 
    foreach($_GET['check'] as $check) { 

    $check = mysql_query("SELECT `tutor_id` FROM `tutors` WHERE $check=1"); 

    while($row = mysql_fetch_array($check)){ 
    $tutor_data = tutor_data($row['tutor_id'], 'first_name','image','rating','bio','last_name'); 

    echo "<br><h3> " . $tutor_data['first_name']; 
    echo " " . $tutor_data['last_name']; 
    echo "</h3><br>" . $tutor_data['bio']; 
    echo "<br>Rating: " . $tutor_data['rating']. "<br><br>"; 
    } 
    } 
    $number= mysql_num_rows($check); 
     echo "<b>$number</b> results"; 
} 
+1

* PSA:*'mysql_ *'函數[在PHP 5.5中不推薦](http://php.net/manual/en/faq.databases.php#faq.databases.mysql.deprecated)。不建議您編寫新的代碼,因爲這會阻止您將來升級。相反,請使用[MySQLi](http://php.net/manual/en/book.mysqli.php)或[PDO](http://php.net/manual/en/book.pdo.php)和[是一個更好的PHP開發人員](http://jason.pureconcepts.net/2012/08/better-php-developer/)。 –

+0

試過一組???? – Sebastien

+0

@ user2631669看到這樣刪除了評論。你的數據庫結構看起來有點奇怪,如果添加了新的主題,你需要改變結構。 –

回答

0

試試這個

if(!empty($_GET['check'])){ 
    $chks = array(); //Declare Array 
    foreach($_GET['check'] as $check) { 
    $chks[] = "$check=1"; // Add 'checkboxvalue=1' to the array 
    } 
    $check = implode(' OR ',$chks); // Join the array with ' OR ' 
    $check = mysql_query("SELECT `tutor_id` FROM `tutors` WHERE $check"); 

    $number= mysql_num_rows($check); 
     echo "<b>$number</b> results"; 

    while($row = mysql_fetch_array($check)){ 
    $tutor_data = tutor_data($row['tutor_id'], 'first_name','image','rating','bio','last_name'); 

    echo "<br><h3> " . $tutor_data['first_name']; 
    echo " " . $tutor_data['last_name']; 
    echo "</h3><br>" . $tutor_data['bio']; 
    echo "<br>Rating: " . $tutor_data['rating']. "<br><br>"; 
    } 

} 

我在這裏的建設的where條款循環並執行單個查詢。

+0

你的天才超級笨蛋謝謝你。你介意解釋前5行代碼。根據我的理解,您已經創建了一個名爲$ chks的數組,併爲每個提交的名爲CHECK的變量賦值,並將其插入數組中。 – jayjay

+0

剛剛創建了一個'$ chks'數組並將複選框項存儲在那裏。例如:如果你有'maths'和'english'選中,數組將會是'$ chks = array('maths = 1','english = 1')'然後我用'OR'加入這個數組,數學= 1 OR英語= 1「,併成爲一個很好的條件。 – bansi

+0

這可以sql注入'$ check'沒有以任何方式消毒! –

1

你應該有什麼是一次爲多個值簡單的檢查單查詢:

SELECT DISTINCT ... 
WHERE 1 in (maths, english, male, a_level) 

現在你正在運行多個查詢所以它是有原因的,你會得到一個重複的導師爲每個有兩個或m的導師你正在尋找的屬性的礦石。如果您無法重寫單一查詢模型,那麼您必須獲取每個單獨查詢的結果,然後將它們結合到PHP中以過濾出這些模型。

此外,請注意您寫入的查詢容易受到SQL injection attacks的影響。在解決此問題之前,請勿在生產系統上使用該代碼。

+0

嘗試此操作並且不起作用:$ check_query = mysql_query(「SELECT DISTINCT'tutor_id' FROM'tutors' WHERE 1 in $ check」);.另外我的代碼如何易受攻擊?提前致謝。 – jayjay

+0

'http://example.com/foo.php?check=;學生桌學生--'。我衷心希望小鮑比表不是你的學生/客戶之一......閱讀我鏈接到的網站。 –

+0

非常感謝,我沒有意識到這個問題。我會讀到它。 – jayjay

0

你可以嘗試:

$check = mysql_query("SELECT `tutor_id` FROM `tutors` WHERE $check=1 GROUP BY `tutor_id`"); 

編輯:

或者,也許一個SELECT DISTINCT...可以工作

+0

之前嘗試過,因爲查詢是相互獨立的。無論如何感謝 – jayjay

相關問題