dポイントプレゼントキャンペーン実施中!

PHP/データベースを用いてのプログラミングで壁にぶち当たりましたので、ご質問させてください。

インターネットで色々調べたのですが、データベースを用いたソートの仕方が全く分からずにおります。

希望としましては、下記のようにボタンを押すとソートできるようにしたいと思っています。

http://lcl.web5.jp/prog/siori/ff.php

今現在、次のようなPHPでデータベースへのアクセスと一覧の表示は可能となっています。

なにか、参考になるページや方法など教えていただけないでしょうか。

========
#!/usr/local/bin/php-cgi
<?php
//HTML文を出力 HTMLの開始
print("<HTML>\n");

//HTML文を出力 HEADの開始
print("<HEAD>\n");

//文字コードをSHIFT_JISと指定
print("<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=\"Shift_JIS\">\n");

//HTML文を出力 TITLEの指定
print("<TITLE>myphp1</TITLE>\n");

//HTML文を出力 HEADの終了
print("</HEAD>\n");

//XAMPPの場合はパスワードなし
//DBへ接続開始 サーバー名--localhost ユーザー名--root パスワード--"karipass
$dbHandle = mysql_connect("localhost","root","karipass")
or die("can not connect db\n");

//MySQLのクライアントの文字コードをsjisに設定
mysql_query("SET NAMES sjis")
or die("can not SET NAMES sjis");

//db名を指定する
$db = "test";

//SQL文 tab1表から全行を取り出し、number列の昇順に整列する
$sql = "select * from tab1 order by id";

//SQL文を実行する
$rs = mysql_db_query($db,$sql);

//列数を取得する
$num = mysql_num_fields($rs);

//HTML文を出力 テーブルの開始を指定
print("<table border=1>");

//test表の列数と同じ回数を繰り返す
for ($i=0;$i<$num;$i++){

//HTML文を出力 列名を <td>で囲んで出力
print("<td>".mysql_field_name($rs,$i)."</td>");
}

//test表の行数と同じ回数を繰り返す
while($row=mysql_fetch_array($rs)){

//HTML文を出力 表の行の開始<tr> を出力
print("<tr>");

//test表の列数と同じ回数を繰り返す
for($j=0;$j<$num;$j++){

//HTML文を出力 列の内容を <td>で囲んで出力
print("<td>".$row[$j]."</td>");
}
//HTML文を出力 表の改行</tr> を出力
print("</tr>");
}

//HTML文を出力 テーブルの終了を指定
print("</table>");

//結果レコードをメモリから開放
mysql_free_result($rs);

//DBへの接続を切断
mysql_close($dbHandle);

?>

A 回答 (2件)

phpMyAdminは関係ないっすね・・・



SQLで処理するのが手っ取り早くて簡単です。
たぶん、例としてあげたサイトもその方法を使ってるかと思います。

配置されてる ボタンに、カラム名とソート方向をhiddenなどで仕込んでおいて。SQL生成時に ORDER BY `カラム名` ASC(又はDESC) って入れればいいだけです。


ただし、hiddenで投げられた値をバカ丸出しでそのままSQLに突っ込まないこと。

例えば。

$sql = 'SELECT * FROM tbl1 ORDER BY `'.$_POST['order']'.` '. $_POST['sort'] ;
とかやると、あっという間にSQLインジェクション食らってハッキングされます。

この回答への補足

有難う御座います。
下記のようにすると、ボタンでソートできるようになったのですが、これはバカ丸出しの方法なんですよね??
どのようにしてSQL生成時に ORDER BY `カラム名` ASC(又はDESC) って入れればいいのか分からないのですが、教えていただけないでしょうか。

#!/usr/local/bin/php-cgi
<?php
//HTML文を出力 HTMLの開始
print("<HTML>\n");

//HTML文を出力 HEADの開始
print("<HEAD>\n");

//文字コードをSHIFT_JISと指定
print("<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=\"Shift_JIS\">\n");

//HTML文を出力 TITLEの指定
print("<TITLE>myphp1</TITLE>\n");

//HTML文を出力 HEADの終了
print("</HEAD>\n");

//XAMPPの場合はパスワードなし
//DBへ接続開始 サーバー名--localhost ユーザー名--root パスワード--"karipass
$dbHandle = mysql_connect("localhost","root","karipass")
or die("can not connect db\n");

//MySQLのクライアントの文字コードをsjisに設定
mysql_query("SET NAMES sjis")
or die("can not SET NAMES sjis");

//db名を指定する
$db = "database";

//SQL文 tab1表から全行を取り出し、number列の昇順に整列する
$sql = "select * from tab1 order by $_POST[sort] $_POST[sc]";

//SQL文を実行する
$rs = mysql_db_query($db,$sql);

//列数を取得する
$num = mysql_num_fields($rs);

//HTML文を出力 テーブルの開始を指定
print("<table border=1>");

//test表の列数と同じ回数を繰り返す
for ($i=0;$i<$num;$i++){

//HTML文を出力 列名を <td>で囲んで出力
print("<td>".mysql_field_name($rs,$i)."</td>");
}

//test表の行数と同じ回数を繰り返す
while($row=mysql_fetch_array($rs)){

//HTML文を出力 表の行の開始<tr> を出力
print("<tr>");

//test表の列数と同じ回数を繰り返す
for($j=0;$j<$num;$j++){

//HTML文を出力 列の内容を <td>で囲んで出力
print("<td>".$row[$j]."</td>");
}
//HTML文を出力 表の改行</tr> を出力
print("</tr>");
}

//HTML文を出力 テーブルの終了を指定
print("</table>");

//結果レコードをメモリから開放
mysql_free_result($rs);

//DBへの接続を切断
mysql_close($dbHandle);

?>
<br>
<a href="myphp.php">メニュー</a><br>
<form action="myphp1.php" method="post">
<input type="hidden" name="sort" value="id">
<input type="hidden" name="sc" value="asc">
<input type="submit" value="↓">
</form>
<form action="myphp1.php" method="post">
<input type="hidden" name="sort" value="id">
<input type="hidden" name="sc" value="desc">
<input type="submit" value="↑">
</form>

補足日時:2009/01/29 10:52
    • good
    • 0
この回答へのお礼

下記の場合、
初めての場合表が表示されずに、FORMのボタンをクリックして初めて表が作成されますね。

$sql = "select * from tab1 order by $_POST[sort] $_POST[sc]";

初めてでも表が表示されるようにするのはどうすればよいのでしょうか。

お礼日時:2009/01/29 15:58

SQLで処理するなら


order by id
を変えるだけ

この回答への補足

ご回答有難う御座います。

ボタンを押すとそれぞれのフィールド(タイトルや作者など)でソートするには、order byでは駄目ですよね??

もしかして、order byの項目によってそれぞれページを作るということでしょうか。

補足日時:2009/01/29 09:36
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!