我正在尝试设置一个搜索功能,我可以输入我想要的内容,也可以从下拉菜单中选择它,但是当字段为空时我希望它显示所有内容。
现在,当我搜索某些内容时,它会起作用,但是当字段为空时,它根本不会显示任何内容。我正在使用prepare和bind_params来设置mysql查询,这就是为什么它很难设置,因为如果变量是空的我不知道如何轻松删除查询的那一部分并且还改变被绑定的变量的数量到查询。这是查询
$stmt = $conn->prepare("SELECT * FROM re_tblcombinationlist WHERE active != ? AND ModifierKey = ? AND (LootItem1Key = ? OR LootItem2Key = ? ) ORDER BY ReportedOn DESC LIMIT ? , ?");
$stmt->bind_param("isssii", $i = 0, $modifier, $lootsearch, $lootsearch, $limits, $max);
$recent1 = infoo($stmt);
我尝试通过添加if if then语句解决它,但它没有改变任何东西
if(!isset($_POST["modifier"])){
$modifier = '';
}else{
$modifier = clean($_POST["modifier"]);
}
if(!isset($_POST["lootsearch"])){
$lootsearch = '';
}else{
$lootsearch = clean($_POST["lootsearch"]);
}
基本上如果修饰符或lootsearch是空的我不希望该部分在mysql查询中,这很容易做但然后它使得处理要绑定的变量的数量非常困难所以我试图找到一个如果变量为空,则使其搜索所有内容。
由于
答案 0 :(得分:1)
我认为我找到了基于此问题的解决方案:http://php.net/manual/en/mysqli-stmt.bind-param.php#109256
首先创建这个类:
class BindParam {
private $values = array();
private $types = '';
public function add( $type, $value ){
$this->values[] = $value;
$this->types .= $type;
}
public function get() {
return array_merge(array($this->types), $this->values);
}
}
在此之后,请确保在代码中导入该类,然后在搜索文件中插入以下行:
//User inputs, just for testing
$active = 0;
$modifier = 5;
$lootsearch = 'item';
$limits = 3;
$max = 5;
//Conditional binding
$bindParam = new BindParam();
$binds = array();
$binds[] = 'active = ?';
$bindParam->add('i', $active);
$query = "SELECT * FROM re_tblcombinationlist WHERE ";
if (!empty($modifier)) {
$binds[] = 'ModifierKey = ?';
$bindParam->add('s', $modifier);
}
if (!empty($lootsearch)) {
$binds[] = ' (LootItem1Key LIKE ? OR LootItem2Key LIKE ?) ';
$bindParam->add('s', $lootsearch);
$bindParam->add('s', $lootsearch);
}
$query .= implode(" AND ", $binds);
$query .= " ORDER BY ReportedOn DESC LIMIT ? , ?";
$bindParam->add('i', $limits);
$bindParam->add('i', $max);
//Uncomment this for debugging
//echo $query . '<br/>';
//Using the above user inputs query should be:
//SELECT * FROM re_tblcombinationlist WHERE active = ? AND ModifierKey = ? AND (LootItem1Key LIKE ? OR LootItem2Key LIKE ?) ORDER BY ReportedOn DESC LIMIT ? , ?
//var_dump($bindParam->get());
//Maybe you have to experiment a bit with those lines
$stmt = $conn->prepare($query);
$stmt->bind_param($bindParam->get());
$recent1 = infoo($stmt);
答案 1 :(得分:1)
我选择使用的最终解决方案是我的上一篇文章和Kostas帖子的组合。
首先我们添加类:
gulp.task('serve', function(cb) {
browserSync({
port: 8080,
server: {
baseDir: "./"
}
});
gulp.watch([
"*.js",
"*.css",
"*.html"
], browserSync.reload, cb);
});
然后我们将这段代码添加到我们想要动态使用查询的地方:
class BindParam {
private $values = array();
private $types = '';
public function add( $type, &$value ){
$this->values[] = &$value;
$this->types .= $type;
}
public function get() {
$array = array_merge(array($this->types), $this->values);
foreach($array as $key => $value)
$refs[$key] = &$array[$key];
return $refs;
}
}
答案 2 :(得分:0)
好吧,我想出了如何让它发挥作用。首先,Kostas所说的大部分内容都是解决方案,我并不是要为自己的工作而努力,但需要稍微改动才能正常工作。
首先我添加了一个功能
function reference($arr){
$refs = array();
foreach($arr as $key => $value)
$refs[$key] = &$arr[$key];
return $refs;
}
然后我改变了这个(来自Kostas的代码)
$stmt->bind_param($bindParam->get());
到
call_user_func_array(array($stmt, 'bind_param'), reference($bindParam->get()));