POSTの後のUPDATE文について

このQ&Aのポイント
  • PHPとMySQLを使用した文字列の検索画面から、複数のレコードを修正する際に、対象レコードのみが修正される問題が発生しています。
  • 修正の一覧画面では、指定した氏名で複数のレコードが表示されますが、修正を行うと最後のレコードのみが修正されてしまいます。
  • 解決方法としては、修正の際に対象レコードのIDを正しく取得しているか確認することや、UPDATE文の条件に氏名の指定を追加することが考えられます。
回答を見る
  • ベストアンサー

POSTの後のUPDATE文について

環境:PHP5,MySQL5,XP 文字列の検索画面から、検索対象を絞り込み、一覧を表示させ、その一覧に「修正」ボタンをつけ、 修正するプログラムを書いています。 テーブルは12フィールドあり、id(auto_increment),氏名,銀行コード,受講講座などです。 同一の人が、複数の講座を受講するため、同一氏名で検索しても複数のレコードが表示されます。 id 氏名  受講講座 受講期限   銀行コード(bankcode) 16 あいう 001    2008/12/31 000000000001 24 あいう 002    2008/12/31 000000000001 これを修正しようとすると、対象レコードは表示されるのですが、 最後のレコード(上記だとid=24)しか修正されません。 ---修正の一覧となる画面表示の部分抜粋(search.php) tableタグの記述 formタグの記述 $sql="select * from `m_student` where `stuname`='$simei'"; $ss=mysql_query($sql); while($soso=mysql_fetch_assoc($ss)){ ?> <tr> <td><input type="submit" value="削除" name="sub1"></td> <input type="hidden" name="id" value="<?=$soso['id'];?>"> <td><?=$soso['bankcode'];?></td> <td><?=$soso['d_to'];?></td> </tr> <? } print '</form></table>'; ?> ----修正部分(update.php)抜粋 $id=$_POST["id"]; $bankcode = $_POST["bankcode"]; $d_to= $_POST["d_to"]; $cate_a_code= $_POST["cate_a_code"]; $sql="UPDATE m_student SET bankcode = '$bankcode' WHERE id = '$id'"; mysql_query($sql); echo mysql_error(); *長くなるので、ここでは「bankcode」フィールドだけの修正。 別の表示されたレコードを修正しても書き込まなく、 id=24 だけが修正されます。 アドバイス頂けると幸いです。

  • idek
  • お礼率47% (170/361)
  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.2

前回指摘しませんでしたが、 tableタグの記述 formタグの記述 $sql="select * from `m_student` where `stuname`='$simei'"; $ss=mysql_query($sql); while($soso=mysql_fetch_assoc($ss)){ ?> <tr> <td><input type="submit" value="修正" name="sub1"></td> <input type="hidden" name="id" value="<?=$soso['id'];?>"> <td><?=$soso['bankcode'];?></td> <td><?=$soso['d_to'];?></td> </tr> <? } print '</form></table>'; はそもそも、おかしいですよ。これだと表示されるテーブルは、 <table> <form> <tr> <td><input type="submit" value="修正" name="sub1"></td> <input type="hidden" name="id" value="xxxxx"> <td>xxxxx</td> <td>xxxxx</td> </tr> <tr> 繰り返し </tr> </form> </table> だから、$soso['id']以外の値がPOSTされていません。これは削除の時の ソースじゃないですか?いずれにせよこのコードだと最後の1件しか POSTされません。全部処理したいなら<form>と</form>をwhileのループの 中にいれ、ボタンを押す都度、そのレコードを更新するようにすれば、 update.phpをそのまま使えます。以下のように <table> <?php $sql="select * from `m_student` where `stuname`='$simei'"; $ss=mysql_query($sql); while($soso=mysql_fetch_assoc($ss)){ print <<<ROWEND <form action="update.php" method="POST"> <td><input type="submit" value="修正" name="sub1"></td> <input type="hidden" name="id" value=" $soso['id'] "> <td><input type="text" name="bankcode" value=" $soso['bankcode'] "></td> <td><input type="text" name="d_to" value=" $soso['d_to'] "></td> </form> </tr> ROWEND; } print("</table>"); ?> しかしこれだといくつも修正ボタンを押さなければならない。 修正ボタンひとつで、検索結果行全部を更新するためには、両方とも大幅 に改造しなければならない。 つまり<input>タグのname属性を id1,id2,... bankcode1,bankcode2,.... というように動的に増加させながら出力し、 update.phpの方でもpostされたデータを配列に格納して、 データの数だけ、更新のSQLを発行する作りにする必要がありそう。 もっと、簡単なアイデアがあればよいけど...

