• 締切済み

チェックボックスによる複数のレコード削除について

PHP version 4.4.4を使用しています。 テーブルの中に下記のデータがあるとします。 cID uname      mls 2 abc@abc.com 1234567896 2 abc@abc.com 1234567894 2 abc@abc.com 1234567892 1 test@test.com 1234567892 インターネットで色々調べたのを元に コードを作成したのですが、Submitボタンを押すと チェックボックスに選択されたレコードは削除されず、 1つ新たなレコードをデータに入力されてしまいます。 <例えば> cID:2、uname:abc@abc.com、で絞ったデータの中から 1234567894、と 1234567892 を削除しようとすると、 選択されたデータは削除されず、 下記のように新たなデータが1つインサートされます。 cID uname mls 2 abc@abc.com 0 それをした後だと、更新ボタン(ページがリロード)をクリックする度に 新たなデータが又1つインサートされます。 何方かこの問題を解決して頂けるととても助かります。 どうぞ宜しく御願いします。 フォームは下記の通りです。 <form action="<?=$_SERVER['PHP_SELF'] ?>" method="post"> <INPUT type="checkbox" name="id[]" value="<?=$mls?>"> <input type="submit" name="submit" value="Delete selected"> </form> 使用してるコードは下記の通りです。 //配列に入っている? if( is_array( $_REQUEST['id'] ) ){ //更新のあった行数 $cnt = 0; //配列の分だけSQL foreach( $_REQUEST['id'] as $myid ){ //エスケープ $myid = intval( mysql_escape_string( $myid ) ); $sql = "DELETE FROM $table2 WHERE cID='$session[cID]' AND id = '{$myid}' LIMIT 1 ; "; $result = mysql_query( $sql ); //更新のあった分だけ足す if( $result ){ $cnt += mysql_affected_rows(); } } echo "{$cnt}行が削除されました。"; }

  • PHP
  • 回答数1
  • ありがとう数1

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>1つ新たなレコードをデータに入力されてしまいます。 DELETE文でレコードが追加されることはありません。 全体像が見えないのでなんともいえませんが、 おそらくフロー制御がわるく、追加や更新のルーチンが作動しているのでは? とりあえずは$sqlをprintしてみてデバッグするとよいのでは?

edokko-x
質問者

お礼

yambejpさま、 御回答を頂きどうも有難うございます。 「DELETE文でレコードが追加されることはありません。」というのを 聞いて、 確かに・・・っと、それがきっかけで 何故そうなるのかやっと問題を解決しました。 Delete文をInsert文の後に入れてたのが問題でした。 どうも有難うございました。

