2013-03-05 108 views
1

我想用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); 

?> 
+1

首先,尝试使用[PDO](http://php.net/manual/en/book.pdo.php)或[Mysqli_ *](http://php.net/manual/en/book .mysqli.php)inseat of'mysql_ *'for your queries,因为已被弃用,你可以看到[here](http://php.net/manual/en/function.mysql-db-query.php):) – 2013-03-05 13:41:06

+1

请考虑使用'mysqli'或'PDO'系列函数,而不是'mysql'系列函数。 PHP建议所有开发人员停止使用'mysql_'系列函数。 http://www.php.net/manual/en/intro.mysql.php – 2013-03-05 13:42:48

+0

我们在想同一件事@ErenorPaz! – 2013-03-05 13:43:23

回答

0

由于我使用PDOhere,我给你的连接模板(插入您使用的是带有变量名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 

然后,当然,您获取行来创建表;只有一行得到改变它的“外衣”(我们使用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,所以我们不“支持”已弃用的功能。

+0

...我试过你的代码...没有再获得列名称。谢谢。在if语句中,应该是$ query。=而不是查询。= ... – wwwglro 2013-03-06 08:44:33

+0

我试过echo' ' . $field_info->name . ''; ....但$ _GET没有任何内容... – wwwglro 2013-03-06 08:54:11

+0

我正在设置一个页面测试:) – 2013-03-06 09:00:14

0

我没有测试过,但这样的事情可能工作:

$sort = 'your_field_to_sort'; 

while (($row = $result->fetch_assoc())) { 
    $data[] = $row; 
} 

usort($data, function($a, $b) use ($sort) { 
    if ($a[$sort] == $b[$sort]) { 
     return 0; 
    } 
    return ($a[$sort] < $b[$sort]) ? -1 : 1; 
}); 

这个例子假设你使用的mysqli,您应该更喜欢使用旧的弃用mysql函数。

如果你仍然要坚持旧的API,然后使用mysql_fetch_assoc

[...] 

while (($row = mysql_fetch_assoc($result)) { 
    $data[] = $row; 
} 

[...] 
+0

对不起。我还没有使用mysqli ...我已经是新的“旧”sql ...谢谢 – wwwglro 2013-03-06 09:07:48

+1

你应该真的考虑重构(语法几乎相同)。我为上面的旧API添加了一个示例。我还没有测试它;-) – acme 2013-03-06 10:17:33

+0

我同意@acme放弃旧mysql_ * :) – 2013-03-06 10:30:50