質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1310閲覧

$_POSTで受け取った配列をwhileで回して表示しているが、ソートのやり方が分からない

Keichi_Negishi

総合スコア25

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/05/28 08:06

編集2021/05/28 08:45

制作しているサイトの概要

以下の画像のようなサイトを制作しています。
入力フォームが複数あり、入力した情報を配列で確認画面に渡し、whileでループさせ表示しています。

オーダー画面
イメージ説明
確認画面
イメージ説明

実現したいこと、困っていること

$_POSTで受け取った配列を、確認画面で「購入者順」「名前順」にソートできるようにしたいです。
しかし、whileで一つ一つ表示したりDBに照合しているため
sqlの「ORFER BY」でソートするような方法が取れず困っています。

試したこと

(1)ソート用のセレクトボックスを選択すると$_POSTが確認画面(今いる画面)に送る。
(2)そのvalueの値によってif文でsqlの内容を書き換える。
しかし、上で書いたようにwhileで一つ一つ表示させているため、ソートでまとめて並び替える方法が
分かりません。

コード

h()はhtmlspecialcharsを実行する関数です。

オーダー画面

PHP

1 2<!--オーダー画面--> 3<form method="post" action="order_confirmation.php"> 4 <input type="submit" value="オーダー内容を確認する"> 5 <table border="1"> 6 <tr><th></th><th>購入者</th><th>商品</th><th>個数</th></tr> 7 <?php 8 //データを全て配列で取得 9 $array_number = 0; 10 $number = 1; 11 while($number<=15) : 12 ?> 13 <tr> 14 <td><?php echo $number ?></td> 15 <td> 16 <select name="person_code[<?php echo $array_number ?>]"> 17 <option value="">選択してください</option> 18 <option value="1">購入者1</option> 19 <option value="2">購入者2</option> 20 </select> 21 </td> 22 <td> 23 <select name="item_code[<?php echo $array_number ?>]"> 24 <option value="">選択してください</option> 25 <option value="1">商品名1</option> 26 <option value="2">商品名2</option> 27 </select> 28 </td> 29 </tr> 30 <?php 31 $number++; 32 $array_number++; 33 ?> 34 <?php endwhile; ?> 35 </table> 36</form> 37

確認画面

PHP

1<?php 2 3$person_code = $_POST['person_code']; 4$filter_person_code = count(array_filter($person_code)); 5$item_code = $_POST['item_code']; 6 7$count_number = 0; 8 9$p_sql = "SELECT person_name,person_code FROM person_data WHERE person_code = :person_code"; 10$i_sql = "SELECT item_name,item_code FROM item_data WHERE item_code = :item_code"; 11 12//こちらはソートのテスト 13$sort = null; 14if(isset($_POST['sort'])){ 15 $sort = $_POST['sort']; 16} 17if($sort == 'n'){ 18 echo '名前順にソート'; 19}elseif($sort == 'i'){ 20 echo '商品名順にソート'; 21 $i_sql = "SELECT item_name,item_code,price FROM item_data WHERE item_code = :item_code ORDER BY item_name DESC"; 22} 23 24?> 25 26<section class="common_wrapper"> 27 <h1>オーダー確認ページ</h1> 28 <div class="data_list_wrapper"> 29 <form method="post" action="order_confirmation.php" onchange="submit(this.form)"> 30 <select class="select_box" name="sort"> 31 <option value="n">名前順にソート</option> 32 <option value="i">商品名順にソート</option> 33 </select> 34 <?php while($count_number <= $filter_person_code) : ?> 35 <input type="hidden" name="person_code[]" value="<?php echo $person_code[$count_number] ?>"> 36 <input type="hidden" name="item_code[]" value="<?php echo $item_code[$count_number] ?>"> 37 <?php $count_number++; ?> 38 <?php endwhile; ?> 39 </form> 40 //$count_numberを初期化 41 <?php $count_number = 0; ?> 42 43 <table border="1" class="order_confirmation"> 44 <tr><th>購入者</th><th>商品</th><th>個数</th><th>金額</th></tr> 45 <?php while($count_number <= $filter_person_code) : ?> 46 <?php 47 $pdo = new pdo(DSN,DB_USER,DB_PASS); 48 //入居者データ 49 $p_data = $pdo->prepare($p_sql); 50 $p_data->bindParam(":person_code", $person_code[$count_number]); 51 $p_data->execute(); 52 $p_rows = $p_data->fetchAll(PDO::FETCH_ASSOC); 53 54 $i_data = $pdo->prepare($i_sql); 55 $i_data->bindParam(":item_code", $item_code[$count_number]); 56 $i_data->execute(); 57 $i_rows = $i_data->fetchAll(PDO::FETCH_ASSOC); 58 $pdo = ''; 59 ?> 60 <tr> 61 <td> 62 <?php 63 foreach($p_rows as $p) : 64 echo h(sprintf("%03d", $p['person_code'])) . ':' . h($p['person_name']); 65 endforeach; 66 ?> 67 </td> 68 <td> 69 <?php foreach($i_rows as $i) : 70 $item_name = $i['item_name']; 71 echo h($item_name); 72 endforeach; ?> 73 </td> 74 </tr> 75 <?php $count_number++; ?> 76 <?php endwhile; ?> 77 </table> 78 </div><!--/.data_list_wrapper --> 79 </section><!--/.common_wrapper --> 80

