MySQLにつないでデータを追加する[INSERT][mysqli]

2016年1月18日

PHP

ウェブアプリケーションにおいて良く利用されるリレーショナルデータベース・MySQLとの連帯を学ぶにあたり、まずはフォーム画面に入力した名前をデータベースに登録するだけのシンプルなシステムを作成します。

 

database1

 

※前提条件
MySQLはLINUX等のシステムで既にインストール済
MySQLコマンドでの操作を行う

 

スポンサーリンク

 

 

手順


 

まずはデータベースを用意します。MySQLにつないだら、sample01データベースを生成し、その中にnameテーブルを作成します。

データベース

 

sample01データベースの作成

 

次にidとnameをカラムとして持つ下記のような構造のnameテーブルを作成します。

 

database2

 

 

 

次にフォーム画面(database1.html)とMySQLと接続しデータを登録するファイル(database2.php)を作成します。

 

database1.html(フォーム画面)

 

関連ページ

 

 

database2.php

 

5〜18行目

MySQLとの接続

 

6〜8行目

環境に合わせて適当な値を設定して下さい。

 

PHPがMySQLと接続する方法は主に下記の4つあります。

 

mysqli拡張モジュール(MySQLi関数)

PDO(PHP Data Objects)

PEARパッケージ(MDB2が有名だが実質メンテナンスはストップしている)

フレームワーク(CakePHP等)の独自機能

 

今回はmysqli拡張モジュールを利用しています。記述の方法には、オブジェクト指向型手続き型がありますが、今回はオブジェクト指向型で記述しています。

 

参照ページ

http://php.net/manual/ja/mysqli.construct.php

 

ちなみに古い参考書等で見かけるmysql拡張モジュールは、PHPのバージョン5.5.0以降は非推奨であり、PHP7.0.0では削除されたので利用しないほうがいいでしょう。

http://php.net/manual/ja/intro.mysql.php

 

PDOはMySQLのみならず、他のデータベースに対しても違いを意識せずにプログラムを記述することができます。mysqli拡張モジュールと同じくPHPに標準でバンドルされ、処理能力も速いです。

 

20行目

このページに直接アクセスされた場合の判定をしています。

 

24行目
isset($_POST[‘yourname’]) では変数がセットされNULLでないことを判定しています。

 

$_POST[‘yourname’] === “”では値が空でないことを判定しています。
値が入力されているかをチェックしています。

 

28〜33行目

プリペアドステートメントでSQLを生成しています。mysqli拡張モジュールは名前付きプレースホルダが利用できないので、name(nameテーブルのnameカラム)をプレースホルダ「?」に置き換えてクエリを実行しています。プリペアドステートメントは値が文字列になるので、SQLインジェクションの対策としても有効です。

 

もしプリペアドステートメントを利用せずに、入力された値をSQL文に直接連結する場合は、各データベースインターフェースが提供しているエスケープ関数などを利用します。mysqliでは、mysqli_real_escape_string()関数が用意されています。

 

参照ページ

http://php.net/manual/ja/pdo.prepared-statements.php

http://php.net/manual/ja/mysqli.real-escape-string.php

 

36行目
HTMLで表示させる直前にhtmlspecialchars関数でHTMLエンティティに変換しています。

 

※注意

htmlspecialchars関数はクロスサイト・スクリプティング(XSS)対策のために利用されますが、HTMLテキスト用のエスケープ関数なので万全ではありません。例えば、 <a href=”◯◯◯”>sample</a>の◯◯◯のようなタグの中で出力する場合は、htmlspecialcharsが効かない場合があります。

 

試しに javascript:alert(‘Test’) という文字列が入力された場合を想定して、下記のコードのようにa hrefの属性に設定します。ブラウザで表示させるとアラートが表示されてしまいます。

 

このような場合は、入力時に正規表現でjavascriptが入っていないかをチェックしたり、「http://」や「https://」で始まる文字列のみを出力するなどの処理(ホワイトリスト方式)が必要となります。

 

htmlspecialchars関数についての関連ページ

 

 

次はこちらのページへ

 

 

LINEで送る
Pocket

Copyright © 2019 思考の葉 All Rights Reserved.  プライバシーポリシー