Pear MDB2 デ-タベ-ス操作

Pear MDB2 デ-タベ-ス操作ファイル挿入部作成

MDB2 を利用して各デ-タをデ-タベ-スに書込むための SQL 文を作成していきます。
ファイル内容は、 63Pear Village のトップの左サイドナビ
「Pear MDB2 デ-タベ-ス操作」 の中の
MDB2 デ-タベ-ス操作 PHP ファイル
を見てください。
Pear MDB2 デ-タベ-ス操作ファイル接続部作成
で、デ-タベ-ス接続まではファイル作成が完了しています。
続きを説明していきます。

SQL 文作成

それでは、デ-タベ-ス挿入ファイルを作成していきます。
PHP から MySQL へデータをインサートする場合なかなかうまく行きません。
それは作法がなかなかうるさいからです。
バッククォーテーション 「`」
シングルクォーテーション「'」
ダブルクォーテーション 「"」
の使い分けが難しいからです。
$sql =
  "INSERT INTO `tab1` (`abc`, `def`)
   VALUES ('$data1','$data2')";
のように書かないとうまく動きません。
VALUES の中で渡すデータはフィールド名ではないので、バッククォーテーションではなく シングルクォーテーションを使用します。
$sql 変数に代入する場合のくくりは変数を参照するためダブルクォーテーションです。
しかしながら MDB2 における INSERT 文は、バッククォーテーション 「`」 を使用しないのでもっと単純です。
$sql = "INSERT tab1 info
  (abc,def) VALUES
  ('$data1','$data2')";
これで、テ-ブル名 tab1 のカラム abc,def に
$data1',$data2 を挿入します。

脆弱性回避

SQL インジェクションと言う脆弱性を回避します。
SQL 実行の不備を意図的に利用し、デ-タベ-ス情報の読出、書換を不正に行う アクセス攻撃を防止します。
単純に PHP 関数のみで実現する場合、MySQL へデータをインサートする時は、 PHP 関数 mysql_real_escape_string 等を使用し、挿入文字列の安全化を行うのが通常です。
PHP::mysqli 関数でも bindParam メソッドが用意されていて安全な値に変換してくれます。
Pear::MDB2 ではプリペアドステ-トメント・メソッドを使用してこれを実現化します。
プリペアドステ-トメントは SQL 文を実行する前に準備・解析します。
まず、入力値や変数などの可変する値を SQL 文中にプレ-スフォルダと呼ばれるクエスチョンマ-ク「?」 として埋込んでおき SQL 文を作成します。
その後、入力値や変数をプレ-スフォルダにあてはめ SQL 文が実行されます。
可変しない部分を先に実行し、そのあとに変数を組込むので、怪しげな式で SQL 文が実行されるのを 防止することができるようです。

プリペアドステ-トメント準備

プレ-スフォルダデ-タ配列 $data を作成します。
$data = array(
$_POST["uname"], $_POST["email"], $_POST["postnum"], $_POST["addre"], $_POST["come"]
);
プレ-スフォルダデ-タのタイプ配列 $types を設定します。
$types = array
('text', 'text', 'integer', 'text', 'text');
プレ-スフォルダデ-タのタイプにはさらには次の型が指定できます。
Boolean:1 か 0 のいずれかのみの値
decimal:十進数を正確に固定桁数で保存
float:浮動小数点数を格納
date :年月日
time :ある日の指定した時刻
Timestamp:date 型と time 型をまとめたもの
他にもあるようですが詳細は不明です。
プリペアドステ-トメント用 SQL 文を作成します。
$sql =
  "INSERT INTO info
  (uname,email,postnum,addre,come)
  VALUES
  (?, ?, ?, ?, ?)";
????? が味噌ですね。

prepare メソッド

$sth = $mdb2->prepare($sql, $types, MDB2_PREPARE_MANIP);
第一引数には SQL 文
第二引数にはプレ-スフォルダデ-タのタイプ配列
第三引数には、
デ-タベ-ステ-ブルの内容を書換える処理(INSERT、UPDATE、DELETE、等)の場合は、 MDB2_PREPARE_MANIP を設定します。
ちなみに、データを読込む際には、これを MDB2_PREPARE_RESULT にします。
2016/4/4日 以下8行追加。
XAMPP 5.6.19 版以降はドライバ PEAR::MDB2_Driver_mysql がインスト-ルできず、 PEAR::MDB2_Driver_mysqli を使用すると、MDB2_PREPARE_MANIP があるとエラ-になるようです。
MDB2_PREPARE_MANIP を削除し、
$sth = $mdb2->prepare($sql, $types);
とします。
ちなみに、MDB2_Driver_mysqli 用 PHP ファイル例は、下記から参照してください。
Pear MDB2 デ-タベ-ス操作 PHPファイル mysqli 用
次に、prepare エラ-チェックをします。
if (MDB2::isError($sth)) die("prepare エラ-: ".$sth->getMessage());
エラ-があったら getMessage メソッドでエラ-内容を取得し、処理を中断します。

SQL を実行

$result = $sth->execute($data);
execute メソッドを実施し、SQL 文を実行します。
とは言うものの SQL 文の大部分は prepare メソッドで実行されていますので、ここでは 変数値を入れ込んで、デ-タベ-スに流し込む作業をします。
あとはエラ-チェックをします。
エラ-があったらエラーメッセージ出力をします。
if (MDB2::isError($result)){
  echo "データを挿入できませんでした<br>";
  echo "エラー:".$result->getMessage();
}else{
  echo "Info 情報簿に<br>"
  .$uname."&nbsp;さん<br>
のデータを挿入しました";
}
最後にデータベース接続の解除をします。
$mdb2->disconnect();

MDB2 デ-タベ-ス操作ファイル完成

やっと、デ-タベ-ス挿入部分もできあがり、MDB2 デ-タベ-ス操作ファイルが完成しました。
完成ファイルは、
63Pear Village のトップの左サイドナビ「Pear MDB2 デ-タベ-ス操作」 の中の
Pear MDB2 デ-タベ-ス操作 PHP ファイル
から見てください。


Pear MDB2 デ-タベ-ス操作確認 に続く
Pear MDB2 デ-タベ-ス操作ファイル接続部作成 に戻る

63Pear Village に戻る