2011-06-13 178 views
1

我試圖使用選擇列表來主動篩選從我的SQL數據庫中獲得的結果。例如,如果我從我的選擇列表中選擇「Yankees」,我希望我的SQL查詢僅顯示Yankee球員。通過HTML實現MySQL過濾選擇

編輯:通過「實時過濾」我的意思是,當用戶選擇揚基隊,費城人,或播音員時,選擇列表將只顯示該類別下的名稱。

這是我選擇的代碼。

<select name="ident" id="ident"> 
    <option value="yankees">Yankees</option> 
    <option value="phillies">Phillies</option> 
    <option value="announcer">Announcer</option> 
</select> 

這是如下(數據庫連接後)的代碼:while語句的作品來填充我的第二個選擇列表(名稱)如果我手動放在名字

<?php 
    $ident = $_POST['ident']; 
    $query = @mysql_query('SELECT name, id FROM grade ORDER BY name asc WHERE ident="' . $ident . '"'); 
    echo "<select name='name'>"; 
    while ($temp = mysql_fetch_assoc($query)) { 
     echo "<option>".htmlspecialchars($temp['name'])."</option>"; 
    } 
     echo "</select>"; 
?> 

我知道,但我不確定我是否可以正確地對列表進行實時過濾。

在此先感謝。

+2

此代碼是容易受到SQL注入。 – ceejayoz 2011-06-13 13:55:48

+0

不是我的問題,但沒關係。你願意詳細說明這一點,告訴我究竟是什麼錯誤? – tnw 2011-06-13 13:56:47

+1

惡意用戶可能會發布允許他們執行任何SQL查詢的無效數據,包括刪除您的表。在查詢中使用之前,您需要在'$ ident'上使用'mysql_real_escape_string'。 – ceejayoz 2011-06-13 13:58:32

回答

1

不,你做得不對。首先,有一個安全漏洞。您的代碼容易受到SQL注入的攻擊。其次,你的SQL查詢是錯誤的。 ORDER BY應該在WHERE條款後出現。

下面是做到這一點的安全和正確的方法:

<?php 
$ident = mysql_real_escape_string($_POST['ident']); 
$query = @mysql_query("SELECT name, id FROM grade WHERE ident = '$ident' ORDER BY name ASC"); 
echo "<select name='name'>"; 

while ($temp = mysql_fetch_assoc($query)) { 
    echo "<option>".htmlspecialchars($temp['name'])."</option>"; 
} 

echo "</select>"; 
?> 
1

我不確定您的意思是「實時過濾」。像谷歌在他們的搜索(這被稱爲「谷歌建議」)實施?

在這種情況下,您將使用JavaScript與jQuery庫來更新您的列表。

另外,當您測試某些內容時,您不應該使用@,因爲它會抑制錯誤消息(如果有),並且您不知道錯在哪裏。如果您不希望高效的服務器向用戶提供錯誤消息,則可以使用php.ini文件中的選項來禁用該選項。

最後但並非最不重要的,我會建議你使用PreparedStatement,使防止您的代碼形式的SQL注射(這個遊樂您使用的庫MySQLi類):

  1. 創建PrearedStatement與 prepare()-方法。
  2. Bind您的參數
  3. Execute聲明
  4. Bind結果
  5. Fetch他們。

關於此的示例代碼可以在鏈接的PHPDoc-Samples中找到。

+0

事實上,jquery不是那麼必要的,你可以使用error_reporting(0)(http://php.net/manual/en/function.error-reporting.php)。 – excanoe 2011-06-13 14:00:29

+0

通過實時過濾我的意思是在一個菜單中,用戶可以選擇洋基隊,費城人隊,或者播音員隊。在第二個菜單中,名稱結果將按照他們剛選擇的名稱進行過濾,而不是列出所有洋基隊員,費城人員和播音員名稱。 – tnw 2011-06-13 14:01:25

+0

@Tory如果應該在不重新加載頁面的情況下完成此操作,則需要使用jQuery或類似的工具來完成。 – 2011-06-13 14:04:04