我想根据用户的请求从表中提取数据列表。
1. $query = "SELECT * FROM users LIMIT 10";
2. $query = "SELECT * FROM users WHERE fname = ? LIMIT 10";
3. $query = "SELECT * FROM users WHERE fname = ? AND mname = ? LIMIT 10";
4. $query = "SELECT * FROM users WHERE fname = ? AND mname = ? AND lname = ? LIMIT 10";
如果没有提供参数,请查询(1)
如果提供了名字,则查询(2)
如果提供了第一个和中间名,则查询(3)
如果全部提供,请查询(4)
我很难知道用户会要求哪一个 如何从上面准备,绑定,执行和获取所选数据的数据?
更新:更多细节。
<?php
$db = new mysqli("It's all OK");
$query = "SELECT * FROM users LIMIT 10";
$fname = (isset($_POST['fname']) AND !empty($_POST['fname'])) ? trim($_POST['fname']) : "";
$mname = (isset($_POST['mname']) AND !empty($_POST['mname'])) ? trim($_POST['mname']) : "";
$lname = (isset($_POST['lname']) AND !empty($_POST['lname'])) ? trim($_POST['lname']) : "";
if(!empty($fname) AND empty($mname) AND empty($lname)){
$query .= " WHERE fname = ? LIMIT 10";
}elseif(!empty($fname) AND !empty($mname) AND empty($lname)){
$query .= " WHERE fname = ? AND mname = ? LIMIT 10";
}elseif(!empty($fname) AND !empty($mname) AND !empty($lname)){
$query .= " WHERE fname = ? AND mname = ? AND lname = ? LIMIT 10";
}
?>
鉴于所有细节,构建了查询,但很难预测用户将要求的内容。
我做了:
$stmt = $db->prepare($query);
现在我遇到了绑定不可预测参数的问题 请帮忙。
答案 0 :(得分:1)
我猜你有变量,比如fname,mname和lname。把它们放在像
这样的数组中$options = ['fname' => $fname, 'mname' => $mname, 'lname'=> $lname];
$defaults = ['fname' => '', 'mname' => '', 'lname'=> ''];
$options = array_merge($defaults, $options);
$options = array_diff($options, []);
$query = "SELECT * FROM users";
foreach ($options as $key => $value){
$query .= " AND $key = ?"
}
$query .= ' LIMIT 10';
答案 1 :(得分:0)
有一个很棒的解决方案
git config --global http.sslVerify false
仅当查询的值不为null时,才会在查询中使用该变量。 这样,对于任意数量的参数组合,您只需要一个查询和一组参数。
$fname = (!empty($_POST['fname'])) ? trim($_POST['fname']) : NULL;
$mname = (!empty($_POST['mname'])) ? trim($_POST['mname']) : NULL;
$query = "SELECT * FROM users WHERE
(? is null OR fname = ?)
AND (? is null OR mname = ?)
AND so on
LIMIT 10";
(你需要将每个变量绑定两次) 但是这种方法只会让你只使用一个查询并直接调用带有常数变量的bind_param()。
但是如果你仍想要绑定未知数量的变量,here is the solution。
如果仅提供lname或fname和lname但没有mname,那么您自己的解决方案将无法工作。
有时候我认为在SO上分享知识是最浪费时间的。
答案 2 :(得分:-1)
感谢所有人的努力回答。我真的很感激。
经过多次尝试后,我将其设法运行。
$stmt->prepare($query);
if(!empty($fname) AND empty($mname) AND empty($lname)){
$stmt->bind_param("s", $fname);
}elseif(!empty($fname) AND !empty($mname) AND empty($lname)){
$stmt->bind_param("ss", $fname, $mname);
}elseif(!empty($fname) AND !empty($mname) AND !empty($lname)){
$stmt->bind_param("sss",$fname,$mname,$lname);
}
$stmt->execute()
并绑定结果,获取所有内容。 它可能不是最佳答案,但确实有效。
再次感谢所有人。