2011-06-13 103 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