- 締切済み
MySQL更新
サッカー選手の出場時間やゴール数をデータベースに格納しています。 これまでは試合の度にphpMyAdminを利用して直接入力していたのですが、もっと簡単に更新作業が出来ないかと更新フォームを作成しデータを更新しようと考えています。 下記サイトを見て他のテーブルの更新は出来たのですが、この選手テーブルの更新をどうすればいいのか分かりません。 http://ponk.jp/php/basic/php_mysql#page_index4 テーブル名:active_player2 last_name(VARCHAR型)|goal(INT型)|comeout_time(INT型) 加藤|5|180 田中|3|270 佐藤|0|235 やりたい事は二点あります。 二点ともポジション別に全選手をずらっと並べ(チェックボックス)、対象選手にチェックを入れて更新ボタンをクリックしたら予め決めている数字を今の数字に加えて格納したいです。 (1)得点を挙げた選手 得点を挙げた選手にチェックを入れて更新ボタンを押すと、チェックを入れた選手のgoalに「1」が追加される。 (2)フル出場した選手 サッカーの場合、一試合で三人まで交代できるので少なくとも8選手はフル出場することになります。 そこでフル出場した8選手にチェックを入れて更新ボタンをを押すとその選手のcomeout_timeに「90」が追加される。 現在のコードは下記のようになっています。 player-update.htmlにフォームを設け、player-update2.htmlでデータを更新しようと考えています。 <?php function pt_set($pt,$checbox_name){ global $dbh; $sql = 'SELECT * FROM active_player2 WHERE position LIKE "%'.$pt.'%"'; foreach ($dbh->query($sql) as $row) { print '<input type="checkbox" name="'.$checbox_name.'" value="'.$row['last_name'].'">'.$row['last_name'].'</label>'; } return; } ?> <form action="player-update2.html" method="post"> <table> <tr> <th width="170">得点者</th> <td colspan="3"><p>DF</p> <?php pt_set("DF","goal"); ?> <p>MF</p> <?php pt_set("MF","goal"); ?> <p>FW</p> <?php pt_set("FW","goal"); ?> </td> </tr> <tr> <th width="170">フル出場</th> <td colspan="3"><p>GK</p> <?php pt_set("GK","full"); ?> <p>DF</p> <?php pt_set("DF","full"); ?> <p>MF</p> <?php pt_set("MF","full"); ?> <p>FW</p> <?php pt_set("FW","full"); ?> </td> </tr> </table> <input type="submit" value="更新する" style="width:300px;height:40px"> </form> これをplayer-update2.htmlに送信して、どのようにデータを追加すればいいのか分かりません。 ご存知の方いらっしゃいましたらご教示ください。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- hitomura
- ベストアンサー率48% (325/664)
To_aru_User 様が実装に集中されていて仕様については気にされていないようなのですが、一点疑問点がございます。 > (1)得点を挙げた選手 > 得点を挙げた選手にチェックを入れて更新ボタンを押すと、チェックを入れた選手のgoalに「1」が追加される。 この仕様だと一選手が一試合に複数回ゴールした場合に goal の値が実際のゴール数とずれると思うのですが 問題ないのでしょうか? サッカーのゴールは一選手が一試合で複数回することがまれだというのは知っているので、その場合はレアな特殊ケースとして phpMyAdmin を使って更新するという運用にするというのならいいのですが、それなら左記の特殊ケースを仕様として明示しておく必要があります。
訂正 <input type="submit" value="更新" /> <?php endif; ?> </form> ↓ <input type="submit" value="更新"> </form> <?php endif; ?>
作ってみました。ローカル環境で動作確認したので多分大丈夫だと思います。 http://pastebin.com/g8JYwLQs CSRF対策はしていないのでその点だけご注意を。 http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%AA
まずまとめ記事を記載しておきます。以下はこれを踏まえての回答です。 Qiita - $_GET, $_POSTなどを受け取る際の処理 http://qiita.com/mpyw/items/2f9955db1c02eeef43ea Qiita - PHPでデータベースに接続するときのまとめ http://qiita.com/mpyw/items/b00b72c5c95aac573b71 - 回答に記載するコードは読みやすくするために全角スペースでインデントしています。 - デバッグしてないのでどうでもいい文法ミスとかあるかもしれません。 検索のためのクエリ埋め込み方法を誤っています。この方法だとSQLインジェクションに対する脆弱性があったり、正しく検索できないケースがあったりしていろいろ問題になります。以下のようにしてください。欲を言えば、こういうケースではグローバル変数を使わず、クラスを使ったほうが設計としては望ましいのですが…(「こういうケースでは」というよりも「グローバル変数は使ってはいけないもの」と考えたほうがいいかも) function pt_set($pt, $checbox_name) { global $dbh; $stmt = $dbh->prepare("SELECT last_name FROM people WHERE name LIKE ? ESCAPE '!'"); $stmt->execute(array('%' . preg_replace('/(?=[!_%])/', '!', $pt) . '%')); $stmt->setFetchMode(PDO::FETCH_COLUMN, 0); foreach ($stmt as $last_name) { printf( '<label><input type="checkbox" name="%1$s" value="%2$s">%2$s</label>' . PHP_EOL, htmlspecialchars($pt, ENT_QUOTES, 'UTF-8'), htmlspecialchars($last_name, ENT_QUOTES, 'UTF-8') ); } } >> player-update.htmlにフォームを設け、player-update2.htmlでデータを更新しようと考えています。 更新するページって「*.php」じゃないとだめですよね…?(「*.html」をPHPとして認識させるのであれば話は別ですが)それに、今回のケースではファイルを分けずに全部1ファイルで書いた方がスッキリしそうな感じはありますね。全体的に見ると、以下のような書き方になります。 <?php /* 関数定義など */ /* 受け取った $_POST のチェックなど */ try { /* データベースへの接続 */ if ($_SERVER['REQUEST_METHOD'] === 'POST') { try { /* POSTされたときのみ実行するUPDATE処理 */ $msgs[] = '~しました'; } catch (Exception $e) { $msgs[] = $e->getMessage(); } } /* SELECT処理 */ } catch (Exception $e) { $msgs[] = $e->getMessage(); } header('Content-Type: text/html; charset=utf-8'); ?> <!DOCTYPE html> <html> .... </html> ちょっと長くなりそうなので回答分けます。