[英]php Nested if else 4 conditions not working
我有4个if / else条件,4个条件中只有3个可以正常工作,条件中的值将具有数字和文本的组合,这是导致问题的原因。
我不确定,有人可以告诉我这是否是造成此问题的方法吗,还有其他方法吗?
在下面的代码中,我提到了从表单传递的2个变量的值。 在这种情况下,理想情况下应转到第3个条件,但条件应转到第4个条件。
我的PHP代码的一部分:
echo "category :".$option." ".$suboption." "; //Values displayed for $option is 4 and $suboption is Nitrogen
if ($option==0 && $suboption==0)
$dc=mysql_query("SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER ORDER BY Ac_code, Prod_desc");
else{
if($option==0 && $suboption!=0)
$dc=mysql_query("SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER WHERE Prod_desc='$suboption' ORDER BY Ac_code, Prod_desc");
else{
if($option!=0 && $suboption!=0)
$dc=mysql_query("SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER WHERE Ac_code='$option' AND Prod_desc='$suboption' ORDER BY Ac_code, Prod_desc");
else{
if($option!=0 && $suboption==0)
$dc=mysql_query("SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER WHERE Ac_code='$option' ORDER BY Ac_code, Prod_desc");
}
}
}
这是错误的代码。
不要使用太多(如果没有)条件,请根据您的条件定义变量并使用切换用例,或者在以下情况下使用else if
不要将字符串“ nitrogen”与数字0进行比较
参见: http : //codepad.org/8a4qFgmf
。
<?php
$myVar = ('Nitrogen' == 0);
var_dump($myVar); // THIS IS TRUE
?>
怎么样做这样的事情(尽管对于用户定义的数据来说这仍然是不安全的(需要正确地转义)
<?php
function array_map_assoc( $callback , $array ){
$r = array();
foreach ($array as $key=>$value)
$r[$key] = $callback($key,$value);
return $r;
}
function funtimes($option, $suboption) {
$query = "SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER%sORDER BY Ac_code, Prod_desc";
$clause = array("Ac_code" => $option, "Prod_desc" => $suboption);
$clause = array_filter($clause);
$where = ' ';
if (count($clause)) {
$where = " WHERE " . implode(', ',array_map_assoc(function($k,$v){return "$k='$v'";},$clause)) . " ";
}
echo "For option=$option, suboption=$suboption\n";
echo sprintf($query, $where);
echo "\n\n";
}
funtimes(0, 0);
funtimes(1, 0);
funtimes(0, 1);
funtimes(1, 1);
输出值
For option=0, suboption=0
SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER ORDER BY Ac_code, Prod_desc
For option=1, suboption=0
SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER WHERE Ac_code='1' ORDER BY Ac_code, Prod_desc
For option=0, suboption=1
SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER WHERE Prod_desc='1' ORDER BY Ac_code, Prod_desc
For option=1, suboption=1
SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER WHERE Ac_code='1', Prod_desc='1' ORDER BY Ac_code, Prod_desc
现在您有了正确的查询,因此只需执行它即可。
是的,可以清除代码,但是对于您的代码,如果您的输入既是数字又是文本,并且如果0表示无选择,并且空字符串表示无选择(这就像您在做什么),则替换条件为
if ($option==0 && $suboption==0)
to
if ($empty(option) && empty($suboption))
同样。
我会写这样的代码
$qry = 'SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER';
$where = ' WHERE ';
$post = ' ORDER BY Ac_code, Prod_desc';
$clause = '';
if(!empty($option))
{
$clase = $where . " Ac_code='$option'";
$where = " AND ";
}
if(!empty($suboption))
{
$clase = $where . " Prod_desc='$suboption'";
}
虽然我同意DhruvPathak的观点,但这是对您的代码进行了一些整理。 切换可能不是最佳选择,因为您正在比较两件事,而不仅仅是一件事。
//initialize variables
$option = $suboption = 0;
// get option values
//...your code here...
$sql = "SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER";
if ($option!=0 && $suboption==0) {
$sql .= " WHERE Ac_code='$option'";
}
elseif($option==0 && $suboption!=0) {
$sql .= " WHERE Prod_desc='$suboption'";
}
elseif($option!=0 && $suboption!=0) {
$sql .= " WHERE Ac_code='$option' AND Prod_desc='$suboption'";
}
$sql .= " ORDER BY Ac_code, Prod_desc";
$dc = mysql_query($sql);
请注意,如果您通过GET或POST获取选项和子选项值,则这些查询容易受到SQL注入攻击。 还有更好的方法来进行数据提取。
根据您的反馈,这行得通吗?
$sql = "SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER";
if ($option!=0) {
$sql .= " WHERE Ac_code='$option'";
if ( (int)$suboption >= 0 || strlen($suboption) > 1)
$sql .= " AND Prod_desc='$suboption'";
}
elseif($option==0 && ((int)$suboption >= 0 || strlen($suboption) > 1) ) {
$sql .= " WHERE Prod_desc='$suboption'";
}
$sql .= " ORDER BY Ac_code, Prod_desc";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.