データベース
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(); ?>