当前位置: 首页 > 面试题库 >

如何在PHP中准备好的mysqli查询中忽略参数?

皮弘博
2023-03-14
问题内容

我有一个准备好的mysqli查询,如下所示:

$query = $database->prepare("SELECT * FROM items WHERE inStock > ? AND size < ? AND name LIKE ?");            
$query->bind_param('iis', $inStock, $size, $name);              
$query->execute();

WHERE子句中有许多条件可以过滤结果。问题在于,这些参数以搜索形式提供,并且不是必需的。例如,某人可以同时使用名称,或仅使用大小和名称,或使用大小,名称和inStock进行搜索。

我需要某种方式来调整查询,以便仅提供所需的参数。我能想到的唯一解决方案是制作一个巨大的if..else结构,其中存在具有所有搜索选项组合的预先准备好的查询,但是由于有成千上万的组合,所以这是不可能的。

我能想到的唯一实际可行的解决方案是使用未准备好的查询,在此情况下,我将条件与诸如 $query .= "AND name LIKE '%".escapestuff($_POST['name'])."%'"

但这很丑陋,我非常想保留准备好的查询系统。


问题答案:

您可以建立条件列表,然后将绑定值和类型添加到列表中,这里是一个快速的模型,它使用了您引用的两个字段…

$data = [];
$params = "";
$where = [];
if ( !empty($name)) {
    $data[] = $name;
    $params.="s";
    $where[] = "name like ?";
}
if ( !empty($size)) {
    $data[] = $size;
    $params.="i";
    $where[] = "size < ?";
}
$sql = "SELECT * FROM items";
if ( count($where) > 0 ){
    $sql .= " where ". implode ( " and ", $where);
}
$query = $database->prepare($sql);
$query->bind_param($params, ...$data);
$query->execute();

请注意,bind_param()使用...可以让您传递数组而不是各个字段。



 类似资料:
  • 问题内容: 我正在尝试准备好的语句,但是下面的代码不起作用。我收到错误消息: 致命错误:在第12行的/var/www/prepared.php中的非对象上调用成员函数execute() 另外,我需要对准备好的语句使用mysqli吗?谁能指出我关于从连接到插入再到带有错误处理的选择的准备好的语句的完整示例? 问题答案: 从文档: 在执行语句或获取行之前,必须使用mysqli_stmt_bind_pa

  • 以下代码在准备时失败: 我发现:警告:mysqli::prepare()[mysqli.prepare]:无法获取mysqli。。。我在上面的代码中做错了什么?我检查了语法文档,但是如果我尝试将查询作为sql进行pas,我会得到一个语法错误。对于mysqli语法错误是否有一个好的调试工具?

  • 问题内容: 在mysqli准备好的语句中,NULL变成’‘(对于字符串)或0(对于整数)。我想将其存储为真正的NULL。有什么办法吗? 问题答案: 我知道这是一个旧线程,但是可以将真实的NULL值绑定到准备好的语句(请阅读this)。 实际上,您可以使用mysqli_bind_parameter将NULL值传递给数据库。只需创建一个变量并将NULL值(请参见手册页)存储到该变量并将其绑定即可。无论

  • 和使用它的字段: 当使用Solr分析工具时,一切看起来都很好。 查询部分如下: null null

  • 我试图理解什么时候应该在php/mysqli中使用准备好的语句。每个php/mysqli查询应该使用准备好的语句,还是只使用涉及用户输入的查询和实例。。。比如一个html表单,它要求用户输入要在数据库中搜索的数据? 我正在将旧的php5/mysql代码迁移到php7/mysqli。我有许多查询mysql数据库的php文件。我想澄清一下,如果我需要为每个连接到mysql数据库的php文件使用准备好的

  • Spring Hateoas没有为以下请求映射创建适当的链接: 致电/会员/12345时,您希望返回: 但相反,它返回: 这是为什么?即使我使用@Request estParam,它也完全忽略了过滤器。在这件事上,任何建议都将受到赞赏。