我需要帮助构建查询,我有一个表单(多个下拉列表),需要根据用户选择显示数据表。
filters.php (在服务器端 - ajax)
$criteria[0] = $_POST['Size'];
$criteria[1] = $_POST['Name'];
$criteria[2] = $_POST['Color'];
$criteria[3] = $_POST['Sku'];
$criteria[4] = $_POST['Features'];
$statement = $dbh->prepare("select * from table_name where Sku = :sku AND Size = :size AND Color = :color AND Features LIKE :features ");
$statement->execute(array(':name' => $criteria[1], ':Size'=> $criteria[0], ':color'=>$criteria[2], ':sku'=>$criteria[3], ':features'=> '%'.$features[4].'%'));
$statement->setFetchMode(PDO::FETCH_ASSOC);
$subrows = $statement->fetchAll();
// ect..
当选择所有条件(所有下拉列表都有值)时,调用将返回数据,但如果用户只选择一个,两个或三个下拉菜单,该怎么办?如果使用上面的查询,它将返回一个空表。
我想也许我应该首先检查是否设置了变量,然后为每个场景执行查询?我有点失去了如何实现它。
我们的想法是在数据表旁边有一个带有下拉列表的小div,允许过滤。 感谢
答案 0 :(得分:0)
If
语句可能是最好的方法 - 并将相应的部分添加到查询字符串中:
即。 :
$queryString = "select * from table_name where ";
if($_POST['SKU']){
$queryString .= "Sku = :sku";
}
此外,要处理“AND”部分:
$and = (count($_POST) > 1 ? 1 : 0);
并在每个if
语句中,第一行应为:
$queryString .= ($and ? "AND " : "");
此外,我建议使用ORM,(Idiorm是我个人最喜欢的,我在这个例子中使用它)。
$queryBuilder = ORM::for_table("table");
if($_POST['Sku'])
$queryBuilder = $queryBuilder->where("Sku", $_POST['Sku']);
依此类推。
答案 1 :(得分:0)
检查所需的变量以查看它们是否包含数据,如果是,则必须构建查询。您可以同时添加到阵列!例如:
$myarray = array();
if(!empty($criteria[0])){
$myarray["Size"] = $criteria[0];
}