プログラマーになりたい!という貴方へ(3)

会員登録フォームからデータベース登録

SQLの勉強をした事で、データベースへのアクセス方法は理解しましたか?前回学んだ事がデータベースの全てではありません。データベースへのアクセスには細心の注意をはらわなければなりません。

PHPはセキュリティ面で脆弱性が高い言語と言われていますので、外部からのあらゆる攻撃を想定して対応しなければなりません。

ここでは全てのセキュリティ対策を施したコーディングは行いませんので、システムを自作する際は

詳しく調査して下さい。

始める前にphpMyadminからmemberテーブルのプライマリーキーである項目”no”の「AI」という項目をチェックして属性変更して下さい。
AI(オートインクリメント)はデータベースが自動的に付番してくれる機能です。
このAI(オートインクリメント)を使用する事で、キーの重複を意識せずプログラミングできます。


<form method="post" action=<?php echo $_SERVER['PHP_SELF'];?>>
<table>
  <tr>
     <th>氏名</th><td><input type="text" name="name" size="50" value=""></td>
  </tr>
  <tr>         
     <th>住所</th><td><input type="text" name="address" size="50" value=""></td>
  </tr>
   <tr>
    <th>メール</th><td><input type="text" name="mail" size="50" value=""></td>
   </tr>
   <tr>
      <td clumn="2"><input type="submit" value="送信"></td>
   </tr>
</table>
 </form>

データベースから登録レコードを表示させるindex.phpファイルに登録するコードを付け足します。

まずレコード一覧を表示する上部(下部でも問題ありません)にデータをPOSTするFORMを作ります。

<?php
// データベースの選択
$mysqli = new mysqli("localhost", "root", "", "sampledb");
if(!$mysqli){
    die("接続できませんでした");
}
if($_POST){
    //データベースへの登録
    $name = $_POST["name"];
    $address = $_POST["address"];
    $mail = $_POST["mail"];
    //会員情報がPOSTされているので、データベースへ登録する
    // 文字コードを設定
    $mysqli->set_charset('utf8');
    //プリペアの用意
    $stmt = $mysqli->prepare('INSERT INTO member (name, address, mail) VALUES (?, ?, ?)');
    //登録するデータをセット
    $stmt->bind_param('sss', $name, $address, $mail);
    //ステートメント実行
    $stmt->execute();
}
?> 

データベース接続は前回のままでOKです。

上で追加したFORMに
action=<?php echo $_SERVER[‘PHP_SELF’];
とありますね。
この意味はスーパーグローバル変数“PHP_SELF”にセットされている現ファイル名にPOSTしろという意味です。
(詳しくはリンク先を読んで理解して下さい)

するとFORM内のボタン「送信」がクリックされると、FORMの内容がサーバーに送られ、スーパーグローバル変数にセットされます。

プログラムはその内容をスーパーグローバル変数の「$_POST」を参照して内容を取得します。

if($_POST)と聞いているのは、最初にhttp://localhost/test/index.php

を開いた時、ページの更新ボタンをクリックされた時等は当然データはPOSTされてませんので、処理しないという事です。

データベースへの登録には「mysqli」モジュールを使用し、「INSERT」文にて登録する手順は左記の通りです。PDOモジュールによるアクセス方法もありますが、メリットでデメリットを把握し、自己判断にて使い分けて下さい。

今回は「プリペアドステートメント」を使用しました。その他にも「query」を使用して「SQL」を実行する方法もあります。

「prepare」を使用したのはSQLインジェクションから守られるという利点が有るためです。

また今回はコーディングしておりませんが、POSTされる内容は、必ずhtmlentities関数またはhtmlspecialchars関数によって特殊文字をHTMLエンティティ変換しなければいけません。

$name = $_POST[“name”];

