运行过滤器时的查询不正确 - 查询未执行

时间:2016-04-17 12:19:58

标签: php mysql sql while-loop

我有一个表单,允许用户根据他们正在搜索的genderage查找任何用户。搜索不需要这两个过滤器,例如,用户可以单独搜索gender,并期望找到性别与搜索结果相同的随机用户。

以下是我实现上述目标的方法:

$refined_gender = (htmlentities (strip_tags(@$_POST['gender'])) != 'any' ? htmlentities (strip_tags(@$_POST['gender'])) : '%');
$age_from       = (htmlentities (strip_tags(@$_POST['age_from'])) != 'none' ? htmlentities (strip_tags(@$_POST['age_from'])) : '17');
$age_to         = (htmlentities (strip_tags(@$_POST['age_to'])) != 'none' ? htmlentities (strip_tags(@$_POST['age_to'])) : '50');

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

if (isset($_POST['submit_form'])){

    $sql = "SELECT * FROM users WHERE 
              gender like ? AND 
              age BETWEEN ? AND ? AND 
              username != ? AND 
              account_type != 'admin'
            ORDER BY RAND() 
            LIMIT 1";
    $defined_chat = mysqli_prepare ($connect, $sql);
    mysqli_stmt_bind_param($defined_chat, "ssss",$refined_gender,$age_from,$age_to,$username);
    mysqli_stmt_execute ($defined_chat);

    while ($get_user = mysqli_fetch_assoc($defined_chat)){
        $rand_name = $get_user['username'];
        header ("Location: /messages.php?u=$rand_name");
    } // while closed
    echo "No user found fitting those requirements.";
    mysqli_stmt_close($defined_chat);

    echo $sql;
}

注意:我希望能够在没有性别和年龄选择的情况下进行搜索(可以使用1个过滤器并且搜索应该有效),我使用了通配符%的组合,运算符和PHP的三元运算符(我也试过gender = ? - 但仍然是相同的问题)。

然而,搜索从未奏效,导致我echo $sql。如果我搜索男性用户,然后点击搜索,$sql回复以下内容:

SELECT * FROM users WHERE gender like ? AND age BETWEEN ? AND ? AND username != ? AND account_type != 'admin' ORDER BY RAND() LIMIT 1

同样的想法适用于年龄。如果我搜索年龄介于26至30岁之间的人,$sql回复此信息:

SELECT * FROM users WHERE gender = ? AND age BETWEEN ? AND ? AND username != ? AND account_type != 'admin' ORDER BY RAND() LIMIT 1

这意味着这两个变量都没有被传递到查询中,我不明白为什么不这样做。

还应注意,我在搜索时遇到mysqli_fetch_assoc() expects parameter 1 to be mysqli_result错误:

 while ($get_user = mysqli_fetch_assoc($defined_chat)){

这表明他们的查询可能有问题?但是字段名称和逻辑对我来说似乎很好,所以我不确定。

1 个答案:

答案 0 :(得分:0)

准备好的陈述存在这个小问题。你可以很容易地(在这个时候)用它们做可调查询。所以最终发生的事情是你正在创建和准备你的陈述,如下所示:

SELECT * FROM users WHERE gender = ? AND age BETWEEN ? AND ? AND account_type != 'admin' ORDER BY RAND() LIMIT 1

但实际上它包含的内容如下:

SELECT * FROM users WHERE gender =  AND age BETWEEN 26 AND 30 AND account_type != 'admin' ORDER BY RAND() LIMIT 1

这意味着您在执行中遇到错误。除非你抓住它,否则它不会输出,而且我猜是这样的警告。但这就是为什么你可以到目前为止。

我确实在我的一个项目中解决了这个问题,因为我已经下定决心。我做了很多if != ""次设置,这是UGLY UGLY代码。但它确实有效。

if($gender != ""){
    array_push($selectParams,"gender = ?");
    $bindString .= "s"; 
}

$where = join(" AND ", $selectParams);

这基本上就是我如何解决它,你可能需要根据自己的需要进行修改。再次......超级丑陋,可能超级容易出错。这是一种方法,但我不相信它应该完成。