php - 动态查询不使用多选过滤器返回数据
问题描述
我的查询有问题。我有一个表单搜索,其中包含多种类型的选择值。一些过滤器是单选,其中一些是多选值(强制性)。我的问题是当我有多项选择并且需要在我的查询子句WHERE
中使用LIKE AND OR
.
我使用动态查询 PDO 构建我的结果页面,并且WHERE
子句是 implode 和 connect with AND
,但我不知道如何添加OR
,因为使用多项选择不是强制性的。我在 Result.php 上的代码是:
if (isset($_POST["submit"])) {
$conditions = [];
$parameters = [];
if (isset($_POST["reg"])) {
$conditions[] = 'region = ? ';
$parameters[] = isset($_POST['reg']) ? $_POST['reg'] : '' ;
}
if(isset($_POST["paravilw"])) {
$conditions[] = 'stt_rsw = ? ';
$parameters[] = isset($_POST['paravilw']) ? $_POST['paravilw'] : '' ;
}
if (isset($_POST["pros_tre"])) {
$prev_table ='" OR pros_tresit LIKE "';
$value_rank = $_POST["pros_tre"];
$value_rank_implode = "" . implode("%" .$prev_table."%", $_POST['pros_tre']) .""; - ---i tried to use implode but is not return if i have multi selection
$value_rank_explode = explode('|', $value_rank_implode);
$conditions[] = ' pros_tresit LIKE ? ';
$parameters[] = '%'.$value_rank_implode.'%';
//$parameters[] = '%' . implode("%' or pros_tresit like '%", $_POST['pros_tre']) .'%';
var_dump($parameters);
//print_r($parameters);
}
$sql = "SELECT * FROM import ";
if ($conditions)
{
$sql .= " WHERE " .implode(" AND ", $conditions);
}
$stmt = $pdo->prepare($sql);
$stmt->execute($parameters);
$data = $stmt->fetchAll();
$total_row = $stmt->rowCount();
$output = '';
}
现在我将解释我试图做什么。我使用 implode 方法OR pros_tresit LIKE
手动添加每个选定的新值。
$prev_table ='" OR pros_tresit LIKE "';
$value_rank_implode = "" . implode("%" .$prev_table."%", $_POST['pros_tre']) .""; - ---i tried to use implode but is not return if i have multi selection
但不是返回数据我的var_dump($sql)
结果是
SELECT * FROM import WHERE region = ? AND stt_rsw= ? AND pros_tresit LIKE ?
我var_dump($parameters);
的是:
array(3) { [0]=> string(2) "NOS" [1]=> string(4) "TRUS" [2]=> string(43) "%Sil%" OR pros_tresit LIKE "%Unr%"
如果复制粘贴最后一个数组 [2] 并在我的数据库中手动运行它可以工作并返回数据变成这样:
SELECT * FROM import WHERE region = 'NOS' AND stt_rsw = 'TRUS' AND pros_tresit LIKE "%Sil%" OR pros_tresit LIKE "%Unr%"
我不知道如何通过多选解决这个问题OR table_name LIKE
你能帮我吗?
解决方案
嘿伙计们,我找到了一种有效的方法,但不是我期望的那样
- 我评论了所有代码
if (isset($_POST["pros_tre"])) {
$prev_table ='" OR pros_tresit LIKE "';
$value_rank = $_POST["pros_tre"];
$value_rank_implode = "" . implode("%" .$prev_table."%", $_POST['pros_tre']) .""; - ---i tried to use implode but is not return if i have multi selection
$value_rank_explode = explode('|', $value_rank_implode);
$conditions[] = ' pros_tresit LIKE ? ';
$parameters[] = '%'.$value_rank_implode.'%';
//$parameters[] = '%' . implode("%' or pros_tresit like '%", $_POST['pros_tre']) .'%';
var_dump($parameters);
//print_r($parameters);
}
而且我在这里做了类似的事情,其余代码在所有条件下都非常好
if ($_POST["pros_tre"] && $conditions){
$sql = "SELECT * FROM import ";
$sql .= " WHERE " .implode(" AND ", $conditions);
$sql .= " AND pros_tresit LIKE '%" . implode("%' or pros_tresit like '%", $_POST['pros_tre']) ."%'";
}
我要感谢来自 GitHub 的“noahheck”,因为我安装在我的项目中
当您有大量查询并需要查看它在 SQL 中的数据时非常有用。例如,这个函数可以帮助我调试我的查询语句。
我知道这不是完美的解决方案,但暂时它可能会在几周或几个月内起作用,在我获得更多关于 PHP 的知识后,我会弄清楚如何去做。
感谢stackoverflow
推荐阅读
- windows - 它可以创建一个自定义批处理,用于将自定义扩展文件移动到新创建的文件夹
- python - 如何在单个命令中将角色与频道相关联?如何获取角色ID?
- javascript - 组中的新图层
- c# - 使用 tcpclient 和服务器进行 C# 文件传输
- postgresql - PostgreSQL, Pl/pgsql - 如何访问执行我所在的存储过程的查询字符串?
- javascript - odoo 12 - 无法读取未定义的属性“getBoundingClientRect”
- python - 如何计算数据帧每行多个 Python Pandas datetime64[ns] 值的平均值?
- gekko - 通过分段线性段逼近非线性函数
- php - tcp上的php原始套接字
- c - 这个函数给我的程序一个核心转储,我不知道为什么