php代码按列名排序mysql查询表

标签 php mysql

我想使用 php 代码按列名对 mysql 查询表进行排序(女巫是“动态地”获取的 - 列名不固定)。 该脚本仅从查询中获取每一列的正确列名。

...等等...连接到数据库..

    $query = "SELECT a.name,a.surname,b.email,c.phone 
      FROM users as a 
      inner join users_email as b 
      inner join users_phone as c
      WHERE a.id=b.id AND a.id=c.id ";


if (isset($_GET['orderby'])&&
    (($_GET['orderby']=='name') || ($_GET['orderby']=='surname')||($_GET['orderby']=='email')))
{
    $query .= "ORDER BY" . $_GET['orderby'] . "ASC;";
}

$result = mysql_query($query,$con);

echo "<table><table border=1><tr>";

for($i=0; $i < mysql_num_fields($result); $i++){
    $field_info = mysql_fetch_field($result, $i);

    echo '<th><a href="login3.php?orderby='. $field_info -> name .'" >'. $field_info -> name .'</a></th>';
}

while ($row=mysql_fetch_assoc($result)){
    echo "<tr>";
    foreach($row as $_column){
    echo "<td>{$_column}</td>";
    }
    echo "</tr>";
}

echo "</table>";

mysql_close($con);

?>

最佳答案

因为我在这里使用 PDO,所以我会给你连接模板(插入你使用的变量名和 mysql_conn() 就完成了):

//try connecting to database
try 
{
  $dbconn_pdo = new PDO(
    'mysql:host=' . $host . ';dbname=' . $db . ';charset=utf8', $user, $password, 
    array(
      PDO::ATTR_EMULATE_PREPARES => false, 
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    )
  );
}
//catch exception, if connection failed
catch (PDOException $e) 
{
  echo ("Error: cannot connect to database<br/>"); 
  die();
}

给定您的示例,要对表进行排序,您可以从链接中获取需要排序的列名(您将在稍后构建它),因此查询变为:

$query = "SELECT a.name,a.surname,b.email,c.phone 
      FROM users as a 
      inner join users_email as b 
      inner join users_phone as c
      WHERE a.id=b.id AND a.id=c.id";

这里我们检查顺序:

if (isset($_GET['orderby']) && 
(($_GET['orderby'] == 'name') || ($_GET['orderby'] == 'surname') || ($_GET['orderby'] == 'email') || ($_GET['orderby'] == 'phone')))
{
  $query .= " ORDER BY " . $_GET['orderby'] . " ASC; ";
}

要获取查询结果,请使用:

$result = $dbconn_pdo->query($query);

现在,列名已从查询本身获知,因此无需调用函数来检索它们(如果您真的需要该功能,请查看 http://www.php.net/manual/en/pdostatement.getcolumnmeta.php ):

?>
<table><table border=1>
  <tr>
    <th><a href="so-wwwglro.php?orderby=name">Name</a></th>
    <th><a href="so-wwwglro.php?orderby=surname">Surame</a></th>
    <th><a href="so-wwwglro.php?orderby=email">Email</a></th>
    <th><a href="so-wwwglro.php?orderby=phone">Phone</a></th>
  </tr>
<?php

然后,当然,您需要获取行来创建表;唯一发生变化的行是“while”(毕竟我们使用的是 PDO):

while ($row = $result->fetch(PDO::FETCH_ASSOC))

然后,你只需要创建你的表,就像你的例子一样:

{
  echo "<tr>";
  foreach($row as $_column)
  {
    echo "<td>{$_column}</td>";
  }
  echo "</tr>";
}

echo "</table>";  

相反,如果您想对列进行动态排序,而无需重新加载页面,您应该使用 Javascript,但这是完全不同的事情:)

编辑:从 mysql_* 更改为 PDO,这样我们就不会“支持”已弃用的函数。

关于php代码按列名排序mysql查询表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15225169/

相关文章:

php - 如何在 PHP 中仅对 URL 的非 ASCII 符号进行 url 编码,但保留保留符号不编码?

php - 在 Windows Xampp 上安装和使用 elasticsearch php 客户端

php - Linux debian 中发生新事件时提醒 php

php - 根据选择填充 php 内容的 jQuery 上下文菜单

mysql - 在 MySQL 中构建动态数据透视查询

mysql - 复合 Mysql join sql 中每组所需的最大 n

php - Symfony2 + 存储过程 ||如何获取结果?

php - foreach 循环中 current() 的意外行为

mysql - 相同的数据库,不同的mysql : ENORMOUS DIFFERENCE in query time execution

MySQL 减去同一个表中同一列下的行,但主键不同