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

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

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

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

1回答

2854閲覧

PHP formの複数の値を1つのボタンで全て送信、受け取りたい

mikage126

総合スコア2

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

1クリップ

投稿2021/05/06 10:17

編集2021/05/07 02:03

前提・実現したいこと

イメージ説明

イメージ説明

formの複数の値を1つのボタンで全て送信、受け取りたい。

phpを勉強中の初心者です。

データベースから3つの列、id、day、countを一覧で表示。
countはフォームから編集可能で1〜5の整数が入力できる。

入力された数値がデータベースに更新される。という仕組みを作りたい。

送信先のページではcountが0ならば 「×」、それ以外は「○」を表示する。

https://teratail.com/questions/88605
おそらく近い内容だとは思うのですが、少し違うような気もしてさっぱりの状態です・・・。

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

全部で56箇所あるが、最後の一件のみ送信される。 送信先のページで、データベースをupdate、その数値に応じて表記が変わるようにしてます。 例:左上のマス id=1 day=日 count=5とします。 countを「0」に書き換え、データベースを更新できれば次のページでは「×」が表示されます。 しかし、実際はその動作ができるのは一番最後 左下の id=56 day=土 count=5 の一件だけなので、 1〜56を書き換えて、全て送信、更新ができるようにしたい。

該当のソースコード

echo '<form action="reserv_2-output.php" id="form" method="post">'; echo '<div class="week-list">'; foreach ($pdo->query('select * from reserv_2') as $row) { echo '<div class="list-day">'; echo '<input type="hidden" name="id[]" value="', $row['id'], '">'; echo '<div class="td0">', $row['id'], '</div>'; echo '<input type="hidden" name="day[]" value="', $row['day'], '">'; echo '<div class="td0">', $row['day'], '</div>'; echo '</div>'; /* /list-day */ } echo '</div>'; echo '<div class="count-list">'; foreach ($pdo->query('select * from reserv_2') as $row) { echo '<div class="td1">'; echo '<input class="counter" type="text" name="count[]" value="', $row['count'], '">'; echo '</div>'; } echo '</div>';/* count-list */ echo '<div class="td2"><input type="submit" value="更新"></div>'; echo '</div>'; echo '</form>'; echo "\n";

送信の受取の記述

echo $_REQUEST['id'],$_REQUEST['day'], $_REQUEST['count']; /*確認用*/ $pdo=new PDO('mysql:host=localhost;dbname=sample;charset=utf8', 'root', 'root'); echo '<div class="update">'; $sql=$pdo->prepare('update reserv_2 set count=? where id=?'); if (!preg_match('/[0-5]+/', $_REQUEST['count'])) { echo '在庫を1〜5の整数で入力してください。'; } else if ($sql->execute( [htmlspecialchars($_REQUEST['count']), $_REQUEST['id']] )) { echo '更新に成功しました。'; } else { echo '更新に失敗しました。'; }

試したこと

phpのフォームの一括送信やデータベースのレコードの一括更新について調べたり、自分と似通った質問をされている方の投稿を見に行ったりなどしましたが、めぼしい解決策が見つからず

補足情報(FW/ツールのバージョンなど)

受け取る側のコードがいる場合などは申し付けください。

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

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

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

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

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

m.ts10806

2021/05/06 10:47

リクエストを受け取っている部分のコードを提示していください。 「最後の一件のみ送信される」をどのように確認したか具体的に記載してください。
mikage126

2021/05/07 01:38

編集いたしました。 ご確認いただければ幸いです。
guest

回答1

0

ベストアンサー

postでcount[]という名前でおくるのであれば
受け取り側で
$count=filter_input(INPUT_POST,"count",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY);
のように受け取ってください

投稿2021/05/06 10:32

yambejp

総合スコア116724

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

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

mikage126

2021/05/06 10:47

