我正在尝试按升序和降序的不同字段对数据进行排序。但是我有4个字段的不同mysql pdo语句(总共8个查询):
$stmt1 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field1 DESC");
$stmt2 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field1 ASC");
$stmt3 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field2 DESC");
$stmt4 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field3 ASC");
$stmt5 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field3 DESC");
$stmt6 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field3 ASC");
$stmt7 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field4 DESC");
$stmt8 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field4 ASC");
根据输入,我选择正确的语句并绑定并执行它。
if ($sortcode == 1){
$stmt1->bindParam(':categ', $categ, PDO::PARAM_STR);
$stmt1->execute();
$fetched = $stmt1->fetchAll(PDO::FETCH_ASSOC);
} else if ($sortcode == 2){
$stmt2->bindParam(':categ', $categ, PDO::PARAM_STR);
$stmt2->execute();
$fetched = $stmt2->fetchAll(PDO::FETCH_ASSOC);
} else if ($sortcode == 3){
$stmt3->bindParam(':categ', $categ, PDO::PARAM_STR);
$stmt3->execute();
$fetched = $stmt3->fetchAll(PDO::FETCH_ASSOC);
}
//repeat the block 5 more times, for a total of 8
这看起来并不正确。由于select语句只是字段名称和desc / asc不同,有没有更好的方法来获取$sortcode
并压缩后面的代码?
我想我可以更具体地说明这个问题:我有没有办法让一个语句/单个pdo语句动态绑定字段名称和asc / decs?
答案 0 :(得分:4)
使用关联数组来保存预准备语句。
您的输入是一个列和一个排序方法,对吗?因此,请通过以下方式准备查询:
$columns = array("field1", "field2", "field3", "field4");
$orders = array("asc", "desc");
$queries = array();
foreach($columns as $col) {
$queries[$column] = array();
foreach ($orders as $order) {
$queries[$column][$order] = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY $column $order");
}
}
现在,要查找正确的查询,您不需要一些合成代码 - 您只需按列查找并直接订购。
要查找查询,请让用户输入一个列和一个订单,而不是让用户输入1-8中的数字。想象一下,该列位于变量$ col中,订单位于$ ord中。只要说$ queries [$ col] [$ ord]。
如果由于某种原因你必须使用这个数字(为什么?),那么你需要一个稍微不同的策略。在这种情况下,您可以按该号码存储查询 。
$columns = array("field1", "field2", "field3", "field4");
$orders = array("asc", "desc");
$queries = array();
$i = 0;
foreach($columns as $col) {
foreach ($orders as $order) {
$i = $i + 1;
$queries[$i] = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY $column $order");
}
}
换句话说,您应该根据计划查找的方式存储查询。
答案 1 :(得分:1)
您可以按列号排序,可以参数化。如果在select子句中指定列,则以这种方式使用ORDER BY通常更清晰。我不确定ASC / DESC是否可以参数化,但是......
答案 2 :(得分:0)
您始终可以动态构建查询。将地图存储在$sortcode
和列之间,SELECT * FROM tabname WHERE categ=:categ
部分,根据$sortcode
获取正确的列名称并添加ORDER BY ...
部分。