• ベストアンサー

テキストエリアに入力した複数行のデータをもとに、DBから呼び出したデータをPHP側でソート

PHP: 5.2.1 MySQL: 5.0.27 PHPとMySQLのバージョンは上記の通りです。 Smartyも利用しております。 (1) テキストエリアに以下のような情報を入力します。 ┏━━━━━━━━━━━┓ ┃ 5 ┃ 3 ┃ 1 ┃ 2 ┃ 4 ┗━━━━━━━━━━━┛ (2) 上記の情報をもとにデータベースに情報を取りに行きます。 (3) その結果、以下の情報が取得できます。 ID┃NAME ┃PRICE ━╋━━━╋━━━ 1 ┃メロン┃1000 2 ┃りんご┃100 3 ┃ぶどう┃300 4 ┃バナナ┃150 5 ┃みかん┃100 (4) このデータを、(1)でテキストエリアに入力した順番に並べ替えて表示する。 ┏━━━━━━━━━━┓ ┃5 みかん 100 ┃3 ぶどう 300 ┃1 メロン 1000 ┃2 りんご 100 ┃4 バナナ 150 ┗━━━━━━━━━━┛ という処理を行いたいのですが、(4)の部分が出来ません。 始めは1件1件問い合わせをかけて、1件ずつ表示すればと思ったのですが、 テキストエリアに入力する情報が1000件を超える場合があります。 速度に不安があるので、まとめて問い合わせする方法でやりたいのですが、 そうなると、どうしてもPHP側でソートさせる必要があります。 しかし、ソートさせるための基準となるものが 「テキストエリア内の情報の順番」なのです。 array_multisort関数なども試してみたのですが、 うまくいきませんでした。 データベースの書き換えを行わず、且つ、 1件ずつ問い合わせする方法もしない。といった場合、 上記を再現する事は可能でしょうか? お知恵をお貸し頂ければ幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

ORDER BY ID IN (5,3,1,2,4) DESC,FIELD(ID,5,3,1,2,4) とかMySQLでソートしてみては?

mullen0213
質問者

お礼

