我有一个表单,允许用户根据他们正在搜索的gender
和age
查找任何用户。搜索不需要这两个过滤器,例如,用户可以单独搜索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)){
这表明他们的查询可能有问题?但是字段名称和逻辑对我来说似乎很好,所以我不确定。
答案 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);
这基本上就是我如何解决它,你可能需要根据自己的需要进行修改。再次......超级丑陋,可能超级容易出错。这是一种方法,但我不相信它应该完成。