为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL 表上可选的多个过滤器

MySQL 表上可选的多个过滤器

PHP
慕慕森 2023-03-04 14:58:05
所以我有一个包含以下列的数据库表:IDFooBarGuxFoo 可以保存值 [a, b, c],Bar [1, 2, 3] 和 Gux [x, y, z]。在我的界面中,我有一个 HTML 选择框来过滤 Foo、Bar 和 Gux。问题是用户可以按随机顺序过滤一个、两个或三个参数。这给了我一个问题来制作一个有效的 SQL 查询和 bind_param。我可以这样做://Pseudo code$sql = "";if (isset($_GET['foo'])) {    $sql = "SELECT * FROM ... WHERE foo=?";}if (isset($_GET['bar'])) {    $sql = "SELECT * FROM ... WHERE bar=?";}if (isset($_GET['gux'])) {    $sql = "SELECT * FROM ... WHERE gux=?";}但是如果使用选择的 foo 和 bar 呢?这也将非常丑陋并且也难以实现 bind_params。理想将是一个通配符,所以我可以做//Pseudo code$sql = "SELECT * FROM ... WHERE foo=* AND bar=* AND gux=*";*并且只有在为该列选择过滤器时才用实际值替换。但这不支持整数。我想到的另一种选择是执行以下操作://Pseudo code$sql = "SELECT * FROM ... WHERE foo=filter1 OR bar=filter2 OR gux=filter3";并在选择该列的值时以编程方式替换OR为。AND这也将解决 bind_param 问题。但我不知道这是否是最好的方法。
查看完整描述

1 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

正如动态构建 WHERE 子句。此代码假定至少有 1 个选项(否则也有条件地添加 WHERE。)


每个部分连同相应的绑定数组一起添加到列表中,这显示了数据,您需要为数据库添加实际的 API 部分。implode()WHERE 部分使用withAND作为胶水放在一起......


$binds = [];

$where = [];

$types = '';

if (isset($_GET['foo'])) {

    $where[] = "foo=?";

    $binds[] = $_GET['foo'];

    $types .= "s";

}

if (isset($_GET['bar'])) {

    $where[] = "bar=?";

    $binds[] = $_GET['bar'];

    $types .= "s";

}

if (isset($_GET['gux'])) {

    $where[] = "gux=?";

    $binds[] = $_GET['gux'];

    $types .= "i";

}


$sql = "SELECT * FROM ... WHERE " . implode(" AND ", $where);


echo $sql.PHP_EOL;

print_r($binds);

在 foo 值中使用 1 给出...


SELECT * FROM ... WHERE foo=?

Array

(

    [0] => 1

)

bind_param()然后在...中使用类型和绑定


bind_param($types, ...$binds);


查看完整回答
反对 回复 2023-03-04
  • 1 回答
  • 0 关注
  • 148 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号