プロが教える店舗&オフィスのセキュリティ対策術

こんにちは。php+mysqlで検索サイトを作っているんですが、初心者であり、スクリプトの書き方で困ってます。

「まず検索されたデータをweb上に表示させる。
表示された表のヘッダ部分(各名称)をクリックすると、表示されたものがソートされる。」

以前、各名称をクリックすることでソートさせるやり方が、掲載されていたのですが、一度検索条件によって出されたものに対しては、どのようにスクリプトを書けばよいのでしょうか?どなた様か教えていただけませんか?

もうひとつ、これはいろいろ調べたことなんですが、表示された表のヘッダ部分を固定させて、ボディ部分だけをスクロールさせることは難しいのでしょうか?

分かりにくい質問ですみません。宜しくお願い致します。

A 回答 (5件)

PHPだと、一度WEB上に表示した(DBから取得してきた)データを、DBに再度接続せずにソートするのはできなかったと思います。


(.NETなら非接続での方法があるので別ですが)
なので、再度DBに対して検索する必要があるかと思います。

>表示された表のヘッダ部分を固定させて、ボディ部分だけをスクロールさせる

ボディ部分とヘッダ部分のHTMLをまずわけ、
ボディ部分を
<div style="height:200px;width:200px;overflow:auto;">
ここにボディ部分を入れる
</div>
とすれば、スクロールされます。
スタイルシートがきく環境で、だけですが。
heightとwidthを変えればよいです。
    • good
    • 0

・ソートについて


Mysqlで表示された検索結果は、PHPで表示されてPHPの処理が終わればMysqlの処理も終了します。
つまり、一度検索条件で出されたとしても、その検索結果からさらに絞り込むと言うことはできません。
やるのでしたら、今やった検索処理+新たな検索処理をする、と言うことです。
つまり、Mysqlのorder by 句のソート項目が変更される、where句がいくつか増えるまたはtmptableを使用するということをするようになると思います。

・表示
ヘッダ部分を固定してボディー部分をスクロールさせる手としては、フレームで分けてしまう手があります。
ただし、上下ともサイズ固定をしておかないと表がずれます。

この回答への補足

ご回答有難うございます。

tmptable の使用ですが、tmptable を作成してそれを表示させるには2度クエリを発行しなければならないですよね(create文とselect文?)、
そこは普通に

$sql= "create temporary table tmp select * from honda where (model like '$model%') having (model like '%$grade%')";

$sql= "select * from tmp where (model like '$model%')
having (model like '%$grade%')";

$rst = mysql_query($sql,$con);

と二つならべるんですか?これは勿論エラーでましたけど。
すいませんが、その辺について教えてください。

補足日時:2005/06/30 11:42
    • good
    • 0

こんにちは。



(1)<a href=file2.php?flag=1>などでフラグを立てて
if文かswicthで分岐させて
select * from * order by *
などで。
DBを使いたくないのならjavascriptでも出来無い事もないですが、
猥雑になると思います。
http://www.openspc2.org/reibun/javascript/

(2)フレームの事ですか?
htmlで簡単にできます。
下記リンクご参考に。
http://www.tagindex.com/html_tag/frame/index.html
    • good
    • 0

再ソートですが、簡単なSQLであればソートの度にorder指定を変えて再検索する方法で良いと思います。



もしSQLが重く、ソートを変更する度に実行するのが辛ければ、表示用のテーブルを作ってそこにselect結果を一旦保存、条件に応じてorder byでソートして表示するのが良いと思います。表示用のテーブルを作る方法は再ソートのためだけでなく、複雑なSQLを使ってページングをする際、ページが変わる度に重いSQLの実行を避ける為だったり、頻繁に件数が増えるため、ページが切り替わる度にSQLを実行すると表示されないレコードが発生してくる(ページを切り替える度に件数が変わると、ページングの位置も変わり抜けるレコードが出てくる)のを防ぐなど、SQLで得たデータ以外の別の要素でのソートが必要な場合などの色々な目的で、割とよく使う手法です。

他のテーブルのselectの内容をそのまま別のDBに挿入する場合はinsert into xxx select aaa,bbb,ccc from yyyy where~の構文でできます。

データ件数が少なければ、結果をフィールド毎の配列に入れて、array_multisort関数で配列をソートします。こちらの方が手軽ですね。
    • good
    • 0

$sql= "create temporary table tmp select * from honda where (model like '$model%') having (model like '%$grade%')";



$sql= "select * from tmp where (model like '$model%')
having (model like '%$grade%')";

$rst = mysql_query($sql,$con);

これだと tmptable を作るためのクエリーがないので当然エラーになります。
変数に入れただけでは実行されないので、SQL文を実行してください。

$sql= "create temporary table tmp select * from honda where (model like '$model%') having (model like '%$grade%')";
$rst = mysql_query($sql,$con);

$sql= "select * from tmp where (model like '$model%')
having (model like '%$grade%')";

$rst = mysql_query($sql,$con);
    • good
    • 0
この回答へのお礼

ご回答有難うございました。そんな簡単なところでつまづいていたのですね。
お恥ずかしい。
#5さんはもちろん、皆さんのアドバイスを参考にさせて頂いて、ようやく頭に描いてたスクリプトが出来上がりました。

本当に有難うございました。

お礼日時:2005/06/30 17:19

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