複数checkboxでの更新画面作成について

このQ&Aのポイント
  • 複数checkboxを使用した更新画面の作成方法について
  • 登録済みIDと名前を取得し、出欠フラグを更新する一覧画面を作成しています
  • checkboxのname属性を使用して登録IDをPOSTし、配列として処理する方法について
回答を見る
  • ベストアンサー

複数checkboxでの更新画面作成について

複数checkboxでの更新画面作成について 現在、DBより登録済みのID、名前をひっぱてきて、 出欠フラグにレ点をつけ更新できる一覧画面を作成しております。 そこでcheckboxが登録ID数必要になってきます。 checkboxのname属性を登録IDとしてPOSTし、配列にいれて、 where句で絞ってupdateしようとしていたのですが これだとレ点をはずした際にはなにもPOSTされてきません。 そこでレ点をはずしPOSTした際に、 はずしたIDを特定できる手段、方法はありますでしょうか? 具体的な処理をソースコードで教えていただけませんでしょうか? よろしくおねがいします。

  • PHP
  • 回答数3
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.3

はじめまして。 この間、誰かの質問の解答用に作ったゴミプロの使いまわしで申し訳ないです。 基本的に、自己流でゴリ押しな書き方なので、こんな方法もある。程度にお考えください。 まぁ、見ての通りですが、結局 総当りでやってるだけです。 <? $me = $_SERVER[PHP_SELF]; $Message = $out = ""; $act = $_POST[act]; // ↓ DBから 引っ張ってくる代わりに とりあえず 配列で。(ID => Name) $DimCheckbox = array (1 => "シャーロック・ホームズ" , 2 => "アルセーヌ・ルパン" , 3 => "ジェイソン" , 4 => "フレディ" , 5 => "チャッキー"); //----------------------------------------------------------------------------- // 初期画面 if (!$act) { $out.= "出席している人にチェックを入れてください。<hr>"; $out.= "<form action=$me method=post>\n"; foreach($DimCheckbox as $ID => $Name) { $out.= "<input type=checkbox name=Data[$ID] value=on>$Name<br>\n"; } $out.= "<input type=hidden name=act value='send'>\n"; $out.= "<input type=submit name=submit value='送信'>\n</form>"; } //------------------------------------------------------------------------------ // DBの更新 if ($act == "send") { $Data = $_POST[Data]; foreach($DimCheckbox as $ID => $Name) { $Flag = ($Data[$ID] == "on") ? 1 : 0; $sql = "update テーブル名 set 出欠フラグ=$Flag where ID=$ID"; // $result = mysql_query($sql); // DBまで作って動作確認するのは面倒だったので、↓で表示しているだけ。 $out.= "$sql<br>"; } } //----------------------------------------------------------------------------- print $out; ?>

itio0713
質問者

お礼

ありがとうございます。求めていた仕様を満たしてつくることができました。 とっても役立ちました。ありがとうございました。

その他の回答 (2)

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

>チェックされているもの以外をどのように指定してやったらよいでしょうか? 考え方は3つ。 (1)ラジオボタン(もしくはセレクトボックス)で選択式にする (2)javascriptで隠しデータをつくる (3)そもそも選択項目はサーバー側がもっているのだからチェックされている モノ以外はチェックされていないとサーバー側で判断できる

itio0713
質問者

お礼

ありがとうございます。求めていた仕様を満たしてつくることができました。 さらに手段もいくつかあげていただきとっても役立ちました。 ありがとうございました。

回答No.1

checkboxは、外れているものはリクエストされない仕様です。 javascriptなどでチェックを確認する方法がありますが、 PHPで解決する方法としては(というかSQLで)、 単純にUPDATE文の条件を反対にすれば良いのではないでしょうか。 つまり、チェックされているもの以外を「欠席」にUPDATEする、というSQL文を書く。 そして、その前か後かに、チェックされているものを「出席」にするUPDATE文を書く。 これで事足りる気がしますが、いかがでしょうか。

itio0713
質問者

お礼

ありがとうございます。求めていた仕様を満たしてつくることができました。 とっても役立ちました。ありがとうございました。

itio0713
質問者

補足

回答ありがとうございます。 >>チェックされているもの以外を「欠席」にUPDATEする とのことですが、チェックされているもの以外をどのように指定してやったらよいでしょうか?

