2012-09-09 38 views
4

不知道我该如何做到这一点。基本上我有变量填充一个组合框,然后通过where子句传递给MQSQL查询的过滤器。我需要做的是允许用户将组合框留空,然后在where子句中忽略该变量。这可能吗?可能让PHP MYSQL查询忽略WHERE子句中的空变量?

即,来自该代码。假设填充$ value1的组合框是空的,有什么办法可以忽略这个,只有第二个过滤器被应用。

$query = "SELECT * FROM moth_sightings WHERE user_id = '$username' AND location = '$value1' AND english_name = $value2 "; 
$result = mysql_query($query) or die(mysql_error()); 
$r = mysql_numrows($result); 

感谢您的任何帮助。 ç

+4

检查'$ value1'是否为空,并且不要追加'AND位置='$ value1'来查询。 BTW不使用'mysql_ *',因为它不推荐使用 –

回答

12

使用

$where = "WHERE user_id = '$username'"; 

if(!empty($value1)){ 
$where .= "and location = '$value1'"; 
} 

if(!empty($value2)){ 
$where .= "and english_name= '$value2 '"; 
} 


$query = "SELECT * FROM moth_sightings $where"; 
$result = mysql_query($query) or die(mysql_error()); 
$r = mysql_numrows($result); 
+0

为什么-1 ???????????????? – shail

+0

道歉。没有故意点击。由于我是新用户,它不会让我投票,但这非常有帮助。我再次为意外投票道​​歉。 – user1658170

+1

我不知道是谁做的,但再投了,也改变了凡在IF的进入和,和后“$值1”留出空间,否则将无法正常工作;) – dbf

0

当然,

$sql = ""; 
if(!empty($value1)) 
    $sql = "AND location = '{$value1}' "; 
if(!empty($value2)) 
    $sql .= "AND english_name = '{$value2}'"; 

$query = "SELECT * FROM moth_sightings WHERE user_id = '$username' {$sql} "; 
$result = mysql_query($query) or die(mysql_error()); 
$r = mysql_numrows($result); 

要知道SQL注入和mysql_ *的弃用,使用库MySQLi或PDO来代替

+1

你在变量'$ sql'的最后一个实例中有一个输入错误。你写了'$ sq'。我试图编辑,但不能(6封信分钟) –

+1

@iight感谢;) – dbf

0
if (isset($value1)) 
$query = "SELECT * FROM moth_sightings WHERE user_id = '$username' AND location = '$value1' AND english_name = $value2 "; 
else 
$query = "SELECT * FROM moth_sightings WHERE user_id = '$username' AND english_name = $value2 "; 

但是,你也可以做一个函数返回查询根据您的输入。 也不要忘记在生成查询之前逃脱你的$values

0

1)不使用MySQL的简单PHP扩展,使用先进的mysqli扩展或更安全的PDO/MDB2包装。

2.)不要指定像这样的完整陈述(除此之外,你甚至不编码和转义给定的值...)。相反,使用这样的:

sprintf("SELECT * FROM moth_sightings WHERE 1=1 AND %s", ...); 

然后填写使用数组持有的所有值,你实际上是从您的形式获取原始查询:

$clause=array(
    'user_id="'.$username.'"', 
    'location="'.$value1.'"', 
    'english_name="'.$value2.'"' 
); 

你可以以任何方式操纵该阵列,例如测试为空值或任何其他。现在只是爆阵列从上面完成了原始的问题:

sprintf("SELECT * FROM moth_sightings WHERE 1=1 AND %s", 
     implode(' AND ', $clause)); 

大优势:即使条款阵列完全是空的查询语法是有效的。

0

首先,请阅读约SQL Injections。其次,$ r = mysql_numrows($ result)应该是$ r = mysql_num_rows($ result); $ r = mysql_num_rows($ result);

你可以,如果在MySQL中使用,这样的事情:

SELECT * FROM moth_sightings WHERE user_id = '$username' AND IF('$value1'!='',location = '$value1',1) AND IF('$value2'!='',english_name = '$value2',1); -- BUT PLEASE READ ABOUT SQL Injections. Your code is not safe. 
+0

谢谢你,我知道SQL注入。这只是为了帮助我学习之前,我明白了。 – user1658170

+0

好的。希望MySQL中的IF能帮助你解决你的问题。 if的语法是IF(condition,[if true],[if false])。在[如果假],我把“1”,只是返回true,这样就不会影响到其他条件。 – rationalboss

0

我想到了另外两种方式来解决这个问题:

SELECT * FROM moth_sightings 
WHERE 
     user_id = '$username' 
     AND location = '%$value1%' 

     AND english_name = $value2 "; 

这会返回结果只对本user_id,其中位置字段包含$value1如果$ value1为空,这将仍然返回此user_id的所有行,不管是否为空。


OR

SELECT * FROM moth_sightings 
WHERE 
     user_id = '$username' 
     AND (location = '$value1' OR location IS NULL OR location = '') 
     AND english_name = $value2 "; 

这会给你这个user_id$value1的位置或具有空值的所有行。