我有一个用PHP处理的HTML表单。
表单中的输入用作SQL WHERE子句中的条件。
当没有输入时,WHERE子句查找空字符串并且不会返回任何内容。相反,我想返回所有行。
如何实现这一目标?我考虑过使用LIKE,但是当确实有输入时,我想只匹配精确的输入。
要明确:
我想检查输入存储的变量是否为空。如果是这样,我想返回所有行。
我想知道是否可以在SQL中执行此类操作而无需更改语句。相反,只需更改变量。
请注意,可以有多个输入字段。
编辑:
忽略安全风险的可能性。是否有一个SQL命令可以实现这一点而无需更改查询本身,只是变量?对于记录,我已经在查询之前检查变量是否为空字符串。另外,如果我检查变量是否为空,安全风险会在哪里,否则我会进行适当的验证?
答案 0 :(得分:2)
由于你不能直接在SQL查询中使用用户生成的字符串(参见PHP: SQL Injection),我会在PHP脚本中处理,而不是在SQL中处理:
if(isset($user_input) && !empty($user_input)) {
// add WHERE clause
}
如果选中isset()
,则 修改 !empty()
是多余的。这也可以:
if(!empty($user_input)) {
// add WHERE clause
}
感谢AbraCadaver!
答案 1 :(得分:1)
在查询上动态添加过滤器的常用方法是:
$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);
答案 2 :(得分:0)
这可以允许您使用相同的查询,并在空白时有效地忽略该参数。我不确定我是否会实际推荐它来代替构造一个(仍然参数化的)查询,因为它可能不会一直与索引一起使用,但它是可能的。
WHERE ([my_parameter] = '' OR the_field = [my_parameter])
更加普遍:
WHERE ([my_parameter] = [ignore value] OR the_field = [my_parameter])