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

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

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

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

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

2933閲覧

チェックボックスで複数削除

cacao86

総合スコア97

MySQL

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

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/03/24 03:47

編集2020/03/26 00:49

チェックボックスは記事と1対1の関係で、記事数分だけ存在します。
削除ボタンは画面に一つだけです。
index.phpでチェックされた値を保持して削除ボタンを押したらdelete.phpのSQLを動かす方法でやってみたのですが、削除ボタンを押しても削除されませんでした。
delete.phpではdeleted_atに時間を入れて論理削除を使用しています。
おそらくチェックされた投稿のidがdelete.phpに渡っていないことが原因なのではないかと予想しますが、対処の仕方がわかりません。
ご教授いただけると幸いです。よろしくお願いします。

index.php

1<?php 2require('dbconnect.php'); 3 4$subject = $_POST['subject']; 5$body = $_POST['body']; 6$post_user = $_POST['post_user']; 7 ?> 8 9<?php 10// create.phpから送信されてきた場合 11if (isset($_POST["subject"], $_POST["post_user"])) { 12 //件名が空のとき 13 if ($_POST["subject"] == '') { 14 $isSubject = false; 15 }else { 16 $isSubject = true; 17 } 18 //投稿ユーザーが空のとき 19 if ($_POST["post_user"] == '') { 20 $isPost_user = false; 21 } else { 22 $isPost_user = true; 23 } 24} 25 // データベースに追加する 26 if (isset($isSubject, $isPost_user)) { 27 if ($isSubject && $isPost_user) { 28 try { 29 30 $sql = "insert into t_bbs (subject, post_user) VALUES (:subject, :post_user)"; 31 $stmt = $db->prepare($sql); 32 $stmt->bindValue(":subject", $_POST["subject"], PDO::PARAM_STR); 33 $stmt->bindValue(":post_user", $_POST["post_user"], PDO::PARAM_STR); 34 $stmt->execute(); 35 }catch (PDOException $e){ 36 print('Error:'.$e->getMessage()); 37 die(); 38 } 39 } 40 } 41//ここまでcreate.phpの処理 42?> 43<?php 44 45$sql = "select * from t_bbs where parent_id is null and deleted_at is null order by id desc"; 46 $stmt = $db->query($sql); 47 while($row = $stmt->fetch()){ 48 $rows[] = $row; 49 } 50 51 //データベース接続切断 52 $db = null; 53 54 ?> 55 <!DOCTYPE html> 56 <html> 57 <head> 58 <title>一覧表示</title> 59 <meta charset="utf-8"> 60 </head> 61 <script type="text/javascript"> 62 function disp(){ 63if(window.confirm('本当に削除しますか?')){ 64 location.href = "index.php"; 65} 66else{ 67 window.alert('キャンセルされました'); 68} 69} 70 </script> 71 <body> 72 <h1>一覧表示</h1> 73 74 <table border='1'> 75 <tr> 76 <td>ID</td><td>件名</td><td>投稿ユーザー</td><td>投稿日時</td> 77 </tr> 78 79 <?php 80 foreach($rows as $row){ 81 ?> 82 <tr> 83 <form action="delete.php" method="post"> 84 <td><input name="id[]" type="checkbox" value=""</td><?php echo $row['id']; ?> 85 </form> 86 <td> 87 <form action="edit.php" method="GET"> 88 <a href="edit.php?id=<?php echo $row['id'];?>"> 89 <?php echo $row['subject']; ?> 90 </a> 91 </form> 92 </td> 93 <td><?php echo $row['post_user']; ?></td> 94 <td><?php echo $row['created_at']; ?></td> 95 </tr> 96 <?php 97 } 98 ?> 99<!-- <a href="edit.php?id=<?php print($row['id']);?>"> --> 100 </table> 101 102 <!-- <form action="delete.php" method="post"> --> 103 <p><input type="button" value="チェックした投稿を削除する" onClick="disp()"></p> 104 <!-- </form> --> 105 <p> 106 <a href="create.php">新規投稿へ</a> 107 </p> 108 </body> 109 </html> 110

delete.php

