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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

MySQL

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

タグ

特殊な記法により文書に埋め込む形で記述される付加情報をタグと呼びます。文書構造や書式、文字飾りなどを指示したり、画像や他の文書へのリンクを埋め込むことができる。

PHP

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

Q&A

解決済

1回答

1721閲覧

チェックボックスで複数値を送信したい

cacao86

総合スコア97

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

MySQL

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

タグ

特殊な記法により文書に埋め込む形で記述される付加情報をタグと呼びます。文書構造や書式、文字飾りなどを指示したり、画像や他の文書へのリンクを埋め込むことができる。

PHP

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

0グッド

0クリップ

投稿2020/04/14 05:56

表題の通りでして、現状チェックボックスで値が複数チェックしても1つしか送信されません。
formタグ内にあるinputタグ内のform属性をdeleteにすれば複数チェックして複数送信されるのですが、そうした場合下部の削除ボタンのform属性が被ってしまいます。同一idのform要素(form="delete")があり、文法上問題があると思い改善をしたいと思っています。id要素はユニークに設定したいです。
受け取り側のPHPでもvar_dumpで1つしか出力されないので送信側で複数送れていないのではないかと思うのですが、対処法がわかりませんでした。何卒ご教示いただきたい次第です。よろしくお願いいたします。
↓送信するindex.php

php

1 <tr> 2 <td><input type="checkbox"></td><td>ID</td><td>件名</td><td>投稿ユーザー</td><td>投稿日時</td> 3 </tr> 4 <?php 5 foreach($rows as $row){ 6 ?> 7 <tr> 8 <td> 9 <form action="delete.php" method="GET" onSubmit="return check()" id="delete"> 10 <input type="checkbox" name="id[]" value="<?php print($row['id']);?>">//ここにform="delete"と書くと複数チェックしても上手くいくが「削除する」のinputとformが被るので改善したい 11 </form> 12 </td> 13 <td><?php print($row['id']); ?> 14 </td> 15 <td> 16 <form action="edit.php" method="POST"> 17 <a href="edit.php?id=<?php echo $row['id'];?>"> 18 <?php echo $row['subject']; ?> 19 </a> 20 </form> 21 </td> 22 <td><?php echo $row['post_user']; ?></td> 23 <td><?php echo $row['created_at']; ?></td> 24 </tr> 25 <?php 26} 27?> 28 </table> 29 <input form="delete" type="submit" value="削除する"> 30 31 <script type="text/javascript"> 32 function check(){ 33 if(window.confirm('本当に削除しますか?')){ 34 return true; 35 var elements = document.getElementsByName('id[]') ; 36 for(var i = 0 ; i < elements.length ; i ++){ 37 if(elements[i].checked == true){ 38 // alert(elements[i].value); 39 location.href = "delete.php"; 40 } 41 } 42 } 43 else{ 44 window.alert('キャンセルされました'); 45 return false; 46 } 47 } 48 </script>

↓受け取るdelete.php

php

1<?php 2require('dbconnect.php'); 3var_dump($_GET['id']); //複数チェックしても1つしか表示されない 4 5 if (isset($_GET['id']) && is_array($_GET['id'])) { 6 $id = []; 7 $id = $_GET['id']; 8 }else{echo "NOTARRAY";} //NOTARRAYが表示される 9 10 for($i=0;$i < count($id); $i++){ 11 $sql = "update t_bbs_6_6 set deleted_at = cast(now() as datetime) WHERE id = $id[$i];"; 12 $stmt = $db->prepare($sql); 13 $stmt->execute(); 14 } 15var_dump($id) //nullになる 16 // header('Location: index.php'); 17 // exit(); 18 ?> 19

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/04/14 06:32

「削除する」の意味がダブルミーニングなら、命名ルールを決めて分ければいいんじゃないですかね。親投稿の削除なのか、コメントの削除なのかを区別できるように工夫するしかないのではないかと。あるいは、2つの意味の削除処理を共通化させるのがそもそもおかしいので、目的別に削除処理phpを分けてPOST送信先を変えるとか。これ、作りながら考えるんじゃなくて、作る前の設計時点の話ですよ。
guest

回答1

0

ベストアンサー

根本的な原因:formは1つしか送信できない。

「値が1つしか」ではなく「1formしか」という意味です。
現在のコードだと1つのID毎にformタグが閉じられて完結しています。
なので1つしか送信していません。
1submitで送信したい情報は全て、1つのform内に入れましょう。

簡易例:

html

1<form> 2<?php 3for($i=1;$i<=10;$i++){ 4 echo '<input type="checkbox" name="id[]" value="'.$i.'">'.$i; 5} 6?> 7</form>

今回の質問者さんの内容だと、tableタグをformタグで囲う形にすると良いと思います。


以下、最初に書いたものの、よく見直すと根本原因ではなかった内容。


location.href の時点で画面遷移してるからだと思います。

画面遷移させるのではなく、チェック有無確認せずに単純にform.submitでいけそうに思います。
※イベントはformのOnSubmitではなく送信ボタンのOnClickにするのが望ましい

updateも同じ値にするなら、回さずにinで一発で済むはずです。

ただDBに変更を起こす処理をGETで行うべきではないと思います。URLで直でアクセスして実行させられるので不正に実行できてしまいます。
POSTにしましょう。

投稿2020/04/14 06:59

編集2020/04/14 12:32
m.ts10806

総合スコア80861

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

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

cacao86

2020/04/14 08:40 編集

ご回答ありがとうございます。 回答を参考に変更を加えてみたのですが、未だ値が1つしか送信されません。form..submitの書き方が悪いのでしょうか? また、onclickにしたことによりチェックする度にalertが出てしまうのですが、削除を押した時にだけalertを出すことはできないのでしょうか? <form action="delete.php" method="POST" onclick="return check()" id="delete"> <input type="checkbox" name="id[]" value="<?php print($row['id']);?>"> </form> (中略) <script type="text/javascript"> function check(){ if(window.confirm('本当に削除しますか?')){ return true; var elements = document.getElementsByName('id[]') ; for(var i = 0 ; i < elements.length ; i ++){ if(elements[i].checked == true){ // alert(elements[i].value); form.submit = "delete.php"; } } } else{ window.alert('キャンセルされました'); return false; } } </script>
cacao86

2020/04/14 08:47

onclickは <input form="delete" type="submit" value="削除する" onclick="return check()"> の方に記述することで対応できました。
m.ts10806

2020/04/14 09:59

return trueしてるってことは後続の処理は行われません。 色々混ざりこんでるので、ひとまず、ざっと作り直した方が整理できるかもしれません。
m.ts10806

2020/04/14 12:33

提示されたHTMLよく見たら根本原因と思われる現象に気づいたので冒頭に追記しました。 最初の回答の冒頭は誤りがありました。すみません。
cacao86

2020/04/15 00:17

追記ありがとうございます。 自分の方でもjavascriptの方は一旦置いておいてformタグの位置を変更したところ無事解決できました。 form1つ送信して処理が終了していたのですね。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問