$name = htmlentities($_POST[“name”]);
<?php
// データベースの選択
$mysqli = new mysqli("localhost", "root", "", "sampledb");
if(!$mysqli){
    die("接続できませんでした");
}
if($_POST){
    //データベースへの登録
    $name = $_POST["name"];
    $address = $_POST["address"];
    $mail = $_POST["mail"];
    //会員情報がPOSTされているので、データベースへ登録する
    // 文字コードを設定
    $mysqli->set_charset('utf8');
    //プリペアの用意
    $stmt = $mysqli->prepare('INSERT INTO member (name, address, mail) VALUES (?, ?, ?)');
    //登録するデータをセット
    $stmt->bind_param('sss', $name, $address, $mail);
    //ステートメント実行
    $stmt->execute();
}
?>   
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>サンプル</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="description" content="">
        <style>
            body {
                background: #fff;
                font-size: 12px;
                text-align: center;
            }
            p {
                color: red;
            }
        </style>
    </head>
    <body>
        <div id="container">
            <main>
                <section>
                    <h3>phpテスト</h3>
                    <form method="post" action=<?php echo $_SERVER['PHP_SELF'];?>>
                        <table>
                            <tr>
                                <th>氏名</th><td><input type="text" name="name" size="50" value=""></td>
                            </tr>
                            <tr>         
                                <th>住所</th><td><input type="text" name="address" size="50" value=""></td>
                            </tr>
                                <tr>
                                <th>メール</th><td><input type="text" name="mail" size="50" value=""></td>
                            </tr>
                            <tr>
                                <td clumn="2"><input type="submit" value="送信"></td>
                            </tr>
                        </table>
                    </form>
                    <p>
                    <?php
                        $sql = "SELECT * FROM member";
                        $result = $mysqli->query($sql);
                        
                        foreach ($result as $row) {
                            echo $row['no'] . ":" . $row['name'] . ":" . $row['address'] . ":" . $row['mail'] . '<br />';
                        }
                        //DBクローズ
                        mysqli_close($mysqli);
                    ?>
                </section>
            </main>
        </div>
    </body>
</html>

最終的にこのような内容になっていると思います。

内容を入力して送信ボタンをクリックすると、次々に表示が増えていくはずです。

しかし、ここでは入力チェックを行っておりませんので、全て空白でも全項目空白のレコードが追加されてしまいます。

$name = $_POST[“name”];
$address = $_POST[“address”];
$mail = $_POST[“mail”];

の下部に、各項目のデータ入力チェックをコーディングして、空白等のレコードが登録されないように追加してみて下さい。

難しいのはmailのチェックです。

メールアドレスは@の前と後では使用できる文字が違いますし、@が含まれていてても「jjj@xxx」という形式は認められていません。

メールアドレス確認にて自分で調べてチャレンジして下さい。正規表現を使います。

プログラマーは以下に多くのエラーを想定し、それを如何にして回避する事が出来るかという事を考える事もスキルの一部だと思っています。ブラウザ閲覧をしている方がどのようなアクションをするかを考え、自分なりにエラー処理を考えて下さい。

初心者向けの解説ですので、PHPとHTMLを混在してコーディングしましたが、PHPの開発には、フレームワークやテンプレートエンジンを使用して開発するケースが一般的です。

PHPフレームワーク

テンプレートエンジン

  • Blade (Laravel標準搭載)
  • Smarty  (以前私は使ってました)
  • Twig

フレームワークやテンプレートエンジンの使用にはメリットデメリットありますが、フレームワークは殆どの開発案件で使用されまてますので、慣れた方がいいでしょう。(Laravelが人気のようです)

テンプレートエンジンは賛否あります。

比較的大きな案件では、分業をする為に導入しているようです。テンプレートエンジンは独自のメソッドは記法を覚えなくてはなりませんので、小さな案件では導入には判断が難しいかもしれません。


フォームからPOSTされた内容をデータベースに登録するまで簡単に解説しましたが、ここまでを理解できれば、他の不明点はググって出てくる様々なサイトに解説されている内容が理解できるはずです。

HTML,CSS,javasprict,PHP,MySQL,フレームワーク,テンプレートエンジン、、、
優秀なプログラマーの方たちは上記の内容は勿論、その他にプロトコル等に関する知識等ももって仕事に取組み、どんどん基本的な知識の習得は勿論、新しい技術(AI,VRなどなど)もいち早く吸収していきます。

頑張って一流プログラマーを目指して下さい。

コメント

タイトルとURLをコピーしました