1<?php 2require('dbconnect.php'); 3 4 if(isset($_REQUEST['id']) && is_numeric($_REQUEST['id'])) { 5 $id = $_REQUEST['id']; 6 var_dump($id); // 追加 7 var_dump($_REQUEST['id']); // 追加 8 9 $statement = $db->prepare("update t_bbs set deleted_at = cast(now() as datetime) WHERE id=?"); 10 $statement->execute(array($id)); 11 } 12?> 13

追記

削除ボタンを押したら論理削除されたものを除いてindex.phpに戻ってくることを実行させたいです。

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

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

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

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

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

guest

回答3

0

if(window.confirm('本当に削除しますか?')){ location.href = "index.php"; }

削除するのに必要な情報を送信していないんですけど。

普通にフォーム送信するか、Ajaxつかって送信して、
削除に必要な情報を送るようにしてみてはいかがでしょうか。

普通にフォーム送信する前の確認メッセージを表示する例:
JavaScript/フォーム/送信時に確認する - TAG index

普通にフォーム送信するとPOST送信していて、
しかも複数件送信しているので、
$_REQUEST['id']ではなく$_POST['id[]']になります。
過去の質問も読んでください。
PHP - フォームから複数のデータを送信する場合のnameのつけ方|teratail

投稿2020/03/24 03:51

編集2020/03/24 03:54
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

cacao86

2020/03/24 05:08 編集

ご回答ありがとうございます。 回答を参考に if(window.confirm('本当に削除しますか?')){ return true; location.href = "delete.php"; } else{ window.alert('キャンセルされました'); return false; } と <form action="delete.php" method="post" onSubmit="return disp()"> <p><input type="submit" value="チェックした投稿を削除する"></p> </form> と $_REQUESTの部分を$_POST['id[]'] に変更して、チェックして削除ボタンを押したら、delete.phpへ遷移して真っ白な画面になってしまいました。これはdelete.phpへの送信は成功したけど、そこでindex.phpへ戻ってくるプログラムを書いていないからでしょうか? 後からで申し訳ないのですが、削除ボタンを押したら論理削除されたものを除いてindex.phpに戻ってくることを実行させたいです。 よろしくお願いします。
cacao86

2020/03/24 04:59

delete.phpの最後に header('Location: index.php'); exit(); を書いたらindex.phpへ遷移しましたが削除されていませんでした。
退会済みユーザー

退会済みユーザー

2020/03/24 05:41

location.href で飛ばしちゃ、フォームでせっかく入力したデータを送信しないのです。 リンク先の記事をちゃんと読んで理解に努めて、わからない所があればご指摘ください。
cacao86

2020/03/25 04:39

削除ボタン押す ↓ delete.phpに送信 ↓ delete.phpで処理 ↓ index.phpに戻る この流れでしたら、 ・functionではdelete.phpに飛ばす処理 ・delete.phpではindex.phpに戻る処理 を書くという方向でよろしいのでしょうか?
guest

0

location.hrefで行われるのはいわゆる「リダイレクト」
単なる画面遷移です。
この場合のrequest methodはGETですし、GETにしても何も情報を送信していません。

ひとまずリダイレクト先がindex.phpになっていてはdelete.phpが実行すらされないのは当然なのでdelete.phpに変更し、Query Stringで選択した行のidを付加してリダイレクトさせればうまいこといくんではないかと思います。
つまりactionをdelete.phpにしているformは不要と、いうことになります。

が、私ならAjaxにします。

投稿2020/03/24 03:58

m.ts10806

総合スコア80875

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

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

cacao86

2020/03/24 05:24

ご回答ありがとうございます! リダイレクト先はdelete.phpに変更いたしました。ですが 「Query Stringで選択した行のidを付加してリダイレクト」はどうやってやるのでしょうか?
m.ts10806

2020/03/24 05:29

二点確認です。 ・Query Stringがなんのことか分かりますか? ・JavaScriptでinputの値の取り方は分かりますか?
m.ts10806

2020/03/24 05:53

・「SQLでとった」は特になくてよいですが、おおよそあってます。 delete.php?id=1 とかで直にアクセスすると$_REQUESTなら動くかなと思います。 ・「セレクタ」という考え方なのでgetByIdに限りませんが、手法としてはありです。 で、もう一点、 delete.php見る限り、一件しか削除するようになってませんが、やりたいことは「チェックしたものをすべて削除」ですよね。 DELETE文も見直す必要がありそうに思います。 in とか使って複数対象となるように。
cacao86

2020/03/25 04:24

<td><input name="<?php $row['id[]'] ?>" type="checkbox" value="<?php echo $row['id[]']; ?>"><?php echo $row['id']; ?> 上記のようにinputの中をいじってみたりしましたがidが取れず詰まってしまいました。 また、JavaScriptでinputの値のとり方もどう書けば動くのか検討がつきませんでした。 ほぼ丸投げのようになってしまっていますが、お教えいただけないでしょうか?
cacao86

2020/03/25 04:26

色々いじってぐちゃぐちゃ奈なってしまっているかも知れませんが、index.phpの現在です。 <td>ID</td><td>件名</td><td>投稿ユーザー</td><td>投稿日時</td> </tr> <?php foreach($rows as $row){ ?> <?php var_dump($row['id']); ?> <tr> <!-- <form action="delete.php" method="GET" onSubmit="return check()"> --> <td><input name="<?php $row['id[]'] ?>" type="checkbox" value="<?php echo $row['id[]']; ?>"><?php echo $row['id']; ?> <input type="hidden" name="id[]" value="<?php echo $row['id[]']; ?>"> </td> <!-- </form> --> <td> <form action="edit.php" method="GET"> <a href="edit.php?id=<?php echo $row['id'];?>"> <?php echo $row['subject']; ?> </a> </form> </td> <td><?php echo $row['post_user']; ?></td> <td><?php echo $row['created_at']; ?></td> </tr> <?php } ?> </table> <form action="delete.php" method="GET" onSubmit="return check()"> <p><input type="submit" value="チェックした投稿を削除する"></p> </form> <script type="text/javascript"> function check(){ if(window.confirm('本当に削除しますか?')){ return true; var elements = document.getElementsById('id[]') ; for(var i = 0 ; i < elements.length ; i ++){ if(elements[i].checked == true){ alert(elements[i].value); } } location.href = "delete.php"; } else{ window.alert('キャンセルされました'); return false; } } </script>
m.ts10806

2020/03/25 04:27

下記、要件なので具体的に、質問本文に記載願います。 >で、もう一点、 delete.php見る限り、一件しか削除するようになってませんが、やりたいことは「チェックしたものをすべて削除」ですよね。
cacao86

2020/03/25 04:32

質問文に書き換えたことを追記すればよろしいのでしょうか?
guest

0

自己解決

formタグにid属性、inputタグにform属性を持たせることで解決できました。
ご回答いただきました方々に感謝いたします。

index.php

1<!DOCTYPE html> 2 <html> 3 <head> 4 <title>一覧表示</title> 5 <meta charset="utf-8"> 6 </head> 7 <body> 8 <h1>一覧表示</h1> 9 10 <table border='1'> 11 <tr> 12 <td><input type="checkbox"></td><td>ID</td><td>件名</td><td>投稿ユーザー</td><td>投稿日時</td> 13 </tr> 14 <?php 15 foreach($rows as $row){ 16 ?> 17 <tr> 18 <td> 19 <form action="delete.php" method="GET" onSubmit="return check()" id="delete"> 20 <input form="delete" type="checkbox" name="id[]" value="<?php print($row['id']); ?>"> 21 </form> 22 </td> 23 <td><?php print($row['id']); ?> 24 </td> 25 <td> 26 <form action="edit.php" method="POST"> 27 <a href="edit.php?id=<?php echo $row['id'];?>"> 28 <?php echo $row['subject']; ?> 29 </a> 30 </form> 31 </td> 32 <td><?php echo $row['post_user']; ?></td> 33 <td><?php echo $row['created_at']; ?></td> 34 </tr> 35 <?php 36} 37?> 38 </table> 39 <input form="delete" type="submit" value="削除する"> 40 41 <script type="text/javascript"> 42 function check(){ 43 if(window.confirm('本当に削除しますか?')){ 44 return true; 45 var elements = document.getElementsByName('id[]') ; 46 for(var i = 0 ; i < elements.length ; i ++){ 47 if(elements[i].checked == true){ 48 // alert(elements[i].value); 49 location.href = "delete.php"; 50 } 51 } 52 } 53 else{ 54 window.alert('キャンセルされました'); 55 return false; 56 } 57 } 58 </script> 59 <p> 60 <a href="create.php">新規投稿へ</a> 61 </p> 62 </body> 63 <!-- <form action="delete.php" method="GET" onSubmit="return check()"> 64 <input type="checkbox" name="id[]" value="<?php echo $row['id']; ?>"> 65 <?php echo $row['id']; ?> 66 <input type="submit" value="削除する"> 67 </form> --> 68 </html> 69

delete.php

1<?php 2 3require('dbconnect.php'); 4var_dump($_REQUEST['id']); 5 6 $id = $_REQUEST['id']; 7 // $max =count(array($id)); 8 9 for($i=0;$i < count($id); $i++){ 10 $sql = "update t_bbs set deleted_at = cast(now() as datetime) WHERE id = $id[$i];"; 11 $stmt = $db->prepare($sql); 12 $stmt->execute(); 13 } 14?> 15<?php 16 header('Location: index.php'); 17 exit(); 18 ?> 19

投稿2020/03/26 03:23

cacao86

総合スコア97

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

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

cacao86

2020/03/26 03:28

注意として、このやり方はIEなどのブラウザによっては対応していない場合があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問