我有一个用PHP处理的HTML表单。
表单中的输入用作SQL WHERE子句中的条件。
当没有输入时,WHERE子句将查找空字符串,并且不会返回任何内容。相反,我想返回所有行。
如何做到这一点?我考虑过使用LIKE代替,但我只想在确实有输入时匹配精确的输入。
说明:
我想检查存储输入的变量是否为空。如果是,我想返回所有行。
我想知道是否有可能在SQL中做这样的事情而不必改变周围的语句。相反,只需改变变量。
注意可以有多个输入字段
编辑:忽略可能存在的安全风险。是否有一个SQL命令可以在不改变查询本身的情况下实现这一点,只是改变变量?对于记录,我已经在查询之前检查变量是否为空字符串。此外,如果我检查变量是否为空,并且我正在进行适当的验证,那么安全风险在哪里?
既然不应该在SQL查询中直接使用用户生成的字符串(参见PHP: SQL注入),我将在PHP脚本中处理,而不是在SQL:
中处理if(isset($user_input) && !empty($user_input)) {
// add WHERE clause
}
Edit: isset()
是多余的,如果检查!empty()
。这个也可以:
if(!empty($user_input)) {
// add WHERE clause
}
谢谢AbraCadaver !
在查询中动态添加过滤器的常用方法是:
$sql ='select * from table where (1=1) ';
if (array_key_exists($_POST,'email'))
{
$email=mysql_real_escape_string($_POST['email']);
$sql.=" and (email='$email')";
}
if (array_key_exists($_POST,'city'))
{
$city=mysql_real_escape_string($_POST['city']);
$sql.=" and (city='$city')";
}
//.....
mysql_query($sql);
这允许您使用相同的查询,并且有效地忽略空参数。我不确定我是否真的会推荐它来代替构造一个(仍然是参数化的)查询,因为它可能并不总是很好地处理索引,但这是可能的。
WHERE ([my_parameter] = '' OR the_field = [my_parameter])
更广义:
WHERE ([my_parameter] = [ignore value] OR the_field = [my_parameter])