ご回答頂きましてありがとうございます。 SQLでソート! 完全に頭から抜けていました(汗 今回はデータのやり取りの速度も求められましたが、 納期の方の速度が、それ以上に求められていたので、 簡単に実装できるこの形でいきたいと思います。 非常に助かりました。ありがとうございます。

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

その他の回答 (3)

  • little-m
  • ベストアンサー率44% (45/102)
回答No.4

以下のようなロジックで出来るのではと思います。 ただし、(3)のデータベースから取得した情報のIDが、(4)のテキストエリアで指定されたIDの中に無かった場合どうするか、という問題があります。 【前提1】 (3)の結果を仮に $recs という配列に格納したとします。 $recs[0] --- array('id'=>1, 'name'=>'メロン', 'price'=>1000); $recs[1] --- array('id'=>2, 'name'=>'りんご', 'price'=>100); 【前提2】 (4)の結果を $sdats という配列に格納したとします。 $sdats = array(5, 3, 1, 2, 4,...) 【ロジック】 // 表示順の配列 $skeys を作ります $skeys = array(); $cnt = 0; foreach ($sdats as $id) { $skeys[$id] = $cnt; $cnt ++; } // データをソートします。 usort($recs, "cmp_recs"); // ソート用関数 function cmp_recs($a, $b) { global $skeys; // $skeys をグローバル変数で渡します $dnum = 99999; // $skeys に ID がない場合のダミー順番号 $aid = $a['id']; $bid = $b['id']; $anum = isset($skeys[$aid]) ? $skeys[$aid] : $dnum; $bnum = isset($skeys[$bid]) ? $skeys[$bid] : $dnum; return $anum < $bnum ? -1 : 1; }

mullen0213
質問者

お礼

ご回答頂きましてありがとうございます。 usort関数を利用する方法ですね! 色々調べて、まずその方法にたどり着いたのですが、 今回の作業が、未解析のクライアントのシステムで、且つ、複雑怪奇な構造でしたので、 いくら試してもエラー。エラー。エラー…。 私の勉強不足が一番の原因なのですが、(汗 今回は納期が迫っていましたので、とりあえずANo.1の方の方法で実装したいと思います。 また今回のような状況になったら、 教えて頂いたロジックを参考に組んでみようと思います。 非常に勉強になりました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • okweb-goo
  • ベストアンサー率29% (283/952)
回答No.3

FORM入力から1000行ものデータを送り込むこと自体、設計に無理がありませんか?SQL文がものすごいことになりますよね。 まさかその1000行をキーボード入力しているとは思えませんが、まとめてファイルのアップロードではだめなんですか? 普通はそうしますし、そのほうがバグの追っかけも楽です。

mullen0213
質問者

お礼

ご回答頂きましてありがとうございます。 おっしゃる通りで、SQL文がものすごいことになっております。(汗 CSVファイルのアップロードも考えたのですが、 利用者側の事を考えるとフォームにせざるを得なかった次第です。 メンテナンスの事も考慮して、次回はファイルアップロード形式も検討したいと思います。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

1000件にもなる可能性があるのなら、テンポラリテーブルにセッションID(もしくは適当なテンポラリ文字列),行No,入力した値を落としておいて、結合しないとselectのSQL文が大変なことになりませんか? そうしておけば、テンポラリの行No順で取り出せます。取り出し終わったらテンポラリからセッションIDが一致するレコードを削除すればよろしいかと(定期的にテンポラリはtruncateした方がいいかもしれませんが・・)。

mullen0213
質問者

お礼

ご回答頂きましてありがとうございます。 知識不足でその発想に至りませんでした。(汗 なるほど!そういう手もあるのですね! 今回の作業が、未解析のシステムでの作業でしたので、 データベース操作はSELECTだけがいいだろうと判断しておりました。 その為、PHP側でのソートにばかり気がいってしまい、 MySQLを利用してのソートの発想がありませんでした。 勉強になります! ありがとうございました。

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

関連するQ&A

  • php テキストエリアの入力チェック

    現在、phpを使用してメールフォームを作成しております初心者です。 入力確認画面(二画面目)において テキストエリア(お問い合わせ内容入力エリア)内の入力内容が ・半角もしくは全角スペースのみ ・テキストエリア未入力で初期値  【 こちらにお問い合わせ内容を入力! 】 のままの場合のチェック&エラーメッセージを表示させたくて 下記のようなphpソースを記述してあれこれやってるのですが思うようにいきません。 テキストエリアに半角英数、全角文字が入力された場合は 思い通りにチェックを通過します。 しかし・・・ ・全角スペース1文字分以上 ・半角スペース2文字分以上 入力された場合もチェックを通過してしまいます。 半角スペース1文字分までの入力の場合はエラーメッセージを表示してくれるのですが・・・ ~前略~ <?php //お問い合わせ内容 if ($contents == " " || $contents == "こちらにお問い合わせ内容を入力!") { $errormsg[] = "お問い合わせ内容を入力して下さい"; } ?> ~後略~ 当方まだまだphp初心者れべる故、わかりやすくご回答頂けると有難いのですが・・・ どなたかご回答宜しくお願い致します。

    • ベストアンサー
    • PHP
  • エクセル2010で 項目の抜き出しをしたい

    エクセル2010で 項目の抜き出しをしたいです。 たとえば、A列に りんご りんご バナナ トマト りんご バナナ みかん トマト メロン バナナ リンゴ みかん ぶどう とデータが入っているとき、これらのデータには、 トマト バナナ りんご リンゴ みかん メロン ぶどう という種類のデータが入っているということを簡単に表示する方法が知りたいです。 どうぞよろしくお願いします。

  • エクセルデータ 複数行の並び替え

    エクセルについての質問です 2行あるデータをまったく同じ並びにしたいのです わかりづらいですが例でご理解いただけるでしょうか? 例)     A     B 1  みかん  りんご 2  りんご   ぶどう 3  ぶどう   みかん     ・      ・     ・      ・     ・      ・       ↓並び替え     A     B 1  みかん  みかん 2  りんご   りんご 3  ぶどう   ぶどう ※A行は固定  A行にあわせてB行をまったく同じ並びにしたい 実際のデータは上記のような単純にひらがなのみではなく数字とアルファベットがまざったデータです 例)ABC-123 うまく並び替える方法があればどなたかご教示いただけますようお願いいたします

  • PHPでテキストエリアのデータを配列に入れるには?

    テキストエリアに入力されたデータ(正確にはURL)を配列で取得して、別のテキストエリアに加工して出力する、という処理を作ろうとしています。 <form action="<?php echo $_SERVER["PHP_SELF"]?>" method="post"> <textarea name="url_from" rows="20" cols="50"> </textarea><br> <input type="submit" value="作成"><input type="reset" value="リセット"> </form> ためしに、 http://www.google.co.jp/ http://www.yahoo.co.jp/ と入力して、どんな入り方をしているのか確かめてみました。 $url_from という変数に入れて取り出してみたところ、上記のふたつのURLデータのあいだに 長い空白が入っているみたいでした。 そこで、このデータを配列に入れようとしているのですが、入れ方が分からずに困っております。 入力できるデータ数は、最大で20件(20行)としていますが、5件のときもあれば10件のときも あるという仕様です。 「切り分ける関数」のようなものがあれば、できそうな気がするのですが…。 みなさんなら、どのようにして配列に組み込もうとしますか?

    • ベストアンサー
    • PHP
  • (PHP)入力されたテキストをデーターベースに保管

    よろしくお願いします。 PHP5、MySQL5、 PEAR DB、Smarty にてお問合せフォームを開発しております。 シンプルに、ユーザー画面でテキストボックスを表示させ、 入力された文字列をPOSTして、DBの(Aというフィールド)へ保存する流れです。 ただ、Aフィールドには、問い合わせされたテキストデーターを、 10件分格納したく、 問い合わせがあるたびに、(POSTされるたびに)前の問い合わせ内容を、 カンマ区切りで保存することにしました。 例 $text = $_POST[最新の問い合わせ] ,(カンマ) $格納済みの古い問い合わせ という感じです。 これを、管理画面で、explodeしてカンマにて配列に戻し、 10件の新旧の問い合わせデーターを表示させようと思います。 そこで、根本てきなテクニックの誤りもご指摘頂きたいのですが、 もし、上記のやり方でやるとして、まず回答をくださいませ。 問題としては、問い合わせするユーザーが、テキストボックス内で、 無意識にカンマを入力してしまって、文章をつくりPOSTした場合です。 これを受けると、スクリプト側で制御したexplodeの配列化が、 ユーザーのカンマにも反応してしまい、 きちんとした問い合わせごとの配列化ができないことになります。 こういった問題を抱えており、なにか解決策があればご指導下さいませ。 できれば、上記の仕様のまま切り抜けたいと思いますが、 別の根本的なテクニック等があれば、そちらもご指導下さいませ。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 条件付書式の延長で・・・

    初めて利用させていただきます。どうか教えてください。 いくつかのページを拝見したのですが、自分の問題解決には至りませんので助けて頂きたいのです。 ○○さん りんご みかん メロン ぶどう △△さん みかん ぶどう 柿 ××さん りんご めろん りんご 上記の様な時に、「りんご」のセルは赤、「みかん」のセルはオレンジに「ぶどう」のセルには紫、「メロン」のセルには緑、「柿」のセルには黄色と言ったように『セルの背景色』を指定したいのですが何とかなるものでしょうか?

  • Accessでテーブルの文字列フィールドを連結する

    次のようなフィールドが2列のデータがあります。 1:りんご 1:みかん 1:バナナ 2:みかん 2:ぶどう 3:りんご 3:バナナ それを 1:りんご、みかん、バナナ 2:みかん、ぶどう 3:りんご、バナナ とクエリーでまとめたいのですが どのようにしたらよろしいでしょうか?

  • Excel VLOOKUPで可能でしょうか?

    下記のようにな表がありあます。 1 りんご 1 みかん 2 みかん 3 ぶどう 5 りんご 2 バナナ ↓ 2 みかん 2 バナナ このように「2」と入力したら2列目の名前が表示するよにしたいです。 おわかりの方教えてくださーい!

  • mysqlのSQL文の書き方について

    mysqlでA,Bのテーブルがあるとします。 A ID1 りんご ID3 みかん ID4 ぶどう B ID2 メロン ID3 みかん ID4 ぶどう この二枚のテーブルでどちらかのテーブルに存在すればヒットする ようなselec文はどう書いたらいいのでしょうか。重複する行は、 一行のみ抜き出したいです。 こういうかんじにです。 ID1 りんご ID2 メロン ID3 みかん ID4 ぶどう よろしくお願いします。

  • DB内にあるデーターのソート

    こんばんわ。 以下の件について、どなたがサンプルソースを交えてご教授下さい。 環境: windows Apache2 + PHP5 + MySQL データーベースにある、2つのフィールドを対象にして データーをソートして表示させたいのですが、なにかいい方法はありませんか。 例 対象データベース↓ id name point item 1 user1 340 item1 2 user2 540 item1 3 user3 210 item2 4 user4 319 item2 5 user5 233 item3 このデータベースを読み込み、以下の様にソートし表示したいのです。 ◇item1 user2:540 user1:340 ◇item2 user4:319 user3:210 ◇item3 user5:233 ※item欄にあるデーター毎に、pointの高い数値に並び替える。 以上、よろしくお願いします。

    • 締切済み
    • PHP