関連するQ&A

  • SELECT、WHERE 文で、複数あるデータの内容のうち1つのデータしか戻ってこない

    PHP version 4.4.4を使用しています。 テーブルの中に下記のデータがあるとします。 cID uname mls 2 abc@abc.com 1234567896 2 abc@abc.com 1234567894 2 abc@abc.com 1234567892 1 test@test.com 1234567892 下記のコードで SELECT、WHERE 文を使って絞った中の 複数あるデータ内容のうち1つのデータしか戻ってきません。 <例> cID:2、と uname:abc@abc.com の合った中から mls を取り出す。 $qry = "SELECT * FROM $table2 WHERE cID='$session[cID]' and uname='$session[uname]'"; ECHO で mls を表示させると 1234567896 しか戻ってきません。 私は、1234567896、1234567894、1234567892 と戻ってくるはずだと思ってるのですが、 どこか間違ってるのでしょうか? 色々な方法で試したり、インターネットで調べてもわかりません。 何方かこの問題を解決して頂けるととても助かります。 どうぞ宜しく御願いします。 $qry2 = "SELECT COUNT(*) AS numrows FROM $table2 WHERE cID='$session[cID]' and uname='$session[uname]'"; $res2 = mysql_query($qry2) or die('Error, query failed'); $row2 = mysql_fetch_array($res2, MYSQL_ASSOC); $numrows = $row2['numrows']; $qry = "SELECT * FROM $table2 WHERE cID='$session[cID]' and uname='$session[uname]'"; $result = mysql_query($qry) or die('Error, query failed'); $rows = mysql_fetch_array($result); echo "<font color=red>" . $rows['mls'] . "</font>"; if ($rows['cID'] == '' ) { echo "there is no cID"; } else if ($numrows > 3) { echo "You have Max limit ($numrows) reached."; } if ($rows['mls'] == $id) { echo "MLS # is already exists"; } else { echo "GREAT"; }

    • 締切済み
    • PHP
  • 1キー複数レコード抽出

    今現在 ID | DATE | CNT  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  1 | 200812 | 2  1 | 200901 | 5  2 | 200812 | 1 というデータがあったとします。 これを下記のように1つのIDに対して12のレコードを抽出することは可能でしょうか? ID | DATE | CNT  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  1 | 200804 | 0  1 | 200805 | 0  1 | 200806 | 0  1 | 200807 | 0  1 | 200808 | 0  1 | 200809 | 0  1 | 200810 | 0  1 | 200811 | 0  1 | 200812 | 2  1 | 200901 | 5  1 | 200902 | 0  1 | 200903 | 0  2 | 200804 | 0  2 | 200805 | 0  2 | 200806 | 0  2 | 200807 | 0  2 | 200808 | 0  2 | 200809 | 0  2 | 200810 | 0  2 | 200811 | 0  2 | 200812 | 1  2 | 200901 | 0  2 | 200902 | 0  2 | 200903 | 0 よろしくお願いします。

  • mysqlのレコード削除

    会員登録を削除するプログラムなのですが削除できません。 ログイン時に$_SESSION['id']を既に持っている状態で$_SESSION['id']は mysqlで自動連番が付加されるPRIMARY KEY (id)です。 --- html --- <form method="post" action="unregist.php"> ~アンケート的なものでここの内容は関係ありませんので中略~ <input type="submit" name="unregist" value="退会する"> </form> --- php --- session_start(); session_regenerate_id(true); // データベース接続設定 require_once dirname(__FILE__) . "/../db_conn.php"; $conn = mysql_connect("$db_sv", "$db_user", "$db_pass") or die("接続エラー"); mysql_query("SET NAMES 'utf8'", $conn); mysql_select_db("$db_name", $conn) or die("接続エラー"); if (isset($_POST['unregist'])) { $sql = "DELETE FORM members WHERE id ='" . $_SESSION['id'] . "'"; if (mysql_query($sql, $conn)) { mysql_free_result($res); mysql_close($conn); } else { echo 'エラー!管理へお問い合わせ下さい。'; } 退会するをクリックしてもエラー!管理へお問い合わせ下さい。と 出てしまうのですがどこかおかしい箇所があるでしょうか? 調べてみたのですが自分ではわからずだったので宜しくお願い致します。

    • ベストアンサー
    • PHP
  • php+mysqlで複数選択削除について

    php+mysqlで複数選択削除について いつもお世話になっておりますm(_ _)m 今回の質問なんですが チェックボックスで複数選択したものを一括で削除したいのですが、検索しても見つからないので質問しました!! 例) // $_POST["id"] ← チェックボックスより選択されたデータ // test ← テーブル名 foreach($_POST["id"] as $del){ delete test where id = $del; } 簡単にですいません;; 普通は上記のようにループさせながら削除すると思うのですが、ループさせないで一括で削除したいのですが可能でしょうか? 下記の様にカンマ区切りで一括削除は可能でしょうか? $sql = "delete test where "; foreach($_POST["id"] as $del){ $sql .= "id = $del, "; } クエリ発行

    • ベストアンサー
    • MySQL
  • [SQL]重複内容を持つデータから1件抽出かつ複数のカラムを表示したい

    [SQL]重複内容を持つデータから1件抽出かつ複数のカラムを表示したい 初めてお世話になります。 データベース種別はH2です。 参考:http://www.h2database.com/html/main.html 下記のようなテーブルAがあるとします。   ID  |  TAG  | ―――――+―――――|   1   |  abc   |   1   |  def   |   1   |  ghi   |   2   |  abc   |   2   |  ghi   |   3   |  abc   |   3   |  def   |   3   |  ghi   |   4   |  abc   | 上記テーブルAから下記例のような結果を得られるSQLを知りたいのです。   ID  |  TAG  | ―――――+―――――|   1   |  abc   |   2   |  abc   |   3   |  abc   |   4   |  abc   | 上記結果でなくとも、   ID  |  TAG  | ―――――+―――――|   1   |  def   |   2   |  ghi   |   3   |  def   |   4   |  abc   | であっても構いません。(TAG列のデータはどんな内容でもよいです。) 実現させたいのは、 (1)ID列が重複しない結果を表示させたい、 かつ (2)TAG列も表示させたい ということです。 これでイケるだろ!と思ってあえなく失敗したSQLは下記です; select distinct(ID), TAG from A 宜しくお願い致します。

  • SQLiteで最も古いレコードのみの削除

    AndoroidでDBを使うのですが、考える動作のSQL文が作成できません。 テーブルTESTは以下のカラムを持ちます  ・ID - primary key not null  ・VALUE - not null テーブルTESTは最大で10件のレコードを保持します、11件目のレコードが発生したら 最も古い1件目のレコードを削除してから、11件目のデータを新しい10件目のデータとして テーブルに保存します。 そのために「最も古いレコード1件のみを削除する」というSQLを作成したいのですが、 考えたSQL文が正しくないと怒られてしまいます。 delete from TEST as A, (select * from TEST LIMIT 1)as B where A.ID=B.ID; この動作を1つのSQL文で行うのは不可能なのでしょうか?

  • access VBA SQLの記述について

    access VBA SQLの記述について (下記は私の作成したものではありません) -------------------------------------------- 'IDの取得 myID = [Forms]![フォーム]![ID] '削除クエリ SQLstr = "DELETE FROM テーブル WHERE ID = " & myID DoCmd.RunSQL SQLstr -------------------------------------------- 一応この記述で、問題なく動作しているんです。 「" & myID」の部分は、なぜは正しいのでしょうか? 「" & myID & ""」でないといけないと思っていました。 「&」で囲い、 さらにそれを「”」で囲い、 「&」の前後は半角スペースを挿入する。 という記述のみが正しいと思っていたのですが・・・? また、こういう点の総括した正しい情報はどこで学べますか?

  • 複数選択した場合のチェックボックスの受け渡しについて!

    こんばんわっ! 度々質問させていただいてます。 今回、Mysqlより日記のデータの抽出を行いました。 書いたり更新したり削除したりと言う日記です。 書いたり更新したりは無事出来ました。問題は削除です。 セレクトフォーム形式の場合削除できました。 しかしセレクトフォーム形式の場合一個づつの削除になります。 これじゃあんまりだなぁ・・・と思い。 非常に悩みました。 チェックボックス形式にしようと思いましたっ! 抽出結果に↓をループしました。 <input name="checkbox[]" type="checkbox" value="<?=$id?>" /> 表示結果は↓です。 □太郎さんの5月1日の日記 タイトル;ホニャララ □太郎さんの5月2日の日記 タイトル;ホニャララ チェックした日記を削除する。 の様になります。(□はチェックボックスです) 値の受け渡しはこちらです↓ $result =$_POST['checkbox']; foreach($result as $id) 今回チェックボックス形式の削除は初めてです。 チェックボックスにあるname=checkbox[] と vulue の理解できてません(*∩_∩*) 一つの項目は受け渡せました。 しかし複数チェックを行っていても複数の値を受け渡す事出来ません。 vulue= に問題ありますか! 又は値を受け取る $result =$_POST['checkbox'];  foreach($result as $id) にもんだいありますかっ!

    • ベストアンサー
    • PHP
  • while()から得られるインデックス..

    お世話になります。 whileでSQLデータベースから抽出した一覧(list.php)から、htmlのフォームのラジオボタンを使って SQL上のデータを修正したいと考えていますが、うまくいきません。 list.php------------------------------------------- 1 <? 2 $db = mysql_connect('localhost','user','pass'); 3 $db_name = 'db'; 4 $TBL = "test"; 5 $str_sql = "SELECT * FROM {$TBL}"; 6 $rs = mysql_query($str_sql,$db); 7 $cnt =mysql_num_rows($rs);//データの個数 8 ?> 9  10 <form action="record.php" method="post" name="form1"> 11 <table> 12 <? while($arr_record = mysql_fetch_assoc($rs)){?> 13  <tr> 14  <td> 15  <input name="disp[]" type="radio" value="<? print $arr_record[id];?>"<? if($arr_record[disp] == 1){print" checked=\"checked\"";}?> /> 16  <input name="id[]" type="hidden" value="<? print $arr_record[id];?>"> 17  </td> 18 </tr> 19 <? }?> 20 </table><br /><br /> 21 <input type="hidden" name="cnt" value="<? print $cnt;?>"> 22 <input type="submit" name="Submit" value="Submit" /> 23 </form> list.php ここまで---------------------------------- record.php----------------------------------------- 1 <? 2 $cnt = $_REQUEST['cnt'];//データの個数 3 4 for($i=0;$i<=($cnt-1);$i++){ 5 $disp = $_POST['disp'][$i]; 6 $id = $_POST['id'][$i]; 7 8 if($disp == $id){$disp = 1;}else{$disp = 0;} 9 10 $str_sql = "UPDATE {$TBL} SET disp='{$disp}' WHERE id='{$id}'"; 11 mysql_query($str_sql,$db); 12 } 13 ?> record.php ここまで------------------------------- list.php15行目の <input name="disp[]" type="radio" .. /> は、 record.php5行目の $disp = $_POST['disp'][$i]; で[0][1][2][3]..と値を取得できるものと考えておりますが ここが取得できていないようです。 $disp = $_POST['disp'][0]; ↑これだけは、正しく値が取得できるのですが、[1]以降は取得できていません。 record.php6行目の $id = $_POST['id'][$i];は、[0][2][3]..と取得できているため while文や for文の間違いではないと思うのですが・・。 初心者から本を見ながらの独習のため、基礎的な間違いもあるかと思います。 もう2日も悩んでいます。先輩方よろしくお願いします!!

    • ベストアンサー
    • PHP
  • 複数テーブルの削除

    お世話になります。 うまい資料が見つからなかったので質問させてください。 例えば、下記のようなテーブルが3つあったとします。 <table1> id name date <table2> id tel <table3> id etc name,date,tel,etcは同タイミングで一括に登録され、3テーブルともに共通のidで保存されます。 この時、table1のdate(日付が入ります)が30日以上経過しているデータについて、いずれのテーブルからも削除したいと思っています。 こんな場合、どんなSQL文を書けば良いのでしょうか? お分かりになる方、何卒よろしくお願いしますm(_ _)m

    • ベストアンサー
    • MySQL