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

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

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

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

Q&A

1回答

2793閲覧

phpで複数のボタンを識別したい

Gnr4A

総合スコア30

PHP

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

0グッド

0クリップ

投稿2021/05/26 05:25

phpについて質問します。ボタンをforeach分回し、各ボタンに名前を付けたいです。
一番上のボタンを押したら別の操作、2番目のボタンを押したらまた別の操作と操作を分けるためです。

php

1<?php 2$tbl=[['名前','年齢','住所'],['太郎',16,'秋田'],['次郎',18,'熊本'], 3['三郎',20,'岩手']]; 4 5<form action='' method='post'> 6<table border=1> 7 </tr> 8 <?php foreach($tbl as $value){ ?> 9 <tr> 10 <?php foreach($value as $key){ ?> 11 <td><?php print $key; ?></td> 12 <?php } ?> 13 <td> 14 <input type="submit" name='updata' value='修正'> 15 <input type="submit" name='delete' value='消去'> 16 </td> 17 </tr> 18 <?php } ?> 19</table> 20</form> 21?>

例のままでは名前がupdateのものとdeleteのものが$valueの要素分繰り返してしまします。一つのボタンを押したら複数のボタンを押した判定になって厄介です。
なので各ボタンに名前を付けたいです。どうしたらいいのでしょうか。

自分が試したやり方は、foreachなので=>を使い、添え字を取り出し、nameに<?php print $a; ?>としてつけて、処理部分で分岐させるやり方です。ですがこれだと、$_POST送信でエラーが生じてしまいます。多分.0、.1がダメなのだと思います。どうしたらいいのでしょうか。それともこのやり方では無理なのでしょうか。

php

