gpt4 book ai didi

php - PDO 多过滤器 sql 查询

转载 作者:行者123 更新时间:2023-12-04 05:37:26 25 4
gpt4 key购买 nike

有没有一种更简单的方法可以让我编写代码并执行相同的操作而不必进行如此多的查询?我正在尝试添加分页(未包含在此处的代码中)并且它适用于我的 ALL 查询,但是 AND/OR 查询给出了有趣的结果并且变得令人头疼。除此之外,结果过滤效果完美,只需要分页。

$filter = isset($_POST['filter']) ? $_POST['filter'] : null;
$status = isset($_POST['status']) ? $_POST['status'] : null;

if(empty($filter) && empty($status)) {

//echo 'ALL query';
$sql = 'SELECT * FROM _product JOIN _module_type ON module_type = module_id';
$sth = $link->prepare($sql);
$sth->execute(array());
$result = $sth->fetchall();

} else {
// display result if filter AND status are selected
if(!empty($filter) && !empty($status)) {

//echo 'AND query';
$sql = 'SELECT * FROM _product JOIN _module_type ON module_type = module_id WHERE module_type = :filter AND product_status = :status';
$sth = $link->prepare($sql);
$sth->execute(array(':filter' => $filter, ':status' => $status));
$result = $sth->fetchall();

} else {
// display result if filter OR status are selected
if(!empty($filter) || !empty($status)) {

//echo 'OR query';
$sql = 'SELECT * FROM _product JOIN _module_type ON module_type = module_id WHERE module_type = :filter OR product_status = :status';
$sth = $link->prepare($sql);
$sth->execute(array(':filter' => $filter, ':status' => $status));
$result = $sth->fetchall();

}
}
}

//test sql
echo $sql.'<br />';

$bgcolor = '';
foreach($result as $key => $value) {

if(($bgcolor=='#ffffff') ? $bgcolor='#f1f1f1' : $bgcolor='#ffffff') {

echo '<tr bgcolor="'.$bgcolor.'">';
echo '<td>'.$value['product_id'].'</td>';
echo '<td>'.$value['product_name'].'</td>';
echo '<td>'.$value['product_type'].'</td>';
echo '<td>'.$value['module_name'].'</td>';
echo '<td>'.$value['product_price'].'</td>';
echo '<td>'.$value['product_status'].'</td>';
echo '</tr>';
}
}
echo '</table>';

最佳答案

我的第二个想法:

$sql = 'SELECT * FROM _product JOIN _module_type ON module_type = module_id WHERE';
if(!empty($filter) || !empty($status)){
$sql .= ' module_type = :filter '.(!empty($filter) && !empty($status) ? 'AND' : 'OR').' product_status = :status';
$sth = $link->prepare($sql);
$sth->bindValue(':filter', $filter);
$sth->bindValue(':status', $status);
}else{ $sth = $link->prepare($sql); }
$result = $sth->execute();

它需要测试,正如事实所说,您可能不需要 OR 但这正是您的表单和过滤的工作方式 tbh,但我将保留它,它应该为您提供进入下一阶段的指示。

再次编辑:

忍不住了,这是第三种可能性:
$params = array();
$where = array();

if(!empty($filter)){
$params[':filter'] = $filter;
$where[] = 'module_type = :filter';
}
if(!empty($status)){
$params[':status'] = $status;
$where[] = 'product_status = :status';
}

$sql = 'SELECT * FROM _product JOIN _module_type ON module_type = module_id'.(sizeof($where) > 0 ? ' WHERE '.implode(' AND ', $where) : '');

$sth = $link->prepare($sql);
foreach($params as $k=>$v) $sth->bindValue($k, $v);
$result = $sth->execute();

关于php - PDO 多过滤器 sql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11747756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com