Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 减少仅按字段名顺序不同的mysql语句_Php_Mysql_Database_Pdo - Fatal编程技术网

Php 减少仅按字段名顺序不同的mysql语句

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-

我尝试按不同的字段升序和降序对数据进行排序。但我对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?

您可以按列编号排序,这可以参数化。如果在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个块的主代码仍然是一样的,没有减少+尽管这不是我要问的问题,但我对回复进行了编辑,以进一步解释它实际上是如何解决您的问题的。