テーブルでソート(並び替え)を有効にする

テーブルでソート(並び替え)を有効にする

ソート機能を有効にする

記事:データベースの連結とページの追加の続きです。

データベースサンプルはこちら

ソート機能、いわゆる並び替え機能を使うには、ODDER BYというSQL命令を使用する。

//where句がない場合
SELECT * FROM fuji ORDER BY id DESC;
//where句がある場合
SELECT * FROM fuji where id=1 ORDER BY yaku;

ASCは昇順、DESCが降順だ。

これをデータベースとしてphp出力した時に、並べ替えるのが知らない人には苦戦するのではないだろうか。

矢印(若しくは画像、ボタン他)を使ったソート

まずは最もシンプルに昇順と降順の矢印を使ってみる。

データベースの連結とページの追加のサンプルに継ぎ足しすると、tableのところは下記のようなリンクを生成すればいいことになります。

<table width="500" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;">
<tr>
<th scope="col">薬品名<a href="3.php?sort=ASC&karamu=yaku">↓</a><a href="3.php?sort=DESC&karamu=yaku">↑</a></th>
<th scope="col">メーカー<a href="3.php?sort=ASC&karamu=meka">↓</a><a href="3.php?sort=DESC&karamu=meka">↑</a></th>
</tr>
 
<?php 
while($table=mysql_fetch_assoc($recordSet)){
?>
 
<tr>
<td><?php echo(htmlspecialchars($table['yaku'])); ?></td>
<td><?php echo(htmlspecialchars($table['meka'])); ?></td>
</tr>
 
<?php 
}
?>
</table>

これは、formでくくって、input type=”hidden”を使って、valueの隠しデータを、input type=”submit” value=”ボタン”にて送信しても同じ事です。送信がめんどいのと、送信データがPOSTを使うようなものでもないので、URLで直接データを受け渡します。

薬品名等の横に↑のリンクと↓のリンクで異なるデータ(2つなので&で続ける)を飛ばします。

//次のページヘ等のリンクがクリックされたら、その情報がpageというidで送られる。それを変数に代入。
$page=mysql_escape_string($_REQUEST['page']);

$sort=mysql_escape_string($_REQUEST['sort']);
$karamu=mysql_escape_string($_REQUEST['karamu']);
//初期ページの時に$pageに値が入っていないので、値がなければ1とする。
if($page==''){
	$page=1;
	}
if($sort==''){
	$sort="DESC";
	}
if($karamu==''){
	$karamu="meka";
	}

pageの初期値設定と同じように、拾ったデータをエスケープしてから変数に入れ、その変数が空値だったときは、適当な文字・数値を代入します。==はイコールですが、=は代入です。

//phpでの変数の連結(ドットを使用)
$recordSet=mysql_query("select f.yaku,y.meka from fuji f,yksearch y where f.yaku=y.yaku ORDER BY y.".$karamu." ".$sort." limit ".$start.",10");

select文も、新たな変数を組み込んだ形に改造します。これにて終わり。

ソート機能の切替ボタン

普通は上記のようなものでなく、ボタンを押すごとに昇順・降順が切り替わるボタンがいいですよね。

「もし一度クリックしたらA、2度目クリックしたらB、3度目クリックしたらA・・・」のようなボタンが理想です。

jQueryのclickファンクションでhrefの中身を変えようとしている途中に、ページ移動できない事に気づき却下。

phpのif文で実装するに至った。tableの中身にif文を入れて、SQL文のASCとDESCを切り替える。もっといい方法はあるだろうけど。。。

<table width="500" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;">
<tr>
<th scope="col">
 
<?php 
if($sort=='DESC' and $karamu=='yaku'){
    $yalink='http://nkdesk.com/3.php?sort=ASC&karamu=yaku';
}else{
    $yalink='http://nkdesk.com/3.php?sort=DESC&karamu=yaku';
}
 
echo("<a href='".$yalink."'>薬品名</a>");
?>
 
</th>
<th scope="col">
<?php 
if($sort=='DESC' and $karamu=='meka'){
    $malink='http://nkdesk.com/3.php?sort=ASC&karamu=meka';
}else{
    $malink='http://nkdesk.com/3.php?sort=DESC&karamu=meka';
}
 
echo("<a href='".$malink."'>メーカー</a>");
?>
</th>
</tr>
 
<?php 
while($table=mysql_fetch_assoc($recordSet)){
?>
 
<tr>
<td><?php echo(htmlspecialchars($table['yaku'])); ?></td>
<td><?php echo(htmlspecialchars($table['meka'])); ?></td>
</tr>
 
<?php 
}
?>
</table>

レコードに色付け

各レコード(行)ごとに色をつけていく方法は、trやtdごとにIDやClassをつけてcssで指定する方法、jQueryのevenやoddフィルターを使って指定する方法とかもありますが、ここではPHPで指定しました。

こういう作業の時にfor命令を使うのは素人の私には難しいので、while命令にて。

<?php 
$i=0;
while($table=mysql_fetch_assoc($recordSet)){
 
$i<=10;
$i++;
    if($i%2==1){
    echo("<tr style='background-color:#aaf'>");
}else{
    echo("<tr>");
}
?>

2012年2月24日10:01 PM | カテゴリー: Mysql | コメント(0)

コメントを残す

メールアドレスが公開されることはありません。