idek
質問者

お礼

ありがとうございました。 >修正ボタンひとつで、検索結果行全部を更新するためには、両方とも大幅 >に改造しなければならない。 修正は、1つずつ行う事にします。 自分では、かなりピンチだったので大変助かりました。 重ね重ね御礼申し上げます。

その他の回答 (1)

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

$sql="UPDATE m_student SET bankcode = '$bankcode' WHERE id = '$id'"; だとidが$idと一致しているものだけ更新していますよね。 送信フォームが --- <input type="hidden" name="id" value="16"> <input type="hidden" name="id" value="24"> --- ととすると、同じnameがあると、後のnameのvalueがセットされて、 $id=$_POST["id"]の中身は24になっているから、あってます。

idek
質問者

補足

早速お返事ありがとうございます。 ご指摘の通り最後のidをPOSTしてしまう確認はとれました。 ただ $sql="select * from `m_student` where `stuname`='$simei'"; $ss=mysql_query($sql); while($soso=mysql_fetch_assoc($ss)){ ?> <tr> <td><input type="submit" value="修正" name="sub1"></td> <input type="hidden" name="id" value="<?=$soso['id'];?>"> <td><?=$soso['bankcode'];?></td> <td><?=$soso['d_to'];?></td> </tr> <? } print '</form></table>'; に変わる構文が思いつきません。 アドバイス頂けると幸いです。