ご回答頂けると嬉しいです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2021/05/28 08:25

もっと簡潔に問題点に絞ったソースにした方がよいでしょう いまのままでは何をpostしてるのかも分かりづらいです
Keichi_Negishi

2021/05/28 08:26

ありがとうございます。 修正します。
Keichi_Negishi

2021/05/28 10:07

皆様のご回答は、週明け確認させていただきます。
guest

回答1

0

ベストアンサー

PHP

1<?PHP 2$p=filter_input(INPUT_POST,"p",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 3$i=filter_input(INPUT_POST,"i",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 4$q=filter_input(INPUT_POST,"q",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 5$s=filter_input(INPUT_POST,"sort"); 6$data=[]; 7if(!is_null($p)){ 8 foreach($p as $key=>$val){ 9 $data[]=[$val,$i[$key],$q[$key]]; 10 } 11 usort($data,function($x,$y) use($s){ 12 if($s=="p") return $x[0]>$y[0]; 13 if($s=="i") return $x[1]>$y[1]; 14 if($s=="q") return $x[2]>$y[2]; 15 return 1; 16 }); 17 print_r($data); 18} 19?> 20<form method="post"> 21<select name="p[0]"> 22<option value="001">001:あああ</option> 23<option value="002" selected>002:いいい</option> 24<option value="003">003:ううう</option> 25</select> 26<select name="i[0]"> 27<option value="001">001:かかか</option> 28<option value="002">002:ききき</option> 29<option value="003" selected>003:くくく</option> 30</select> 31<input name="q[0]" value="200"><br> 32<select name="p[1]"> 33<option value="001" selected>001:あああ</option> 34<option value="002">002:いいい</option> 35<option value="003">003:ううう</option> 36</select> 37<select name="i[1]"> 38<option value="001">001:かかか</option> 39<option value="002" selected>002:ききき</option> 40<option value="003">003:くくく</option> 41</select> 42<input name="q[1]" value="300"><br> 43<select name="p[2]"> 44<option value="001">001:あああ</option> 45<option value="002">002:いいい</option> 46<option value="003" selected>003:ううう</option> 47</select> 48<select name="i[2]"> 49<option value="001" selected>001:かかか</option> 50<option value="002">002:ききき</option> 51<option value="003">003:くくく</option> 52</select> 53<input name="q[2]" value="100"><br> 54ソート:<select name="sort"> 55<option value="">--</option> 56<option value="p">名前</option> 57<option value="i">商品</option> 58<option value="q">個数</option> 59</select><br> 60<input type="submit" value="send"> 61</form>

投稿2021/05/28 08:50

yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Keichi_Negishi

2021/05/28 10:06

ご回答ありがとうございます。 こちらのコードはオーダー画面(画像の一番目)内での使用を想定したものでしょうか。 だとしたら書き方が分かり辛く申し訳ありません。 オーダー画面ではなく確認画面で表示されたものをセレクトボックスで並び替えたいのですが、 可能でしょうか。 画像の2番目の箇所で、表示されているデータを並び替えたいと考えております。
yambejp

2021/05/28 10:39 編集

配列のソート方法は私の提示したpostしたデータでも 別に供給されたデータを利用したものでもやり方自体は同じです
Keichi_Negishi

2021/05/30 23:28

承知しました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問