PHPデータベース基本
基本的な概念とサンプルコード
データベース基本
データベース処理の基本知識を解説します。
# 2
# 3
データベース
基礎知識
データベースとは
…
特定のテーマに沿ったデータを集めて管理
し、容易に検索・抽出などの再利用をでき
るようにしたもの
データベースの管理はDBMS(データベー
ス管理システム)が行う
# 4
データベース
基礎知識
RDBMSとは
…
リレーショナルデータベース管理システム
現在最も多く利用されている
1件のデータを複数の項目(カラム/フィールド)の集合と
して表現
レコードの集合をテーブルとして保持
カラム
レコード
テーブル
# 5
データベース
リレーション
リレーションとは
…
関連する値を通じて結合して表を作成(重複)
カラム
テーブル
Copyright 2015 konekto, Inc
ID
部署No
名前
内線番号
1
11
佐藤
1111
2
22
田中
1112
3
33
山田
1113
部署No
部門名
ロケーション
11
システム部
研究所
22
営業部
営業所
33
総務部
本社
ID
名前
部門名
ロケーション
1
佐藤
システム部
研究所
2
田中
営業部
営業所
3
山田
総務部
本社
# 6
データベース
基礎知識
主なRDBMS
MySQL
PostgreSQL
Oracle
DB2
MSSQL
その他
Access, Firebird, Cloudscape...
# 7
データベース
基礎知識
データベースの役割
大量のデータを多数のユーザのもとで一元管理を
行うことが可能
DBサーバ
Webサーバ
SQL処理
管理者
一般ユーザ
Webアプリ# 8
データベース
SQL
SQLとは
…
SQL: Structured Query Language
世界標準規格のデータベース操作言語
RDBMSにおいて、データの操作や定義
を行うためのデータベース言語(問い合わ
せ言語)
# 9
データベース
SQL
SQLの種類
DDL: Data Definition Language
→
CREATE,ALTER,DROP,GRANT文
DML: Data Manipulation Language
→
INSERT,DELETE,UPDATE,SELECT文
DCL: Data Control Language
→
COMMIT,ROLLBACK文
# 10
データベース
SQL
SQLの互換性
原則的にANSI / JIS に準拠
最低限の互換性が保証されているが、各RDBMS
によって独自拡張機能が数多くあり、その部分の
互換性は確保されていない
上記理由によりマイグレーション作業には注意が
必要
PHPのデータベース環境
ベンダー固有モジュールからPDOまで
# 11
# 12
PHPデータベース機能
PHPからデータベースを利用する
データベースサーバに接続するには以下の3つの方法
があります
ビルトイン関数
処理速度が速い
データベースごとに異なったコーディングが必要
PEAR DB
PHPに標準バンドルされているライブラリ
データベースの種類に依存しない設計
ビルトイン関数をPHPによってラッピングしているので処理速
度の問題がある
PDO (PHP Data Objects )
PHP5.1以降から標準バンドル
ライトウェイトでデータベースの種類に依存しない設計
Zend Framework にて使用
Copyright 2015 konekto, Inc
ベンダー固有 モジュー
ル
ベンダー固有モジュールによる
データベース処理
SQLITE3を使用して手軽にデータベース処理を体感
# 13
ベンダー固有モジュール
対象となるデータベース毎に用意され
た関数
データベース固有の機能が利用可能
対象データベースに特化した処理が可
能
# 14ベンダー固有のモジュール
CUBRID
DB++
dBase
filePro
Firebird/InterBase
FrontBase
IBM DB2 — IBM DB2、
Cloudscape および Apache
Derby
Informix
Ingres — Ingres DBMS, EDBC
および Enterprise Access
Gateways
MaxDB
Mongo — MongoDB
mSQL
Mssql — Microsoft SQL Server
MySQL — MySQL ドライバおよ
びプラグイン
OCI8 — Oracle OCI8
Paradox — Paradox ファイルア
クセス
PostgreSQL
SQLite
SQLite3
SQLSRV — PHP 用 Microsoft
SQL Server ドライバ
Sybase
tokyo_tyrant
# 15MySQLで検証
Mysql — 最初の MySQL API
Mysqli — MySQL 改良版拡張モジュール
Mysqlnd — MySQL Native Driver
mysqlnd_ms — Mysqlnd レプリケーションおよびロードバランシ
ング用プラグイン
mysqlnd_qc — Mysqlnd クエリ結果キャッシュプラグイン
mysqlnd_uh — Mysqlnd user handler plugin
mysqlnd_mux — Mysqlnd connection multiplexing plugin
mysqlnd_memcache — Mysqlnd Memcache プラグイン
# 16
PHP環境の確認
phpinfo関数によるデータベースドライバの確認
PHP環境の確認①
PHP環境の確認②
SQLITE3のインストール
シンプルで軽量なデータベース環境を用意します。
インストール手順①
SQLITE3を入手
http://www.sqlite.org/
Precompiled Binaries for Windows
sqlite-shell-win32-x86-3080802.zip
(306.08 KiB)
*2/15現在
適当に展開(別途説明)
インストール手順②
SQLITE3を実行&データベースファイル
の作成
C:¥SQLITE>sqlite3 test
SQLite version 3.8.8.2 2015-01-30
14:30:45
Enter ".help" for usage hints.
起動時にデータベースファイルを指定します。
存在しない場合には、自動的に作成します。
インストール手順③
C:¥SQLITE>sqlite3 test
SQLite version 3.8.8.2 2015-01-30 14:30:45
Enter ".help" for usage hints.
sqlite> create table meibo (
...> sno INTEGER,
...> name text,
...> memo text,
...> dflag INTEGER,
...> bdate text,
...> idate text,
...> udate text);
例題で使用するテーブル ‘meibo’を作成します。
データを挿入入力
sqlite> insert into meibo (sno,name,dflag) values
(1,"Satou",0);
sqlite> select * from meibo;
1|Satou||0|||
sqlite> insert into meibo (sno,name,dflag) values (2,"佐藤
",0);
sqlite> select * from meibo;
1|Satou||0|||
2|佐藤||0|||
例題ファイル
処理内容
ファイル名
参照
select.php
挿入
insert.php
更新
update.php
削除
delete.php
# 25select.php
<?php try {
$db = new SQLite3('c:¥sqlite¥test');
$results = $db->query('SELECT * FROM meibo'); while ($row = $results->fetchArray()) {
print $row['sno'].' ' ; print $row['name'].' ' ; print $row['memo'].' <br>' ; }
$db->close();
} catch (Exception $e) {
print 'DBへの接続でエラーが発生しました。<br>'; print $e->getTraceAsString();
} ?>
# 26
insert.php
<?php
try {
$db = new SQLite3('c:¥sqlite¥test');
$stmt = $db->prepare('INSERT INTO meibo (sno,name) VALUES (:id,:name)'); $stmt->bindValue(':id', $sno_max+1, SQLITE3_INTEGER);
$stmt->bindValue(':name', '吉田', SQLITE3_TEXT); $result = $stmt->execute();
$db->close();
} catch (Exception $e) {
print 'DBへの接続でエラーが発生しました。<br>'; print $e->getTraceAsString();
} ?>
# 27
update.php
<?php
try {
$db = new SQLite3('c:¥sqlite¥test');
$stmt = $db->prepare('update meibo set memo = :memo where name like :name'); $stmt->bindValue(':memo', 'メモを更新', SQLITE3_TEXT);
$stmt->bindValue(':name', '吉田', SQLITE3_TEXT); $result = $stmt->execute();
$db->close();
} catch (Exception $e) {
print 'DBへの接続でエラーが発生しました。<br>'; print $e->getTraceAsString();
} ?>
# 28
delete.php
<?php
try {
$db = new SQLite3('c:¥sqlite¥test');
$stmt = $db->prepare('DELETE from meibo where name like :name'); $stmt->bindValue(':name', '吉田', SQLITE3_TEXT);
$result = $stmt->execute();
$db->close();
} catch (Exception $e) {
print 'DBへの接続でエラーが発生しました。<br>'; print $e->getTraceAsString();
}
?>
# 29
PDOによるデータベース処理
SQLITE3を使用してベンダー固有モジュールとの比較
# 30
抽象化レイヤー
DBA — データベース (dbm 形式) 抽
象化レイヤ
dbx
ODBC — ODBC (Unified)
PDO — PHP Data Objects
# 31
# 32
PDOの目的
PDO (PHP Data Objects )
PDOは様々なRDBMSを統一的に扱うこ
とが可能です (隠蔽化:カプセル化)
言い換えると一度PDOの使い方を覚えて
しまえば、対応しているRDBMSであれば
全て同じコーディングで済みます
オブジェクト指向と例外処理に対応してい
ます
PDOドライバ
CUBRID 関数
(PDO_CUBRID)
Microsoft SQL Server お
よび Sybase 関数
(PDO_DBLIB)
Firebird 関数
(PDO_FIREBIRD)
IBM 関数 (PDO_IBM)
Informix 関数
(PDO_INFORMIX)
MySQL 関数
(PDO_MYSQL)
Microsoft SQL Server 関
数 (PDO_SQLSRV)
Oracle 関数 (PDO_OCI)
ODBC および DB2 関数
(PDO_ODBC)
PostgreSQL 関数
(PDO_PGSQL)
SQLite 関数
(PDO_SQLITE)
4D 関数 (PDO_4D)
# 33# 34
データベース
PDO
PDOのクラス
PDO
RDBMSへの接続を保持するクラス
PDOStatement
SQLの実行、結果セットとして返される
PDOException
PDOStatementが投げる例外のクラス
# 35
データベース
PDO
PDOの使い方
PHPスクリプトでデータベースに接続するには
ま
ずデータソース(DSN)を確認する必要があります
DSN (Database Source Name)
データベース接続の際に必要なデータを文字列であらわし
ます
'mysql:host=localhost;dbname=test','user','pass'
DBの種類 DBホスト名 使用するDB名
ユーザ名 パスワード
# 36
データベース
PDO
PDOの使い方
MySQLへの接続
DSNを引数としてPDOクラスのインスタンス
を生成することでMySQLに接続することがで
きます
$dbh = new PDO('mysql:host=localhost;dbname=test','user','pass');
PDOの切断
スクリプト終了と同時に自動的に切断するが、
明示的に切断したい場合は以下のようにする
$dbh = null;
# 37
データベース
PDO
try {
$dbh = new PDO('mysql:host=localhost;dbname=test','user','pass');
}
$dbh = null;
} catch (PDOException $e) {
print "エラー!: " . $e->getMessage() . "<br/>";
die();
}
PDOの使い方
PHPスクリプトで接続する際には例外処理を使用
します
PDOに接続してみましょう
# 38
データベース
PDO
try {
$dbh = new PDO('mysql:dbname=test;host=localhost', 'user','pass');
//エラー時に例外を投げる設定
$dbh ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = 'INSERT INTO test VALUES(2, "tanaka")';
$stmt = $dbh->query($sql);
$dbh = null;
} catch (PDOException $e) {
print "エラー!: " . $e->getMessage() . "<br/>";
die();
}
PDOの使い方
先程作成したテーブル「test」にデータを挿入す
るスクリプトを作ります
# 39
データベース
PDO
PDOの使い方
SELECT文を発行して「test」テーブルに登録さ
れている全てのデータを取得します
try {
$dbh = new PDO('mysql:dbname=test;host=localhost', 'user','pass');
$dbh ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//
foreach文を使って一行ずつ取得
foreach ($dbh->query('SELECT * from test') as $row) {
var_dump($row);
}
$dbh = null;
} catch (PDOException $e) {
print "エラー!: " . $e->getMessage() . "<br/>";
die();
}
例題ファイル
処理内容
ファイル名
参照
select2.php
挿入
insert2.php
更新
update2.php
削除
delete2.php
# 40select2.php
<?php try {
$db = new PDO('sqlite:c:¥sqlite¥test'); $sql ='SELECT * FROM meibo';
$results = $db->query($sql); foreach ($results as $row) {
print $row['sno'].' ' ; print $row['name'].' ' ; print $row['memo'].' <br>' ; }
$db=null;
} catch (Exception $e) {
print 'DBへの接続でエラーが発生しました。<br>'; print $db->errorInfo();
} ?>
# 41
insert2.php
<?php
try {
$db = new PDO('sqlite:c:¥sqlite¥test');
$sql = $db->prepare("insert into meibo (sno,name,memo) values (?,?,?)"); $arg = array($sno_max + 1, "田中","メモ帳");
$sql->execute($arg);
$db=null;
} catch (Exception $e) {
print 'DBへの接続でエラーが発生しました。<br>'; print $db->errorInfo();
}
?>
# 42
update2.php
<?php
try {
$db = new PDO('sqlite:c:¥sqlite¥test');
$sql = $db->prepare("update meibo set memo=? where name like ?"); $arg = array("手の甲にメモ","田中");
$sql->execute($arg);
$db=null;
} catch (Exception $e) {
print 'DBへの接続でエラーが発生しました。<br>'; print $db->errorInfo();
}
?>
# 43
delete2.php
<?php
try {
$db = new PDO('sqlite:c:¥sqlite¥test');
$sql = $db->prepare("delete from meibo where name like ?"); $arg = array("田中");
$sql->execute($arg);
$db=null;
} catch (Exception $e) {
print 'DBへの接続でエラーが発生しました。<br>'; print $db->errorInfo();
}
?>
# 44
IBMiとPHPの連係
DB2/400への接続:概要
PHPからDB2/400を操作可能
db2関数
# 46
DB2/400への接続:命令(関数)
接続と切断
db2_connect
db2_close
db2_pconnect
db2_pclose
SQL実行
db2_exec
db2_fetch_array
db2_fetch_assoc
db2_fetch_both
プリペア
db2_prepare
db2_bind_param
db2_execute
トランザクション
db2_commit
db2_rollback
# 47DB2/400への接続:コードサン
プル
<?php $db_con = db2_connect('', '', ''); if(!$db_con){ echo 'DB2に接続できません:', db2_conn_errormsg(); exit; }$query = ' SELECT * FROM ZPHPTEST.ZLOGF ORDER BY CTIME '; $result = db2_exec($db_con, $query);
if(!$result){
echo 'SQLが実行できませんでした:', db2_stmt_errormsg(); db2_close($db_con);
exit; }
echo '<table border=1>', '<tr><th>CTIME</th></tr>'; while($row = db2_fetch_array($result)) { echo '<tr>', '<td>', $row[0], '</td>', '</tr>'; } echo '</table>'; db2_close($db_con); ?> # 48
DB2/400への接続:参考情報
Konekto技術情報ページ
http://www.konekto.jp/tech/index.php?
Old%2FZend%20Server%2FIBMi%2Fd
b2func
Ustream(PHP勉強会2011年度)
:TEAM-HALh
# 49IBM iとの連携:概要
PHPからIBM i に接続
プログラムの実行
システム資源の参照
CL
RPG
スプール
ジョブログ
システム値
オブジェクト一覧
db2関数
XML Toolkit
RPG
# 50IBM iとの連携:命令(メソッド)
Toolkitオブジェクト
getInstanceメソッド
接続とオブジ
ェクトの作成
Disconnectメソッド
切断とオブジ
ェクトの削除
メソッドの種類
CLCommand メソッド
PGMCall メソッド
パラメーター設定メソッド
AddParameterChar AddParameterPackDec, AddParameterZoned AddParameterFloat AddParameterReal AddParameterBin AddParameterInt32, AddParameterUInt32 AddParameterInt64, AddParameterUint64 AddDataStruct UpdateParameterValueiToolkit サービス・クラ
ス
スプール・ファイル
GetSPLList GetSPLFジョブログ
JobList createJobListArray JobLogシステム値
SystemValuesList GetSystemValueオブジェクト一覧
getObjectList # 51IBM iとの連携:コードサンプル
</pre> <?php include_once 'authorization.php'; include_once '../API/ToolkitService.php'; try {$obj = ToolkitService::getInstance($db, $user, $pass); }
catch (Exception $e) {
echo $e->getMessage(), "¥n"; exit(); } $obj->setToolkitServiceParams(array('InternalKey'=>"/tmp/$user", 'debug'=>false, 'plug' => "iPLUG32K")); $cmd = "addlible ZENDSVR"; $obj->CLCommand($cmd); echo "<pre>"; $Rows = $obj->CLInteractiveCommand("DSPLIBL"); /*$Rows = $obj->CLInteractiveCommand("WRKSYSVAL OUTPUT(*PRINT)");*/ if(!$Rows ) echo $obj->getLastError(); else var_dump($Rows); echo "</pre>"; ?> # 52