関連するQ&A

  • PHPのupdate文はこれでいいのでしょうか?

    php初心者ですが、どうしても出来ないので ご教授お願いいたします。 phpでmysqlのupdate をしたいのですが、 参考書などは私が作ろうとしている物より複雑で シンプルに書き換えることが出来ませんん。 会員登録をPHPで作ろうとしています。 会員自身でPR文と更新日を書き換えられるようにしたいのですが、 このような書き方でいいのでしょうか? **他のページにフォームを作ってこちらに送っています バージョンは MYSQL ver4.0.26 PHP ver4.2.2 phpMyAdmin ver2.4.6  です。 <?PHP //データベース関連のデータをインクルードします require_once("dbini.php"); //MySQLに接続します $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD); //データベースを選択します $selectdb = mysql_select_db($DBNAME, $con); //MySQLレコード修正 $sql = "update mem set regdate = now() ,pr1 = '$pr1' where id = '00001' "; mysql_query($sql); echo "レコードの修正が完了しました"; exit; ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> <title>修正ページ-2</title> </head> <body> </body> </html>

    • ベストアンサー
    • 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
  • PHP テーブルに表示した複数データを配列でもって、DBにupdateするのができない

    かなり困っています。(T_T) 作ろうと思っているのは、 まず、Mysqlより取得した複数データをテーブルに表示します。 その取得したデータの一部を修正し、「変更」ボタンを押すと、その修正したデータをMysqlにアップロードするという機能を作りたいと思っています。 問題なのが、Mysqlよりデータを取得し、テーブルに表示まではできたのですが、修正したデータを配列で取得する処理ができません。 テーブルには修正した複数データ(例:3項目の5データ)があり、そのデータをどのように変数に格納するのか(多分配列で持たないとダメなのかなぁ?)がわかりません。 変数に格納さえできれば、SQL:update文でMysqlに反映はできると思うのですが。。。その前段階ができていません。 ちなみに、作成ソースは。。。。 ****************** PHP部分 ********************** <?php ・・・・・(省略) // 「変更」ボタン押した時 if (isset($_POST['btnshopchg'])) { $cnt2 = 0; while ($cnt2 < $_SESSION[cnt1]) { $knrira = $_POST['kanrichg']['$cnt2'][0]; $knrino = $_POST['kanrichg']['$cnt2'][1]; $knrists = $_POST['kanrichg']['$cnt2'][2]; $knrisdate = $_POST['kanrichg']['$cnt2'][3]. " 00:00:00"; $shopid = $_SESSION['shop_id'][$cnt2]; $sql = " update shopping set sendnumber = '" .mysql_real_escape_string($knrino). "', state = '" .mysql_real_escape_string($knrists). "', shopping_date = '" .mysql_real_escape_string($knrisdate). "' where shopping_id = '" .mysql_real_escape_string($shopid). "'"; $result = mysql_query($sql); $cnt2 = $cnt2 + 1; } $error_message = '変更しました。。。'; ・・・・・・・(省略) ?> ****************** HTML部分 ********************** ・・・・・・・(省略) <table border="1"> <tr><th>変更</th> <th>注文ID</th><th>注文日時</th><th>商品名</th> <th>個数</th><th>送り状No</th><th>状態</th><th>発送日時</th> </tr> <?php $cnt1 = 0; while ($shopping = mysql_fetch_array($result)){ ?> <tr> <td class="knrchg"><input type="radio" name="kanrichg['<?php print $cnt1; ?>'][]" value="1"></td> <td class="knrno"><?php print $shopping['shopping_id']; ?></td> <td class="knrtime"><?php print date('Y/m/d', strtotime($shopping['order_date'])); ?></td> <td class="knrname"><?php print $shopping_name_tbl[$shopping['item_id']]; ?></td> <td class="knrnum"><?php print $shopping['quantity']; ?></td> <td class="knrsno"><input type="text" name="kanrichg['<?php print $cnt1; ?>'][]" value="<?php print $shopping['sendnumber']; ?>" size="16"></td> <td class="knrsts"><input type="text" name="kanrichg['<?php print $cnt1; ?>'][]" value="<?php print $shopping['state']; ?>" size="4"></td> <td class="knrout"><input type="text" name="kanrichg['<?php print $cnt1; ?>'][]" value=" <?php if($shopping['shopping_date'] != '1970-01-01 00:00:00'){ print date( 'Y/m/d', strtotime($shopping['shopping_date'])); } else { print '-'; } ?>" size="16"></td></tr> <?php $_SESSION['shop_id'][$cnt1] = $shopping['shopping_id']; $cnt1 = $cnt1 + 1; $_SESSION[cnt1] = $cnt1; } ?> </table> ・・・・・・・(省略) という感じです。。。 全くわかりません。PHPの配列(array)の理解が不十分なのだと思います。 どなたかわかる方、解決方法を教えてください。。。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • リストから詳細画面に遷移するためのリンク作成と詳細画面の表示

    PHP5とMySQL4.0の組み合わせで、初歩的なことがわかりません。 例えば、(1)社員IDと、(2)年齢、(3)名前をリストアップする画面があるとして、 IDのところをハイパーリンクにして、それを押すとその社員の レコード内容を更新する画面を出す、みたいなことをしたいのですが、 これって method="POST" でなく、GETでやるのですよね? 「IDのリンク」とは、<a href="syain_detail.php?id=100">みたいなカタチに なるのでしょうが、具体的なスクリプトでご教示いただけないでしょうか。 単純に(IDへのリンクを考えずに)DBのレコードをPOSTでざーっと リストアップするHTMLまではできるのですが、 IDをハイパーリンクにして次の画面を構成するPHPがさっぱり わからないのです。下記、DBのサンプルと、わたしにわかるスクリプトです。 --------syainmaster---------- id   age  name ---------------------- 100   20   suzuki 200   24   sato 300   30   tanaka ----------------------- <?php   $con = mysql_connect(localhost, root, mypass);   $selectdb = mysql_select_db(mydb, $con);   $sql = "select * from syainmaster";   $rst = mysql_query($sql, $con);   $recmax = mysql_num_rows($rst);   $body = "<TABLE>";   for ($recnum = 0; $recnum < $recmax; $recnum++) {     $col = mysql_fetch_array($rst);     $body .= "<TR>";     $body .= "<TD>" . $col["id"] . "</TD>";     $body .= "<TD>" . $col["age"] . "</TD>";     $body .= "<TD>" . $col["name"] . "</TD>";     $body .= "</TR>";   }   $body .= "</TABLE>";   $con = mysql_close($con); ?> <HTML> <BODY> <?= $body ?> </BODY> </HTML>

    • ベストアンサー
    • PHP
  • 検索結果($_POST)が2ページ目以降は消える

    PHP+MySQLで分割ページを作っています。 検索結果のページを分割しているのですが、2ページ目以降に検索されたレコードが表示されません。 1).2ページ目以降に続きのレコード(下記では21件目以降)を表示させるには、どうすれば良いのでしょうか。 2).上記には関係ないのですが、「<?= $msg ?>」で検索結果の総数を表示したいのですが、「1」としか表示されません…ついでで良いので、ご指摘いただけたらと思います。 <?php $keyword = $_POST['keyword']//検索ワードになります、下記の例では使用していません ?> <?php //データベース接続 $page = $_REQUEST['page']; if ($page == '') { $page = 1; } $page = max($page, 1); // 最終ページを取得する $sql = 'SELECT COUNT(*) AS cnt FROM table1'; $result = mysql_query($sql); $rows = mysql_fetch_assoc($result); $maxPage = ceil($rows['cnt'] / 20); $page = min($page, $maxPage); $start = ($page - 1) * 20; $result = mysql_query('SELECT * FROM table1 LIMIT ' . $start . ',20'); $rowss = mysql_num_rows($sql); //表示するデータを作成 if($rows){ while($row = mysql_fetch_array($result)) { $tempHtml .= "<tr>"; $tempHtml .= "<td>".$row["id"]."</td><td>".$row["name"]."</td><td>".$row["mail"]."</td>"; $tempHtml .= "</tr>\n"; } $msg = "".count($rowss).""; }else{ $msg = "sorry"; } //結果保持用メモリを開放する mysql_free_result($result); ?> //下記から、HTML部に表示しています <?php $start_a = ($start + 1); print "".$start_a."件~"; $start_b = ($start + 20); print "".$start_b."件を表示しています(".$page."ページ目/全".$maxPage."ページ)<br>"; if ($page > 1) { print "<a href=\"page.php?page=".($page - 1)."\">前のページへ</a>  "; } else { print "前のページへ"; } if ($page < $maxPage) { print "<a href=\"page.php?page=".($page + 1)."\">次のページへ</a>  "; } else { print "次のページへ"; } ?> <?= $msg ?> 何卒、よろしくお願い致します。

    • ベストアンサー
    • PHP
  • select文

    こんばんは。PHPでデータベースからレコードとフィールドを表として取り出そうとしてますが、うまく行きません。 MySQLへの接続はうまくいってると思うので、while文が間違ってるのでしょうか?PHPのバージョンはPHP Version 4.4.2です。 よろしくお願いしますm(__)m <?php require_once("dbini.php"); $con = mysql_connect($server, $user, $pass); $select = mysql_select_db($dbname, $con); $sql = "select * from book"; $rst = mysql_query($sql, $con); $body = "<table border='0' cellpadding='5' cellspacing='5' width='500'><tr><td>\n"; while($col = mysql_fetch_array($rst)) { $body .= "<b><font size='+2'>".$col["title"]."</font></b>" $body .= "</td></tr>"; $body .= "<tr><td colspan='2'>".$col["article"]."</td></tr></table>"; } mysql_free_result($rst); $con = mysql_close($con); ?> <html> <body> <?= $body ?> </body> </html>

    • ベストアンサー
    • PHP
  • phpのif文について

    phpでログイン処理のif文を書いています。 nameとpasswordのフィールドが記入されているのかをチェックするif文を書いたのですが、機能してくれません。何かが間違っているのでしょうか。 何も入力しないor間違った情報を入力する ということをしてもログインが出来てしまいます。 どなたかテェックお願い致します。 <?php require('dbconnect.php'); session_start(); if ($_COOKIE['name'] != '') { $_POST['name'] = $_COOKIE['name']; $_POST['password'] = $_COOKIE['password']; $_POST['save'] = 'on'; } if (!empty($_POST)) { // ログインの処理 if ($_POST['name'] != '' && $_POST['password'] != '') { $sql = sprintf('SELECT * FROM members WHERE name="%s" AND password="%s"', mysql_real_escape_string($_POST['name']), sha1(mysql_real_escape_string($_POST['password'])) ); $record = mysql_query($sql) or die(mysql_error()); if ($table = mysql_fetch_assoc($record)) { // ログイン成功 $_SESSION['id'] = $table['id']; $_SESSION['time'] = time(); // ログイン情報を記録する if ($_POST['save'] == 'on') { setcookie('name', $_POST['name'], time()+60*60*24*14); setcookie('password', $_POST['password'], time()+60*60*24*14); } header('Location: index.php'); exit(); } else { $error['login'] = 'failed'; } } else { $error['login'] = 'blank'; } } ?>

    • ベストアンサー
    • PHP
  • PDOでDB

    PDOでDBを表示させ修正ボタンを押し別ウインドウが開き選んだデータの修正を行いたいのですがupdate2.phpでエラ-メッセージが出ます。どうやったら直りますか 下記のメッセージです Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\WWW\test\htdoes\update2.php on line 4 レコードを修正しました。 ちなみに 番号 int プライマリ-キ- 氏名 varchar 住所 varcharです 下記はソースです 一覧画面 <HTML> <HEAD> <TITLE>一覧画面</TITLE> </HEAD> <BODY> <table border="1"> <tr> <th>番号</th> <th>氏名</th> <th>住所</th> <th>操作</th> </tr> <?php $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $st = $pdo->query("SELECT * FROM tbl_test"); while ($row = $st->fetch()) { $ID = htmlspecialchars($row['番号']); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); echo "<tr><td>$ID</td><td>$NAME</td><td>$ADDR</td><td><a href='update.php?番号=$ID'>修正</a></td></tr>"; } ?> </table> </BODY> </HTML> アップデートの入力フォーム update.php <?php $ID = htmlspecialchars($_GET['番号']); $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $st = $pdo->prepare("SELECT * FROM tbl_test WHERE 番号=?"); $st->execute(array($ID)); $row = $st->fetch(); $ID = htmlspecialchars($row['番号']); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); ?> <form action="update2.php" method="post"> 番号<br> <?php echo $ID ?><br> 氏名<br> <input type="text" NAME="NAME" value="<?php echo $NAME ?>"><br> 住所<br> <input type="text" NAME="ADDR" value="<?php echo $ADDR ?>"><br> <input type="submit"> </form> アップデートの処理 update2.php <?php $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $st = $pdo->prepare("UPDATE tbl_test SET 番号=?,氏名=?,住所=?WHERE 番号=?"); $st->execute(array($_POST['NAME'], $_POST['ADDR'])); ?> レコードを修正しました。 アップデートの処理 update2.phpで 最初のエラーが出ます

  • MYSQLのレコードの数を表示したいのですが。

    PHPとMySQLでPHPからSQL文を送って、PHPにMySQLにレコード数を表示したいのですが、Resource id #3 といったようになってしまいます。 一瞬表示されたと思っていたのですが、実際のレコードの数と違ったのでやはり失敗でした。 どのような方法で表示すれば上手く表示されるでしょうか。初歩的なことで申し訳ありませんが、よろしくお願いします。

    • ベストアンサー
    • PHP
  • DBから取得した内容を横表示

    質問します。 DBにID,NAME,IMGと言うカラム名があります。 例 ID NAME IMG 0001 PHP1 PHP1 0002 PHP2 PHP2 0003 PHP3 PHP3 データを取得し、ブラウザにて横に表示するように したいのですが、うまくいきません…。 ブラウザーイメージ 0001 0002 0003 PHP1 PHP2 PHP3 画像 画像 画像 以下がサンプルです。 <?php //DB接続 if((!$db = mysql_connect("","",""))){ die; } //DB選択 if((!mysql_select_db(""))){ die; } if(!mysql_query('set names sjis')){ echo "sjis 設定エラー"; die; } $SQL = "SELECT * FROM video_data"; if(!($rs = mysql_query($SQL))){ print mysql_error(); die; } ?> <table border="0"> <TR> <?php $count = 0;      while($item = mysql_fetch_array($rs)){ //ID表示 print "<TD>".$item['ID']."</TD>"; //名前表示 print "<TD>".$item['NAME']."</TD>"; //改行     if($count == 4){       print "</TR>";   $count = 0;     }     //IMG表示 print "<TD><img src='./test/".$item['ID'].".jpg'/></TD>"; $count++; } print "<TR>"; //コネクションクローズ mysql_close(); ?> </TABLE> どこを修正したらいいのかわかりません… 色々やっているんですが…。 わかる方が居たらヒントでもいいので 教えて下さい。よろしくお願いします。

    • ベストアンサー
    • PHP