1<?php 2$tbl=[['名前','年齢','住所'],['太郎',16,'秋田'],['次郎',18,'熊本'], 3['三郎',20,'岩手']]; 4 5<form action='' method='post'> 6<table border=1> 7 </tr> 8 <?php foreach($tbl as $value => $a){ ?> 9 <tr> 10 <?php foreach($value as $key){ ?> 11 <td><?php print $key; ?></td> 12 <?php } ?> 13 <td> 14 <input type="submit" name='1'.<?php print $a; ?> value='修正'> 15 <input type="submit" name='2'.<?php print $a; ?> value='消去'> 16 //name属性に$tblの縦列の添え字が入ります 17 </td> 18 </tr> 19 <?php } ?> 20</table> 21</form> 22?>

受け取り部分(処理)

php

1<?php 2//修正部分の一番最初が押された時 3if(isset($_POST['1'.0])){ 4 header(バス名); 5}else if(isset($_POST['2'.0])){ //消去部分の一番最初が押された時 6 header(パス名); 7?>

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

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

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

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

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

guest

回答1

0

「動的」という概念を身に着けてください。
リクエスト送信先で分岐させていたら幾つ来るかわからない要素を加味して組まなければなりません。一万レコードあったら?

でも、編集にしろ削除にしろ、行に組み込むということは個別に処理させるわけですよね。
table自体をformで囲ってしまったら全部飛ばします。

前の質問に「IDも取得してフォームに埋め込んだりパラメータつけてリンクでいいんじゃない」みたいな回答あったと思いますが、読まれましたか?分からないなら投稿者に確認してください。
フィードバックしないまま未解決のまま放置して同じ質問繰り返してます。

個別に編集させるならformもボタン毎に作れば良いですし、同じnameを参照すればそれぞれ押した行の値が送信されるので、処理したいレコードだけ対応できます。

php

1<form action='action' method='get'> 2 <input type="hidden" name='id' value='<?=$row['id']?>'> 3 <button name="action" value='updata'>更新</button> 4 <button name="action" value='delete'>削除</button> 5</form>

getで送ってるので下記でも同じ
form不要

php

1 <a href='action?action=update&id=<?=$row['id']?>'>更新</a> 2<a href='action?action=delete&id=<?=$row['id']?>'>削除</a>

ボタンが良ければCSSでボタンっぽい見た目にすれば良し。

これでリクエスト送信先で$_GET['action']を参照すれば押された方のvalueが入ってきてるし、$_GET['id']を参照すれば押された行のidが入ってきてる。
あとはそのidで再検索かけて対象業のすべての情報を取得。

URLパラメータについては、フレームワークの影響はあるものの、teratailの一覧から詳細への遷移、そこから投稿編集への遷移で目の前で何を渡してるか確認できるし、参考にできますよ。

なので、前の質問にて質問者さんが欲しているヒントとして「必要な情報の整理」を挙げたわけですが、いきなり実装からし続ける限り、ずっと進まないと思います。
現に進んでませんね。
やりたいことだけ先行してやろうとするからです。

投稿2021/05/26 05:46

編集2021/05/26 06:18
m.ts10806

総合スコア80852

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

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

Gnr4A

2021/05/27 00:45

回答ありがとうございます。 <a href='action?action=update&id=<?=$row['id']?>'>更新</a> <a href='action?action=delete&id=<?=$row['id']?>'>削除</a> このサンプルですが、action?actionここって何しているのでしょうか。 delete&id=<?=$row['id']?> ここは次のページでGET送信しているのはわかるのですが、パス名ってどこに書けばいいのでしょうか。
m.ts10806

2021/05/27 00:45

クエリストリング で検索
Gnr4A

2021/05/27 02:50

POSTでの送り方も知りたいです。
m.ts10806

2021/05/27 02:54

formのほうをgetからpostに変えるだけ
Gnr4A

2021/05/27 02:57

urlパラメーターに値を書いていますので、getをpostに変えることはできません
m.ts10806

2021/05/27 03:04

ちょっと意味がわかりません。 リンクでの遷移は常にGETリクエストにしかできません。 postにしたいならformで明示的に宣言するしかありません。
Gnr4A

2021/05/27 03:13

ではpostにしてinput type='submit'>にしたらname属性に2つ以上値を持たせることはできますでしょうか。 例えばそのボタンにupdateと1というnameをつけて次のページに送りたいとき、nameに2つくっつけて送信できるのでしょうか。
Gnr4A

2021/05/27 03:49

2つ以上name属性を付与しているinputなどは見たことがなくて、つけれるのか聞いただけです。
m.ts10806

2021/05/27 04:05

同一属性は一要素1つです。 常に「やりたいこと」しかコメントされてない上にほとんど同じところをグルグル回ってる質問しかされてないので、アドバイスが無駄になっていると感じた次第です。 投げすぎ。少しは考えて。
Gnr4A

2021/05/27 04:40

それで解決していないから聞き方を変えているだけです。 それにある程度は自己解決していることもあります。でも自己解決を報告しても文句言われるだけなので報告しないだけです。 自分だって自分なりに考えてコードを作っています。誰かのをパクッて張り付けて聞いているのではありませんよ?分からないから聞いているのです。以上
K_3578

2021/05/27 04:54

横槍入れますけど、 一日に何回も質問している、それも数時間程度で質問していたら普通は何も考えずに 次々と疑問を投げているだけにしか感じませんよ。 それに、質問は基本的に一つずつです。回答が付いていて未解決の質問を残したまま質問する のはマナーとして良いことではないですし、他ユーザーから回答を敬遠される理由にもなります。 >でも自己解決を報告しても文句言われるだけなので報告しないだけです。 https://teratail.com/questions/340393#reply-468357 この回答の事でしょうか。これは私もコメントしてますが文句を言っているのでは無く、 回答には解決した方法を書いてくれと要請しているだけです。
m.ts10806

2021/05/27 05:01

解決してないなら新しい質問を立てる必要ないです。要件同じならその質問で完結してください。 少しでも考えてるように見えるならそんな無粋な指摘しませんよ。 でもあなたは解決してないのにポンポン投げてる。 解決してもどう解決したのか書かない。 指摘される条件しか揃ってません。わざとやってないなら指摘されてることをきちんと受け止めるところからしてください。 指摘を文句だ攻撃だマウントだ言ってるうちは、何も理解できるようになりません。 指摘は成長のためのアドバイスにほかならない。 クレームはビジネスチャンス。 もし学生さんなら覚えといてください。社会人なら反省してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問