ご回答いただきありがとうございます! 受取側の処理なのですが、ここのどこかを書き換えるということでしょうか? (参考書を読みながらで、理解が浅いまま書いてることもありますのでご了承ください・・) $pdo=new PDO('mysql:host=localhost;dbname=sample;charset=utf8', 'root', 'root'); echo '<div class="update">'; $sql=$pdo->prepare('update reserv_2 set count=? where 日付id=?'); if (!preg_match('/[0-5]+/', $_REQUEST['count'])) { echo '在庫を1〜5の整数で入力してください。'; } else if ($sql->execute( [htmlspecialchars($_REQUEST['count']), $_REQUEST['日付id']] )) { echo '更新に成功しました。'; } else { echo '更新に失敗しました。'; } echo '</div>';
yambejp

2021/05/06 11:00 編集

まずSQL文を理解してください 複数データを投入して一気に入れ替えるのはELTとFILEDを利用します。 filter_inputでcountと日付idを配列で受け update reserv_2 set count=COALESCE(ELT(FIELD(日付id,?,?,?),?,?,?),count) のような処理をします。 これをprepareに落とし込めばよいでしょう なお、「日付id」のような日本語名カラムやinputのname要素に利用することは 問題の切り分けができなくなるだけなので、初心者なら絶対にやってはいけません
mikage126

2021/05/07 02:12

$sql=$pdo->prepare('update reserv_2 set count=COALESCE(ELT(FIELD(日付id,?,?,?),?,?,?),count)'); という記述でよろしいのでしょうか? ?は更新する数だけ追加していくのでしょうか?
yambejp

2021/05/07 02:14

ひとつひとつクリアするしか無いと思いますよ。 どこまで理解していますか? postデータが配列で受け取れるようになりましたか?
mikage126

2021/05/07 02:59

受け取れてないように思います・・ そもそもの思い違いかもしれませんが、下記のフォームで送信を押した時 受取で送った count がずらっと並ぶ ということではないのでしょうか? echo '<form action="reserv_2-output.php" id="form" method="post">'; foreach ($pdo->query('select * from reserv_2') as $row) { echo '<div class="td1">'; echo '<input class="counter" type="text" name="count[]" value="', $row['count'], '">'; } echo '<div class="td2"><input type="submit" value="更新"></div>'; echo '</form>'; 受取 $count=filter_input(INPUT_POST,"count",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); echo $count ;
yambejp

2021/05/07 03:04

> echo $count ; まずはprint_r($count)やvar_dump($count)するところから覚えてください
mikage126

2021/05/07 03:27 編集

何度も申し訳ありません。下記で送信元からidとcountを配列で受け取ることができました。 $count=filter_input(INPUT_POST,"count",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); print_r($count) ; $id=filter_input(INPUT_POST,"id",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); print_r($id) ; ここから、受け取った配列を一気にupdateするには $sql=$pdo->prepare('update reserv_2 set count=? where id=?'); を $sql=$pdo->prepare('update reserv_2 set count=COALESCE(ELT(FIELD(id,?,?,?),?,?,?),count); $sql->execute( [htmlspecialchars($count),$id]) ; という記述にする という認識で合っているのでしょうか 抜け落ちなどございますか?
yambejp

2021/05/07 04:21

挿入/更新処理には3種類あります (1)競合データがあれば無視、競合しないデータのみ挿入 (2)競合データがあれば更新、競合しないデータは挿入 (3)競合データがあれば更新、競合しないデータは無視(挿入しない) 今回の流れですと(3)で間違いないですか?
yambejp

2021/05/07 04:32

$len=count($id); $data=[]; if($len){ $placehold=str_repeat(",?",$len); $sql="update reserv_2 set count=COALESCE(ELT(FIELD(id${placehold})${placehold}),count)"; $data=array_merge($data,$id,$count); print $sql; print_r($data); $stmt=$pdo->prepare($sql); $stmt->execute($data); }
mikage126

2021/05/09 03:42

ご返信ありがとうございます! 3競合データがあれば更新、挿入しないものです。 記述いただいたコードで全てのupdate処理がされました。ありがとうございました! 受け取った配列をupdateしているのは全体的に分かるのですが str_repeatは反復処理、array_mergeは配列結合など、一つ一つはどういう役割がされているのでしょうか?
yambejp

2021/05/09 05:47

ロジックより基礎を学習するほうが先でしょうね とにかく多くの関数をテストしてみてください 関数名がわかっているのですからマニュアルを確認してみてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問