Php 减少仅按字段名顺序不同的mysql语句
我尝试按不同的字段升序和降序对数据进行排序。但我对4个字段使用了不同的mysql pdo语句,总共有8个查询:Php 减少仅按字段名顺序不同的mysql语句,php,mysql,database,pdo,Php,Mysql,Database,Pdo,我尝试按不同的字段升序和降序对数据进行排序。但我对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-
$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?您可以按列编号排序,这可以参数化。如果在select子句中指定列,则以这种方式使用ORDER BY通常更清晰。我不确定ASC/DESC是否可以参数化,不过…您可以按列号排序,列号可以参数化。如果在select子句中指定列,则以这种方式使用ORDER BY通常更清晰。我不确定ASC/DESC是否可以参数化,不过…您始终可以动态构建查询。存储$sortcode和列之间的映射,查询的SELECT*FROM选项卡名WHERE categ=:categ部分,根据$sortcode获取正确的列名,并按以下方式添加订单。。。部分。您始终可以动态生成查询。存储$sortcode和列之间的映射,查询的SELECT*FROM选项卡名WHERE categ=:categ部分,根据$sortcode获取正确的列名,并按以下方式添加订单。。。部分。使用关联数组保存准备好的语句 您的输入是一个列和一个排序方法,对吗?因此,通过以下方式准备查询:
$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中。只要说$querys[$col][$ord]
如果出于某种原因,你不得不使用“为什么?”这个数字,那么你需要一个稍微不同的策略。在这种情况下,您将按该编号存储查询
换句话说,您应该根据计划如何查找查询来存储查询。使用关联数组来保存准备好的语句 您的输入是一个列和一个排序方法,对吗?因此,通过以下方式准备查询:
$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中。只要说$querys[$col][$ord]
如果出于某种原因,你不得不使用“为什么?”这个数字,那么你需要一个稍微不同的策略。在这种情况下,您将按该编号存储查询
换句话说,您应该根据计划查找查询的方式来存储查询。我可以同时使用列名还是只使用列号?我可以同时使用列名还是只使用列号?通过字符串连接构建查询的一部分是否会像您建议的那样稀释pdo的安全特性?categ是用户提供的数据,其余的不是,因为它是我的。我的猜测是否定的,但只是想再次检查一下。您添加到查询中的只是您的代码,而不是用户输入。是否像您建议的那样,通过字符串连接构建查询的一部分会削弱pdo的安全功能?categ是用户提供的数据,其余的不是,因为它是我的。我的猜测是否定的,但只是想再次检查。您添加到查询中的只是代码,而不是用户输入。+1添加排序列很容易,而且没有列号-Yikes这是一个好主意,但它并不能解决仍然有8个不同pdo语句的大问题。因此,对于每个选项,当涉及到绑定时间时,我仍然必须调用具有不同名称的查询并绑定和执行。所以我上面的8个块的主代码仍然是一样的,没有减少+1尽管为了努力,虽然这不是我想要的。我对回复进行了编辑,以进一步解释它实际上是如何解决您的问题的。+1添加排序列很容易,而且没有列号-Yikes这是一个好主意,但它并不能解决仍然有8个不同pdo语句的大问题。因此,对于每个选项,当涉及到绑定时间时,我仍然必须调用具有不同名称的查询并绑定和执行。所以我上面的8个块的主代码仍然是一样的,没有减少+尽管这不是我要问的问题,但我对回复进行了编辑,以进一步解释它实际上是如何解决您的问题的。