1

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);

?>
4

2 に答える 2

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

次に、行をフェッチしてテーブルを作成します。変更される唯一の行は「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 に変更されました。

于 2013-03-05T14:05:44.343 に答える
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;
}

[...]
于 2013-03-05T13:51:13.020 に答える