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

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

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

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

Q&A

解決済

5回答

10319閲覧

データベースから取得したデータを一覧表示し各データを選択する

ppglma

総合スコア14

PHP

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

0グッド

0クリップ

投稿2017/06/07 07:35

###前提・実現したいこと
受注情報管理システムを作っています。
データベースから取得したデータの一覧を表示し、データの行ごとにある選択ボタンでその行のデータをPOST送信したいのですが、どの行の選択ボタンを押しても一番最後の行のデータが送信され、困っております。

###発生している問題・エラーメッセージ

どの選択ボタンを押しても最後の行の情報が送信される

###該当のソースコード
PHP

<?php session_start() ?> <!DOCTYPE html> <head> <meta charset="utf-8"> <title>発注情報入力フォーム</title> </head> <body> <h1>紐づける受注案件を選択してください</h1> <table border="1"> <tr><th>受注NO</th><th>顧客名</th><th>ステータス</th><th>案件名</th><th>商品名</th><th>仕様</th><th>数量</th><th>納期</th><th>価格</th></tr> <form action="order-to-input.php" method="post"> <?php $pdo = new PDO('mysql:host=localhost;dbname=order;charset=utf8', 'admin', 'password'); $sql = 'select * from order_from'; $db=$pdo->prepare($sql); $db->execute(); foreach ($db->fetchAll() as $row) { echo '<tr>'; echo '<td><input type="hidden" name="orderFromNO" value="'.$row['orderFromNO'].'"></td>'; echo '<td>', $row['orderFromNO'], '</td>'; echo '<input type="hidden" name="customer" value="',$row['customer'],'">'; echo '<td>', $row['customer'], '</td>'; echo '<input type="hidden" name="status" value="',$row['status'],'">'; echo '<td>', $row['status'], '</td>'; echo '<input type="hidden" name="projects" value="',$row['projects'],'">'; echo '<td>', $row['projects'], '</td>'; echo '<input type="hidden" name="product" value="',$row['product'],'">'; echo '<td>', $row['product'], '</td>'; echo '<input type="hidden" name="specification" value="',$row['specification'],'">'; echo '<td>', $row['specification'], '</td>'; echo '<input type="hidden" name="num" value="',$row['num'],'">'; echo '<td>', $row['num'], '</td>'; echo '<input type="hidden" name="deliveryDate" value="',$row['deliveryDate'],'">'; echo '<td>', $row['deliveryDate'], '</td>'; echo '<input type="hidden" name="price" value="',$row['price'],'">'; echo '<td>', $row['price'], '</td>'; echo '<td><input type="submit" name="select" value="選択"></td>'; echo '</tr>'; } ?> </form> </table> </body> </html>

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

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

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

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

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

guest

回答5

0

nameが同じ要素がある場合、送信される値は最後の要素の値のみです。
行ごとに固有のnameとなるようにしてください。

$count = 0; $db->execute(); foreach ($db->fetchAll() as $row) { echo '<tr>'; echo '<td><input type="hidden" name="orderFromNO' . $count . '" value="'.$row['orderFromNO'].'"></td>'; ・・・ echo '<td><input type="submit" name="select' . $count . '" value="選択"></td>'; echo '</tr>'; $count++; } ・・・

そしてsubmitされた値がselect1ならorderFromNo1の値を利用するようにすれば良いと思います。
nameを配列にしても良いと思います。

echo '<td><input type="hidden" name="orderFromNO[]" value="'.$row['orderFromNO'].'"></td>';

投稿2017/06/07 08:07

編集2017/06/07 08:09
sha

総合スコア141

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

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

sha

2017/06/07 08:10

matsu1006さんのようにformを複数にしたほうが後の処理が簡単でした。
m.ts10806

2017/06/07 08:24

やり方はいっぱいありますね formがたくさんあるのが気にいらない人もいるから<form>を外だしし、各入力コントロールにidつけてonclickで必要な情報だけ取り出してform内にhidden作ってsubmitするとか、、
sha

2017/06/07 08:29

そうですね。やり方はたくさんあると思います。もしjavascriptの使用の制限があるなら(最近はあまりないと思いますが)やはり行ごとのformが良いと思います。form内に送信用のhiddenを作る方法も確かにありですね。行数がものすごく多いならform要素もそれだけ多くなるので行内のform以外の方法が良さそうです。この画面以外の仕様や要件によってやり方を選択するのが良いと思います。
guest

0

ベストアンサー

<form> ~ </form>をforeachの中に入れてみてください。 全体で囲ってしまうと同名入力コントロールが件数分あることになるので、 どんどん上書きされて後勝ちで最後の内容だけ送信されるという事態が起きます。

PHP

1 foreach ($db->fetchAll() as $row) { 2 echo '<form action="order-to-input.php" method="post">'; 3 echo '<tr>'; 4 5~~~~~~~~中略~~~~~~~ 6 echo '</tr>'; 7 echo '</form>'; 8 }

投稿2017/06/07 08:01

m.ts10806

総合スコア80850

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

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

ppglma

2017/06/07 08:18

解決いたしました、ありがとうございました・・・!
m.ts10806

2017/06/07 08:28 編集

もし、orderFromNOだけで情報が特定できるのであれば、hiddenはorderFromNOだけにして他は表示のみにし、POSTの受け先(order-to-input.php)でorderFromNOをキーにDBから必要な情報を取り出すのもありです。 hiddenなので表には見えませんが、ブラウザの機能なので改ざんして送信することは可能です。 orderFromNOだけ渡して必要な情報を別途取り出すことで必要な情報を利用することが可能となります。ご検討ください。
ppglma

2017/06/07 08:55

ご提案して頂いた通りの仕様にいたしました。ご助言ありがとうございます!
guest

0

各行のsubmitのセルにformを設置しなにからなにまですべてhiddenでもたせるなど
すべていれて完結させてください
いずれにしてもご提示のようなtdとtdの間にinputをおいたりはできません。

投稿2017/06/07 08:03

yambejp

総合スコア114784

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

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

sha

2017/06/07 08:32

td内にinputは配置できます。
yambejp

2017/06/07 09:27

> shaさん tdとtdの間にinputって置いていいのですか? <td>なんたら</td> <input type="なんたら"> <td>なんたら</td> となっていると書いたのですが
m.ts10806

2017/06/07 11:52

横から失礼します。inputはinputでもhiddenだからひとまずどこに置いてもってことだと思います。 確かに意味づけも踏まえるとhiddenであってもtdの枠内に収めた方が良いですね。
sha

2017/06/12 10:37 編集

>yambejpさん 失礼しました。td内ではなく<td></td><input type="hidden"/><td></td>をできないということですね。できなくはないけどしない方が良いですね。
guest

0

一つのform内に同じnameが増産されているからでしょうね。

投稿2017/06/07 08:01

ttyp03

総合スコア16998

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

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

0

ブラウザの右クリックなどでソースコードを表示してみましょう。
表示されたHTMLのテーブルの中身を見てみて、何が違うかを確認してみましょう。

取得しているデータが違うのか、
表示のさせ方が違うのか、入っているデータ自体が間違ってるかに気付けるかと思います。

投稿2017/06/07 07:48

s.t.

総合スコア2021

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問