Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 多if和elseif不能正常工作_Php_Mysql - Fatal编程技术网

Php 多if和elseif不能正常工作

Php 多if和elseif不能正常工作,php,mysql,Php,Mysql,用户被要求选择位置和菜肴来搜索附近的餐馆。现在,若用户只选择特定的菜肴,那个么所有有该菜肴的餐厅都应该从数据库和相同的案例位置中选择。。。这里只是第一部分,而不是其他两个条件。。请帮忙!!请不要考虑注射 下面给出了重定向用户的php部分 <?php if(isset($_REQUEST['location']) && $_REQUEST['cuisine']) { $sql="SELECT * FROM `restaurant` WHERE

用户被要求选择位置和菜肴来搜索附近的餐馆。现在,若用户只选择特定的菜肴,那个么所有有该菜肴的餐厅都应该从数据库和相同的案例位置中选择。。。这里只是第一部分,而不是其他两个条件。。请帮忙!!请不要考虑注射 下面给出了重定向用户的php部分

<?php

    if(isset($_REQUEST['location']) && $_REQUEST['cuisine'])
    {
        $sql="SELECT * FROM `restaurant` WHERE `location_id`='".$_REQUEST['location']."' and `cuisine_id`='".$_REQUEST['cuisine']."' ORDER BY restaurant_name ";
        echo"qu";
    }
    elseif(isset($_REQUEST['location']) && $_REQUEST['cuisine'] ='all cuisine')
    {
        $sql="SELECT * FROM `restaurant` WHERE `location_id`='".$_REQUEST['location']."' ORDER BY restaurant_name ";
        echo"here are result";
    }
    elseif(isset($_REQUEST['cuisine']) && $_REQUEST['location'] ='all location')
    {
        $sql="SELECT * FROM `restaurant` WHERE `cuisine_id`='".$_REQUEST['cuisine']."' ORDER BY restaurant_name ";
        echo"query";
    }
    else
    {
        echo"no result found";
    }
?>
应该是

$_REQUEST['cuisine'] == 'all cuisine'
如果$a='a'将返回true,则不会比较其值

如果你想比较,就必须

if($a == 'a')
下面是一个例子

$a = 'b';
if($a = 'a'){
    echo 'here';
}else{
    echo 'not here';
}
这将在这里输出

选中此处

Single=指定一个值,而==如果左侧的值等于右侧的值,则返回true。

为了使$u REQUEST['cuisine']等于所有的cuisine,首先需要设置变量$u REQUEST['cuisine']。位置同上

因此,只要$_REQUEST['cuisine']=='all cuisine'是真的,那么isset$_REQUEST['cuisine']就将是真的,位置也是如此,这就是为什么这两种情况永远不会发生的原因——它们都被isset$_REQUEST['location']和&$(u REQUEST['cuisine']抢先

我想你要找的是:

<?php
    if(isset($_REQUEST['location'], $_REQUEST['cuisine']))
    {
        if($_REQUEST['cuisine'] === 'all cuisine')
        {
            $sql="SELECT * FROM `restaurant` WHERE `location_id`='".$_REQUEST['location']."' ORDER BY restaurant_name ";
            echo"here are result";
        }
        elseif($_REQUEST['location'] === 'all location')
        {
            $sql="SELECT * FROM `restaurant` WHERE `cuisine_id`='".$_REQUEST['cuisine']."' ORDER BY restaurant_name ";
            echo"query";
        }
        else
        {
            $sql="SELECT * FROM `restaurant` WHERE `location_id`='".$_REQUEST['location']."' and `cuisine_id`='".$_REQUEST['cuisine']."' ORDER BY restaurant_name ";
            echo"qu";
        }
    }
    else
    {
        echo"no result found";
    }
?>
PS:根据其他评论,这也是值得注意的。

我想这样做:

// field name in DB => field name in REQUEST
$fields = array('location_id'=>'location', 'cuisine_id'=>'cuisine');

$cond = array();
foreach($fields as $f=>$p) {
    $v = isset($_REQUEST[$p]) ? mysql_real_escape_string($_REQUEST[$p]) : null;
    if($v && $v!=="all $p") {
        $cond[] = "`$f`='$v'";
    }
}
$sql = "SELECT * FROM `restaurant` WHERE " . join(' AND ', $cond) . " ORDER BY restaurant_name";

// execute $sql query
// ...

我同意$_REQUEST['location']@JamesHalsall也是如此+1在本例中使用===也更好case@JamesHalsall是$_请求['location']相同,请在您的帖子中添加此链接,但这不是真的$a='a'将始终返回真的。它将返回'a'not true,但在本例中它工作,因为'a'ir不为null或空。但如果将“0”替换为“a”,则会看到非常丑陋的区别:确保避开原始输入。使用内联$REQUEST变量进行查询是sql注入的一个巨大安全风险。在查询中,只需使用mysql\u real\u escape\u字符串环绕$\u REQUEST['key'],如下所示:mysql\u real\u escape\u string$REQUEST['key']如果您在PHP5.5下,如果根本没有设置$\u REQUEST['courine'],这将失败。第一行中isset的括号有错误。谢谢@DarkSide-我的代码重新排列有点混乱。现在修好了-根据添加的mysqli\u real\u escape\u字符串,我还修复了isset以正确传递多个参数。这是在SQL表达式中注入接收到的输入时必须做的事情。使用临时变量$LOC和$CUI也稍微简化了表达式,虽然OP明确要求不要考虑注入。不确定原因-可能是有原因的,也可能只是为了避免信息过载。不过,作为参考,这对于防止注入非常重要,您应该在子块内的isset检查之后,直接将location和cartine拉入$loc=$\u请求['location']等,因此,SQL字符串可以简化为'location_id`='$loc'等。请将安全检查和改进归功于@DarkSide。请解释使用联接的逻辑好吗?联接或内爆将合并数组元素,并在它们之间放置'and',并返回类似foo、bar和baz的字符串。我不是说这是最好的方法。如果愿意,您仍然可以使用IF条件。但是通过这种方式,这个代码片段将非常容易配置。例如,若您还需要一个字段,那个么只需将其添加到第一行的$fields数组中,然后。。。仅此而已。我不明白这个格式$v=isset$\u请求[$p]?mysql\u real\u escape\u string$\u请求[$p]:null;如果$v&&$v==所有$p{$cond[]=$f='$v'请逐行仔细阅读。如果你不理解这一点,那么你远远不是一个成功的程序员伴侣:表达式expr1?expr2:expr3在expr1为真时计算为expr2,在expr1为假时计算为expr3。由于PHP5.3,可以省略三元运算的中间部分表达式expr1?:如果expr1的计算结果为TRUE,则expr3返回expr1,否则返回expr3。
// field name in DB => field name in REQUEST
$fields = array('location_id'=>'location', 'cuisine_id'=>'cuisine');

$cond = array();
foreach($fields as $f=>$p) {
    $v = isset($_REQUEST[$p]) ? mysql_real_escape_string($_REQUEST[$p]) : null;
    if($v && $v!=="all $p") {
        $cond[] = "`$f`='$v'";
    }
}
$sql = "SELECT * FROM `restaurant` WHERE " . join(' AND ', $cond) . " ORDER BY restaurant_name";

// execute $sql query
// ...