MySQLにデータを保存するフォームをPHPとHTMLで作成しました。
重複投稿防止の機能も追加しております。
参考にしていただけたら幸いです。
今回のテーマ
- PHPを使ってMySQLにデータを追加する
- HTMLでフォーム画面を作成する
【迷ったらココ!】PHPが学べるプログラミングスクール3選
当サイトではプログラミング学習やエンジニア転職に関する情報を発信しています。他の記事も合わせてご覧ください。
PHPの本・参考書おすすめ12選をご紹介【レベル別・フレームワーク別で解説】
PHPを独学で勉強したい!なにか良い本は無いかな? PHPのWebアプリケーション開発で挫折した...自分のレベルに合った参考書を知りたい! 今回はこんな悩みを解決していきます。 PHPなどのプログラ ...
更新日:2024年1月31日
フォーム入力画面 (input.php)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | <?php function h($s){ return htmlspecialchars($s, ENT_QUOTES, 'utf-8'); } //前ページの情報を持ってくる session_start(); $input_kind = $_GET['kind']; $_SESSION['kind'] = $input_kind; ?> <!DOCTYPE HTML> <html lang ="ja"> <head> <link href="https://fonts.googleapis.com/css?family=Ubuntu" rel="stylesheet"> <link rel="stylesheet" href="path/to/font-awesome/css/font-awesome.min.css"> <link rel="stylesheet" href="style.css"> <meta name="viewport" content="width=device-width, initial-scale=1" /> <meta charset="utf-8"> <title>ユーザー登録フォーム</title> </head> <style media="screen"> p{ margin:20px 0; } textarea{ margin: auto; display: block; width: 100%; border-radius: 5px; font-size: 15px; margin-bottom: 3em; } .main_log{ padding:20px 30px; } </style> <body id="log_body"> <main class="main_log"> <form action="confirm.php" method="post" class="form_log"> <h1>投稿フォーム</h1> <table style="margin:0;"> <p class="input_kind">店名:<?php echo $input_kind; ?></p> <tr><th>評価:</th> <td> <input type="radio" name="kata" value="1" id="one" checked><label for="one">1</label> <input type="radio" name="kata" value="2" id="two"><label for="two">2</label> <input type="radio" name="kata" value="3" id="three"><label for="three">3</label> <input type="radio" name="kata" value="4" id="four"><label for="four">4</label> <input type="radio" name="kata" value="5" id="five"><label for="five">5</label> </td></tr> </table> <p>投稿文</p> <textarea name="message" cols="50" rows="12"></textarea> <input id="send" type="submit" value="送信する" class="log_button"> </form> </main> </body> </html> |
・店名は1つ前のページのデータを持ってきています
・このページではHTMLベースなので実装は意外とカンタンでした
・デザインにはCSSライブラリを使用しています
フォーム確認画面 (confirm.php)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | <?php // セッションの開始 session_start(); $star = $_POST['kata']; $message = htmlspecialchars($_POST['message'], ENT_QUOTES, 'UTF-8'); $kind = $_SESSION['kind']; $_SESSION['star'] = $star; $_SESSION['message'] = $message; ?> <!DOCTYPE HTML> <html lang ="ja"> <head> <link href="https://fonts.googleapis.com/css?family=Ubuntu" rel="stylesheet"> <link rel="stylesheet" href="path/to/font-awesome/css/font-awesome.min.css"> <link rel="stylesheet" href="style.css"> <meta name="viewport" content="width=device-width, initial-scale=1" /> <meta charset="utf-8"> <title>ユーザー登録フォーム</title> </head> <style media="screen"> p,th{ margin:20px 0; display: block; } .main_log{ padding:20px 30px; } </style> <body id="log_body"> <main class="main_log"> <h1>投稿確認画面</h1> <form action="submit.php" method="post"> <table> <tr><th>ユーザー名: </th><td><?php echo substr($_SESSION['EMAIL'],0,strcspn($_SESSION['EMAIL'],'@')); ?> さん</td></tr> <tr><th>店名:</th><td><?php echo $kind; ?></td></tr> <tr><th>評価:</th><td><?php echo $star; ?></td></tr> <tr><th>投稿文:</th><td><?php echo $message; ?></td></tr> </table> <a href="javascript:history.back()" class="fix">修正する</a> <input id="send" type="submit" value="登録" class="log_button"> </form> </main> </body> </html> |
・ここではPHPで前ページの入力データを持ってきています
・javascript:history.back()という一部分だけJavaScriptの構文が使われています。1つ前のページに戻るという意味です
・デザインにはCSSライブラリを使用しています
送信完了画面 (submit.php)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | <?php // セッションの開始 session_start(); $id = time(); $kind = $_SESSION['kind']; $star = $_SESSION['star']; $message = htmlspecialchars($_SESSION['message'], ENT_QUOTES, 'UTF-8'); $userid = $_SESSION['EMAIL']; //mysql接続 $dsn = 'mysql:dbname=データベース名;host=localhost'; $user = 'root'; $password = 'パスワード'; try{ $dbh = new PDO($dsn, $user, $password); }catch (PDOException $e){ print('Error:'.$e->getMessage()); die(); } ?> <!DOCTYPE HTML> <html lang ="ja"> <head> <link href="https://fonts.googleapis.com/css?family=Ubuntu" rel="stylesheet"> <link rel="stylesheet" href="path/to/font-awesome/css/font-awesome.min.css"> <link rel="stylesheet" href="style.css"> <meta name="viewport" content="width=device-width, initial-scale=1" /> <meta charset="utf-8"> <title>投稿</title> <style media="screen"> p{ margin:20px 0; } textarea{ margin: auto; display: block; width: 100%; border-radius: 5px; font-size: 15px; margin-bottom: 3em; } .main_log{ padding:20px 30px; } #log_body{ background-color: #fff6e2; } .log_button{ width: 45%; } </style> </head> <body id="log_body"> <?php $query = $dbh->query("SELECT COUNT(*) FROM formdata WHERE userid = '".$userid."' AND kind = '".$kind."'"); $count = $query->fetchColumn(); if ($count > 0){ ?> <p align="center">投稿が重複しています</p> <p align="center"><a href="input.php?kind=<?php echo $kind;?>" class="log_button" width="45%">入力画面に戻る</a></p> <?php }else{ // データの追加 $sql = 'INSERT INTO formdata(id, kind, star, message, userid) VALUES("'.$id.'","'.$kind.'","'.$star.'","'.$message.'","'.$userid.'")'; $stmt = $dbh -> prepare($sql); $stmt -> execute(); ?> <p align="center">投稿ありがとうございました。</p> <p align="center"><a href="detail.php?kind=<?php echo $kind;?>" class="log_button" width="45%">店舗画面に戻る</a></p> <?php } ?> <p align="center"><a href="top.php" class="log_button" width="45%">ホーム画面に戻る</a></p> </body> </html> |
styleタグのCSSコードが長くなってしまっていますがそこはお許しを笑
1 2 3 4 5 6 7 8 9 10 | //mysql接続 $dsn = 'mysql:dbname=データベース名;host=localhost'; $user = 'root'; $password = 'パスワード'; try{ $dbh = new PDO($dsn, $user, $password); }catch (PDOException $e){ print('Error:'.$e->getMessage()); die(); } |
ここではMySQLのデータベースと接続しています。
データベース名やパスワードはご自分の条件に合った言葉を入れましょう。
1 2 3 4 5 | <?php $query = $dbh->query("SELECT COUNT(*) FROM formdata WHERE userid = '".$userid."' AND kind = '".$kind."'"); $count = $query->fetchColumn(); if ($count > 0){ ?> |
ここでは重複確認を行っています。
formdataというデータテーブルの中の
useridが入力されたuseridと同じ
かつ
kindが入力されたkindと同じ
の条件に当てはまる件数をSELECT COUNTで数えています。
件数が0よりも多かった時は重複といえるので然るべき処理を書きます。
1 2 3 | $sql = 'INSERT INTO formdata(id, kind, star, message, userid) VALUES("'.$id.'","'.$kind.'","'.$star.'","'.$message.'","'.$userid.'")'; $stmt = $dbh -> prepare($sql); $stmt -> execute(); |
ここでは重複ではなかった場合の処理、つまりMySQLデータベースにデータを追加しています。
MySQLにデータを追加する時はINSERT INTOの文章を使います。
まとめ:PHPを使ったフォームを作ろう!
PHPではフォームを使って重複防止機能やMySQLへのデータ追加機能を実装できます。
みなさんもぜひ実装してみてください!
なお、MySQLなどのデータベースを用いたコードを実装するにはVPSサーバー構築や専用ドメインを取得する必要があります。
私は普段VPSサーバーはさくらのVPSを、専用ドメインはお名前.com愛用しています。
よかったら下のリンクからご利用してみてください!
PHPの学習でつまづいた時、独学に限界を感じた時はこちらの記事もオススメです。
PHPが学べるプログラミングスクールおすすめ8選!無料のスクールも解説
PHPを学習して挫折したからプログラミングスクールに入塾したい!でもどのスクールが良いんだろう... PHPを学びたいけどまず何から始めたら良いのか分からない...プログラミングスクールでプロ講師から ...
更新日:2024年1月29日
SQLが学べるプログラミングスクールおすすめ8選【2024年最新版】
SQLを学習して挫折したからプログラミングスクールに入塾したい!でもどのスクールが良いんだろう... SQLを学びたいけどまず何から始めたら良いのか分からない...プログラミングスクールでプロ講師から ...
更新日:2024年1月29日
HTML/CSSが学べるプログラミングスクールおすすめ10選【2024年最新版】
HTML/CSSを学習して挫折したからプログラミングスクールに入塾したい!でもどのスクールが良いんだろう... HTML/CSSを学びたいけどまず何から始めたら良いのか分からない...プログラミングス ...
更新日:2024年1月29日
無料体験できるプログラミングスクールおすすめ10選を解説
プログラミングスクールって思ったより高いからなかなか決められない... 無料体験できるプログラミングスクールを知りたい! せっかくプログラミングスクールに入るなら、無料体験に参加して自分に合うスクール ...
更新日:2024年1月29日