データベース
PDO(PHP Data Object)とは、PHP標準(5.1.0以降)のデータベース接続クラスのことです。
PHPは標準でMySQLやPostgreSQLやSQLiteなど、色々なデータベースに接続するための命令が用意されています。データベースの種類によって条件分岐させて命令を呼び出せば、プログラムを複数のデータベースに対応させることもできます。
ですがPDOを使用していれば、同じ命令で複数のデータベースに接続ができるようになるので、さらに開発が容易になります。
データベースへの接続
データベースに接続するには、PDO(PHP Data Objects)というクラスを使います。
newという命令文でPDOクラスからPDOオブジェクトを生成します。
変数名 = new PDO(接続文字列, ユーザ名, パスワード)
例:$db = new PDO('mysql:host=localhost;dbname=sql_ex;charset=sjis', 'root', 'admin');
接続文字列(mysql:host=ホスト名; dbname=データベース名; charset=文字コード)
mysqlとDBの種類が記載されていますが、違うDBを使う場合そこを変えるだけです
対応しているDBは下記の通りです。
| ドライバ名 | サポートされるデータベース |
|---|---|
| PDO_CUBRID | Cubrid |
| PDO_DBLIB | FreeTDS / Microsoft SQL Server / Sybase |
| PDO_FIREBIRD | Firebird |
| PDO_IBM | IBM DB2 |
| PDO_INFORMIX | IBM Informix Dynamic Server |
| PDO_MYSQL | MySQL 3.x/4.x/5.x |
| PDO_OCI | Oracle Call Interface |
| PDO_ODBC | ODBC v3 (IBM DB2、unixODBC そして win32 ODBC) |
| PDO_PGSQL | PostgreSQL |
| PDO_SQLITE | SQLite 3 と SQLite 2 |
| PDO_SQLSRV | Microsoft SQL Server / SQL Azure |
| PDO_4D | 4D |
PDOオブジェクトを解放すると、切断されます
例:$db = null;
SQLの実行方法
・パラメータがない場合
変数名(結果セット:PDOStatementオブジェクト) = PDOオブジェクト->query(SQL文);
例:$stmt = $db->query('select count(*) from address_list');
・ パラメータがある場合
SQL文の設定:
変数名(結果セット:PDOStatementオブジェクト)=PDOオブジェクト->prepare(SQL文);
設定するSQL文にパラメータ名を(:パラメータ名)設定する
パラメータの設定:
変数名(結果セット)-> bindvalue[バイドバリュー](:パラメータ名, 値, 型)
型の設定は、数値の場合のみ「PDO::PARAM_INT」と設定します
SQLの実行:
変数名(結果)= 変数名(結果セット)-> execute();
<?php
$db = new PDO('mysql:host=localhost;dbname=sql_ex;charset=utf8', 'root', 'admin');
$stmt = $db->prepare('select * from address_list order by ADDRESS_NO limit 10 offset :min ');
$stmt->bindValue(':min', $viewLocMin, PDO::PARAM_INT);
$stmt->execute();
?>
検索と結果表示
・検索結果が1件の場合
<?php
$db = new PDO('mysql:host=localhost;dbname=sql_ex;charset=utf8', 'root', 'admin');
$stmt = $db->query('select name from address_list where address_no = 1');
$result = $stmt->fetch();
print($result['name']);
?>
fetch()で結果を連想配列に入れてくれます
また、PDO::FETCH_NUMを指定することで配列番号で取得することができます
<?php
$db = new PDO('mysql:host=localhost;dbname=sql_ex;charset=utf8', 'root', 'admin');
$stmt = $db->query('select name from address_list where address_no = 1');
$result = $stmt->fetch(PDO::FETCH_NUM);
print($result[0]);
?>
・単一カラムを取得する場合
<?php
$db = new PDO('mysql:host=localhost;dbname=sql_ex;charset=utf8', 'root', 'admin');
stmt = $db->query('select name from address_list where address_no = 1');
$result = $stmt->fetchColumn();
print($result);
?>
・検索結果が複数件の場合
パラメータ無し:
<?php
$db = new PDO('mysql:host=localhost;dbname=sql_ex;charset=utf8', 'root', 'admin');
$stmt = $db->query('select name from address_list');
while($result = $stmt->fetch()){
print($result['name']);
}
?>
パラメータ有り:
<?php
$db = new PDO('mysql:host=localhost;dbname=sql_ex;charset=utf8', 'root', 'admin');
$stmt = $db->prepare('select * from address_list order by ADDRESS_NO limit 10 offset :min ');
$stmt->bindValue(':min', $viewLocMin, PDO::PARAM_INT);
$stmt->execute();
while($result = $stmt->fetch()){
print($result['name']);
}
?>
「:(コロン)任意の名前」で指定した所がbindValueで設定値と入れ替わるというイメージです。
また、intの値の時はbindValueで設定する際にパラメータでPDO::PARAM_INTを付けておくと良いでしょう
行の挿入・削除・変更
検索のSQLと実行方法は変わりません
・行の挿入
<?php
$db = new PDO('mysql:host=localhost;dbname=sql_ex;charset=utf8', 'root', 'admin');
$stmt = $db->prepare('INSERT INTO address_list(ADDRESS_NO, NAME, KANA, STATE_ID, ADDRESS, POSTAL_CODE, TELEPOHNE_NUMBER, PORTABLE_TELEPOHNE_NUMBER, MAIL_ADDRESS, OTHERS)VALUES(NULL, :value1,:value2,:value3,:value4,:value5,:value6,:value7,:value8,:value9)');
$stmt->bindValue(':value1', $data_name); // 名前
$stmt->bindValue(':value2', $data_hurigana); // カナ
$stmt->bindValue(':value3', 13, PDO::PARAM_INT); // 都道府県ID
$stmt->bindValue(':value4', $data_address); // 住所
$stmt->bindValue(':value5', $data_post); // 郵便番号
$stmt->bindValue(':value6', $data_tel); // 電話番号
$stmt->bindValue(':value7', $data_tel2); // 携帯番号
$stmt->bindValue(':value8', $data_mail); // メールアドレス
$stmt->bindValue(':value9', $data_etc); // その他
$stmt->execute();
?>
・行の削除
<?php
$db = new PDO('mysql:host=localhost;dbname=sql_ex;charset=utf8', 'root', 'admin');
$stmt = $db->prepare('delete from address_list where ADDRESS_NO = :dwlno');
$stmt->bindValue(':dwlno', $delno, PDO::PARAM_INT);
$stmt->execute();
?>
・行の変更
<?php
$db = new PDO('mysql:host=localhost;dbname=sql_ex;charset=utf8', 'root', 'admin');
$stmt = $db->prepare('UPDATE address_list set NAME = :value1 where ADDRESS_NO = :value10');
$stmt->bindValue(':value1', $data_name); // 名前
$stmt->bindValue(':value10',$inputno, PDO::PARAM_INT); // アドレスNO
$stmt->execute();
?>
