• 締切済み

PHP/phpMyAdmin/データベースなどでソートを実行する方法

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

みんなの回答

  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.2

phpMyAdminは関係ないっすね・・・ SQLで処理するのが手っ取り早くて簡単です。 たぶん、例としてあげたサイトもその方法を使ってるかと思います。 配置されてる ボタンに、カラム名とソート方向をhiddenなどで仕込んでおいて。SQL生成時に ORDER BY `カラム名` ASC(又はDESC) って入れればいいだけです。 ただし、hiddenで投げられた値をバカ丸出しでそのままSQLに突っ込まないこと。 例えば。 $sql = 'SELECT * FROM tbl1 ORDER BY `'.$_POST['order']'.` '. $_POST['sort'] ; とかやると、あっという間にSQLインジェクション食らってハッキングされます。

mutsukiame
質問者

お礼

下記の場合、 初めての場合表が表示されずに、FORMのボタンをクリックして初めて表が作成されますね。 $sql = "select * from tab1 order by $_POST[sort] $_POST[sc]"; 初めてでも表が表示されるようにするのはどうすればよいのでしょうか。

mutsukiame
質問者

補足

有難う御座います。 下記のようにすると、ボタンでソートできるようになったのですが、これはバカ丸出しの方法なんですよね?? どのようにして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>

すると、全ての回答が全文表示されます。
  • xyz951
  • ベストアンサー率18% (15/79)
回答No.1

SQLで処理するなら order by id を変えるだけ

mutsukiame
質問者

補足

ご回答有難う御座います。 ボタンを押すとそれぞれのフィールド(タイトルや作者など)でソートするには、order byでは駄目ですよね?? もしかして、order byの項目によってそれぞれページを作るということでしょうか。

すると、全ての回答が全文表示されます。

関連するQ&A