関連するQ&A

  • checkboxで複数選択して,OR検索を行うことができなくて困っています.

    HTML,PHPとMYSQLを用いて 企業の求人情報を検索するフォームを作成しています. HTMLの入力フォームは ・キーワード入力(企業名) ・プルダウンから選択(業種選択) ・チェックボックスで複数選択(職種選択) の構成です. 検索を行う際は{企業名 AND 業種 AND (職種[1]OR[2]・・・)}というように職種の部分のみOR検索という構成で考えています. しかし,職種を複数選択して検索を行うことが出来なくて非常に困っています. 以下が現在作成中のコードです. HTMLはチェックボックスの部分のみ貼りますね serch_form.html <form action="library_search.php" method="post"> <input type="checkbox" name="box[]" value="プログラマー">プログラマー <input type="checkbox" name="box[]" value="システムエンジニア">システムエンジニア <br> <input type="checkbox" name="box[]" value="ネットワークエンジニア">ネットワークエンジニア <input type="checkbox" name="box[]" value="その他情報系">その他情報系 library_search.php <html> <head><title>検索結果</title></head> <meta http-equiv="Content-Type" content="text/html charset=EUC-JP"> <body> <?php //POST表示用 print_r($_POST); $where = array(); $host = "localhost"; if (!$conn = mysql_connect($host, "usr", "passwd")){ die("データベース接続エラー.<br />"); } mysql_select_db("db", $conn); $condition = ""; if(isset($_POST["title"]) && ($_POST["title"] != "")){ $title = mysql_escape_string( $_POST["title"]); $title = str_replace("%", "\%", $title); if ($condition == ""){ $condition = "WHERE cname LIKE \"%".$title."%\""; } else{ $condition .= "AND cname LIKE \"%".$title."%\""; } } if(isset($_POST["pdown"]) && ($_POST["pdown"] != "")){ $pdown = mysql_escape_string( $_POST["pdown"]); $pdown = str_replace("%", "\%", $pdown); if ($condition == ""){ $condition = "WHERE gyousyu LIKE \"%".$pdown."%\""; } else{ $condition .= "OR gyousyu LIKE \"%".$pdown."%\""; } } if(isset($_POST["box"]) && ($_POST["box"] != "")){ //foreach($_POST["box"] as $val){ $where = mysql_escape_string( $_POST["box"]); $where = str_replace("%", "\%", $where); //} if ($condition == ""){ $condition = "WHERE job LIKE \"%".$where."%\""; } else{ //$where = inplode(' or ' ,$where); $condition .= "AND job LIKE \"%".$where."%\""; } } $sql = "SELECT * FROM job_table ".$condition." ORDER BY id LIMIT 50"; $res = mysql_query($sql, $conn); print("<table border=\"1\">"); print("<tr><td>企業名</td><td>業種</td><td>募集職種</td></tr>"); while($row = mysql_fetch_array($res)) { print("<tr>"); print("<td>".$row["cname"]."</td>"); print("<td>".$row["gyousyu"]."</td>"); print("<td>".$row["job"]."</td>"); print("</tr>"); } print("</table>"); mysql_free_result($res); ?> </body> </html> 特にforeach文を使って,POSTに格納されたjob[]を分解して格納する方法がわかりません. PHP初心者で汚いコードですが,どうかお願い致します.

    • 締切済み
    • PHP
  • checkboxの値を取得する方法について

    チェックボックスをひとつ用意しています。 チェックがされていれば1、チェックされていなければ0を 取得し、最終的には更新処理を行いたいと思っていますが すべてチェックされている状態で更新処理(1)がされてしまいます。 $ABC = $_POST['AAA']; If($ABC[$count] = "1"){ SQL = "1" }else{ SQL = "0" } <input type = "checkbox" checked name="abcKbn[]" id = "AAA" value = "1"> SQLに問題がないと思うので、省略させて頂きます。 value値を配列abcKbn[]に値をセットし、If文でチェックを 行っていますが、この場合だとvalue = "1"のため すべての値が1となり、配列に格納されるかと思っています。(違ったらすいません) そのためIf文もすべて1になるかと・・・。 チェックがされていれば1、チェックがされていなければ0を value値に設定することは可能なのでしょうか? それ以外でもし良いやり方があれば アドバイスお願い致します。

    • ベストアンサー
    • PHP
  • 1テーブル&複数レコードの更新に対して1度のupdate文での処理方法

    1テーブル&複数レコードの更新に対して1度のupdate文での処理方法 Delphi2010+SQL SERVER 2005で開発しています。 update文で、 現在下のようにwhileで複数レコードに対して、 1回、1回、sqlを発行して、更新しています。 これを、一度のSQLの発行で処理できないものでしょうか? 更新テーブルは1つで、更新する項目も同じです。 更新するデータと、where句の条件が異なります。 もし可能なようでしたら、どうかご教授お願いします。 update table set A=1,B=2 where id=1 update table set A=2,B=3 where id=5 update table set A=9,B=99 where id=7 update table set A=5,B=10 where id=15 update table set A=1,B=10 where id=75

  • PHPでフォーム画面を作成しています。

    PHPでフォーム画面を作成しています。 そのフォームには配列でチェックボックスがあるのですがそのチェックされて確認画面で表示まではできているのですが、戻る画面に戻るとうまく値が引き継げてない状態です。 引継ぎはhiddenで戻るページまではきている状態です。 あとは、hiddenの値とDBでselectしてのを比較してあればcheckedをつけるだけだと思っているんですが そこでうまくいっていない状態です。 下記がソースです。 ■DBからループで表示するチェックボックスを配列に $businessSQL = "SELECT * FROM business_tbl WHERE dell_flag = 0"; $businessQuery = mysql_query($businessSQL); $businessArray = array(); while($row = mysql_fetch_assoc($businessQuery)) { $businessArray[] = $row; } ■hiddenで値を引き継ぎ ※下記の例は2個チェックされhiddenで戻ってきた状態 チェックボックス名(配列):com_business Array ( [0] => 1 [1] => 2 ) ■hiddenとDBからselectしたbussines_idを比較 <?php foreach($businessArray as $val) { ?> <?php foreach($inputArray['com_business'] as $val1) { ?> <?php if($val1 == $val['bussiness_id']) { ?> <input type="checkbox" name="com_business[]" value="<?php print($val['business_id']); ?>" checked><?php print($val['business']); ?>&nbsp;<br> <?php } else { ?> <input type="checkbox" name="com_business[]" value="<?php print($val['business_id']); ?>"><?php print($val['business']); ?>&nbsp;<br> <?php } ?> <?php } ?> <?php } ?> 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 複数のフォームデータの更新

    こんにちは、 現在下記のような感じで、それぞれのIDごとに、 データを更新しておりますが、 これを一度の更新で、複数のデータの更新を行うには、 どうすればよいでしょうか?SQL文を繰り返せば出来そうですが!? いまひとつ、ピンとこないのでよろしくお願いいたします。 <form name="form1" method="post" action="kousin.php?id=1"> <td>あいう</td> <td><input name="A" type="text" id="A" size="2"></td> <td><input name="B" type="text" id="B" size="2"></td> <td><input name="C" type="text" id="C" size="2"></td> <input type ="submit" name = "submit" value = " 更新 "> <form name="form1" method="post" action="kousin.php?id=2"> <td>かきく</td> <td><input name="A" type="text" id="A" size="2"></td> <td><input name="B" type="text" id="B" size="2"></td> <td><input name="C" type="text" id="C" size="2"></td> <input type ="submit" name = "submit" value = " 更新 "> kousin.php側 $id = $_GET['id']; $time0 = $_POST['A']; $time1 = $_POST['B']; $time2 = $_POST['C']; $update = "update time_tb set "$time" where id='$id'";

    • 締切済み
    • PHP
  • PHPでユーザー登録画面を作成しています。

    こんばんは。 初めて質問させていただきます。 PHP、JavaScriptの初心者です。 現在、会社の研修でPHPとJavaScriptを用いてユーザー登録画面を作成しています。 そこで、必須項目の未入力をJavaScriptでチェックしエラーメッセージを表示しています。 その入力されたデータをindex.phpのuser_tというデータベースのテーブルにINSERT文でID・名前・パスワード・性別を登録したいのですが、INSERT文の用い方がいまいち理解できず、上手く動きません。 どなたか、ご教授願います。 以下、HTMLを除いた登録画面のソースです。 <html> <head> <title>ユーザ登録画面</title> <script type="text/javascript"> </head> <body> <?php // データベース接続 $dbcon = pg_connect("dbname=" user=postgres password="); if (!$dbcon) { die("<hr>pg_connect 失敗<hr>"); } //元の登録情報をそのまま持ってくる if(!empty($_GET['update_user_id'])){ $result = pg_query($dbcon,"SELECT * FROM TM_USER WHERE user_id='".$_GET['update_user_id']."'"); $row = pg_fetch_assoc($result); $new_user_id = $row['user_id']; $new_name = $row['name']; $new_password = $row['password']; $new_tel = $row['tel']; $new_mail = $row['mail']; $new_gender = $row['gender']; } ?> <script type="text/javascript"> function chkHissu(frm){ // 必須入力のname属性 var hissu=Array("user_id","name","password","gender"); // アラート表示用 var hissu_nm = Array("ユーザID","ユーザ名","パスワード","性別"); // 必須入力の数 var len=hissu.length; var hasError = false; var isFocused = false; var errorMsg = ""; for(i=0; i<len; i++){ var obj=frm.elements[hissu[i]]; // テキストボックス or テキストエリアが入力されているか調べる if(obj.type=="text" || obj.type=="textarea"){ if(obj.value==""){ // 未入力のエレメントにフォーカスを当てる hasError = true; if (!isFocused) { frm.elements[hissu[i]].focus(); isFocused = true; } // エラーメッセージ if(errorMsg != "") { errorMsg += "<br>"; } errorMsg += hissu_nm[i] + "が未入力です。"; } }else{ // 性別がチェックされているか調べる var chk = 0; for(var j=0; j<obj.length; j++){ // チェックされていたらchkフラグをプラス if(obj[j].checked) chk++; } if (chk == 0) { hasError = true; if(errorMsg != "") { errorMsg += "<br>"; } errorMsg += "性別が未入力です。"; } } } // エラーメッセージを指定の場所に表示 if(hasError){ var msg = document.getElementById("msg"); msg.innerHTML = errorMsg; return false; } // エラーじゃない場合indexに遷移 else{ document.userForm.action='maintenance.php'; document.userForm.submit(); } } </script> 以下、index.phpという検索機能やuser_tというテーブルを表示している画面、HTMLを除いたソースです。 <html> <head> <title>研修テスト</title> <script type="text/javascript"> <!-- // 削除リンク押下時にダイアログ表示 </head> <body> <?php // データベースへの接続 $dbcon = pg_connect("dbname= user=postgres password="); if (!$dbcon) { die("<hr>pg_connect 失敗<hr>"); } <// SQL の生成 $sql = ""; $where = ""; // ユーザ名が空白でない場合 if(!empty($_POST['input_user_name'])){ $where .= " WHERE NAME like '%".$_POST['input_user_nam_user_name'])){ $where .= " WHERE NAME like '%".$_POST['input_user_name']."%'" ; } // ユーザIDが空白でない場合 if(!empty($_POST['input_user_id'])){ if(empty($where)){ // $where が空の場合は、WHEREを追加 $where .=" WHERE "; } else{ // $where が空でない場合は、追加するためにANDを追加 $where .= " AND "; } $where .= " USER_ID = '".$_POST['input_user_id']."'"; } // 性別が空白でない場合 if(!empty($_POST['input_gender'])){ if(empty($where)){ // $where が空の場合は、WHEREを追加 $where .= " WHERE "; } else{ // $where が空でない場合は、追加するためにANDを追加 $where .= " AND "; } $where .= " GENDER = '".$_POST['input_gender']."'" ; } // ソート条件の追加 $sql .= "SELECT USER_ID,NAME,PASSWORD,TEL,MAIL,GENDER FROM TM_USER ".$where.' ORDER BY USER_ID'; // Queryの実行 $result = pg_query ($dbcon, $sql); if (!$result) { pg_last_error($dbcon); die( "pg_query SELECT 失敗<hr>"); } : 宜しくお願い致します。

    • 締切済み
    • PHP
  • formでのチェックボックスのname属性について

    例えば以下のようなフォームがあるとき、 ----------------------------------------------------------------------------- <form name="f"> <input type="checkbox" name="group1" id="a" value="a"/><label for="a">a</label> <input type="checkbox" name="group1" id="b" value="b"/><label for="b">b</label> <input type="checkbox" name="group1" id="c" value="c"/><label for="c">c</label> <input type="checkbox" name="group1" id="d" value="d"/><label for="d">d</label> </form> ----------------------------------------------------------------------------- javascriptでは、document.f.group1で配列として取得できるのですが、 phpでは、$_POST["group1"]では最後にチェックされている項目しか取得できません。 (つまり、phpでは複数選択されていても、一番後ろの1項目しか取得できません。) 少し調べるとphpで取得するには、 name属性値を、group1からgroup1[]とすれば配列として取得できるとありました。 しかしこれでは、javascriptの方でname属性値を使って取得できなくなってしまい、 document.f.getElementsByTagName("input")みたいな感じで取得することになると思います。 そもそも、name属性値に"["や"]"を使うことは良くないと思うので、 phpの方で何らかの方法があると思ったのですが、 最近勉強を始めたばかりの初心者なのでよくわかりませんでした。 今知っているphpに配列で渡す方法が、 「name属性値をgroup1[]のように配列にする」しか無いので、 他に方法があるならば教えてください。 質問の前提として、 1.name属性はフォーム内の項目のグループ化をしている? 2.name属性値に"["や"]"は仕様では使用可能な文字ではない? 1,2ともにYesだと思っています。 もし、この前提が間違っていたらご指摘ください。 質問内容を要約すると、 「checkboxをphpで配列で取得する方法はname属性値を配列にするしかないのですか?」 「他に方法があるなら教えてください」 です。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 複数行に対しての更新処理方法

    失礼いたします。 現在、ランキングの表示順序を変更する画面を作成しようとしています。 Table:RANK ID  NAME  NO ----------------- 1   AAAA 5 2 BBBB 2 3 CCCC 1 4 DDDD 6 5 EEEE 6 FFFF TableにはIDをキーにして、名称(NAME)と表示順番(NO)があり、 表示画面上では表示順番(NO)が入力フォームになっています。 mysql_fetch_rowでSQLでとって来た値を配列$rkにとり、 上記のTable内容のNAMEとNOをリスト表示するまではでき たのですが、次に表示順番(NO)を更新して保存する方法が わからず困っています。 1レコードに対してなら UPDATE RANK SET NO=*** WHERE ID=** なんかでできるのではと思うのですが、 一度保存ボタンを押したら各IDに対しそのNOの値が保存するように したいので、各IDに対しての保存する複数行のUPDATEはどうしたら いいでしょうか。 わかりづらい点あると思いますがコメントお願いします。

    • 締切済み
    • PHP
  • checkboxと配列について

    よろしくお願いします。 以下のようなチェックボックスを利用した phpの入力フォームを作成しました --------------------------------------------------------------- 番号 色  欲しい 在庫無し 101 red     □    □ 102 blue     □    □ 103 black    □    □ チェックボックスのソースは以下 欲しい→<input type=checkbox name='want[]' value='$a1'> 在庫無し→<input type=checkbox name='non[]' value='$a1'> ※$a=1です。 チェックボックスは必ずしも「欲しい」と「在庫無し」に 付けるわけではないとします。 それを踏まえて、チェックされたデータをうけるソースは以下です。 $ock=$_POST["want"]; $kck=$_POST["non"]; for($i=0; $i<count($_POST["want"]); $i++){ $as=$ock[$i]; $a=$as-1; $no=$_POST["no"][$a]; $iro=$_POST["iro"][$a]; でこれをmysql文のINSERT~で登録します。 ですが、ここで問題が・・・ 例えば 番号101から103までの「欲しい」にチェックがあり 番号101と103の「在庫無し」にチェックがあったとします。 自分の理想のレコードとしてはもちろん 番号101から103までの「欲しい」に値が入り 番号101と103の「在庫無し」に値が入るのが良いのですが、 これらの配列の中身は当然以下となります 欲しい Array ( [0] => 1 [1] => 2 [2] => 3 ) 在庫無し Array ( [0] => 1 [1] => 3 ) そうなると「欲しい」は各番号に値は当然入りますが、 「在庫無し」は番号101と102に値が入ってしまいます。 この「在庫無し」の値がうまく101と103に入る方法はありますでしょうか? for文でcountしているのが「欲しい」だからでしょうか? もちろん上記の$aがif(($a==1) OR ($a==3))と明示的にすれば理想的に値は入ります。 説明が下手で申し訳ありませんが、上記の問題でうまい方法がありましたらと思います、よろしくお願いします。 環境 WinXP apache2 php5 Mysql5

    • 締切済み
    • PHP
  • マスタの更新について

    お世話になります。 マスタを登録・更新するプログラムを作成しています。 入力画面には以下の項目を配置しています。  ・商品コード  ・商品名  ・備考 値を格納するデータベースのテーブルのフィールドは以下の通りです。  ・商品コード  ・商品名  ・備考  ・削除フラグ  ・登録日  ・登録者  ・更新日  ・更新者 ※主キーは商品コードです。 別画面でこのマスタ内容を選択してデータを作成しています。その為、現在は整合性を取るために、マスタを更新する時は商品コードを変更できないようにして更新しています。 ここで皆さんに質問があります。 現在のテーブルにはオートナンバー型のようなフィールドを作成していません。 一般的にこのようなマスタを作成する際はオートナンバー型のようなフィールドを作成するものなのでしょうか。またどのように対応するのが望ましいのでしょうか。 くだらない内容で大変申し訳ありませんが宜しくお願いします。 私の説明で皆さんに伝える事ができたか心配ですがどうぞ、アドバイス等をいただけませんでしょうか。 何卒、宜しくお願いします。

専門家に質問してみよう