...

テキスト1

by user

on
Category: Documents
22

views

Report

Comments

Transcript

テキスト1
PHPデータベース基本
基本的な概念とサンプルコード
Copyright 2015 konekto, Inc
データベース処理の基本知識を解説します。
データベース基本
Copyright 2015 konekto, Inc
#2
データベース
基礎知識
データベースとは…
特定のテーマに沿ったデータを集めて管理
し、容易に検索・抽出などの再利用をでき
るようにしたもの
データベースの管理はDBMS(データベー
ス管理システム)が行う
Copyright 2015 konekto, Inc
#3
データベース
基礎知識
RDBMSとは…
リレーショナルデータベース管理システム
現在最も多く利用されている
1件のデータを複数の項目(カラム/フィールド)の集合と
して表現
カラム
レコード
レコードの集合をテーブルとして保持
Copyright 2015 konekto, Inc
テーブル
#4
データベース
リレーション
リレーションとは…
テーブル
関連する値を通じて結合して表を作成(重複)
ID 部署No
名前
内線番号
部署No
部門名
ロケーション
1
11
佐藤
1111
11
システム部
研究所
2
22
田中
1112
22
営業部
営業所
3
33
山田
1113
33
総務部
ID
名前
部門名
ロケーション
1
佐藤
システム部
研究所
2
田中
営業部
営業所
3
山田
総務部
本社
Copyright 2015 konekto, Inc
カラム
本社
#5
データベース
基礎知識
主なRDBMS
MySQL
PostgreSQL
Oracle
DB2
MSSQL
その他
Access, Firebird, Cloudscape...
Copyright 2015 konekto, Inc
#6
データベース
基礎知識
データベースの役割
大量のデータを多数のユーザのもとで一元管理を
行うことが可能
SQL処理
管理者
Webサーバ
DBサーバ
Webアプリ
一般ユーザ
Copyright 2015 konekto, Inc
#7
データベース
SQL
SQLとは…
SQL: Structured Query Language
世界標準規格のデータベース操作言語
RDBMSにおいて、データの操作や定義
を行うためのデータベース言語(問い合わ
せ言語)
Copyright 2015 konekto, Inc
#8
データベース
SQL
SQLの種類
DDL: Data Definition Language
→CREATE,ALTER,DROP,GRANT文
DML: Data Manipulation Language
→INSERT,DELETE,UPDATE,SELECT文
DCL: Data Control Language
→COMMIT,ROLLBACK文
Copyright 2015 konekto, Inc
#9
データベース
SQL
SQLの互換性
原則的にANSI / JIS に準拠
最低限の互換性が保証されているが、各RDBMS
によって独自拡張機能が数多くあり、その部分の
互換性は確保されていない
上記理由によりマイグレーション作業には注意が
必要
Copyright 2015 konekto, Inc
# 10
ベンダー固有モジュールからPDOまで
PHPのデータベース環境
Copyright 2015 konekto, Inc
# 11
PHPデータベース機能
PHPからデータベースを利用する
データベースサーバに接続するには以下の3つの方法
があります
ベンダー固有
モジュール
ビルトイン関数
処理速度が速い
データベースごとに異なったコーディングが必要
PEAR DB
PHPに標準バンドルされているライブラリ
データベースの種類に依存しない設計
ビルトイン関数をPHPによってラッピングしているので処理速
度の問題がある
PDO (PHP Data Objects )
PHP5.1以降から標準バンドル
ライトウェイトでデータベースの種類に依存しない設計
Zend Framework にて使用
Copyright 2015 konekto, Inc
# 12
SQLITE3を使用して手軽にデータベース処理を体感
ベンダー固有モジュールによる
データベース処理
Copyright 2015 konekto, Inc
# 13
ベンダー固有モジュール
対象となるデータベース毎に用意され
た関数
データベース固有の機能が利用可能
対象データベースに特化した処理が可
能
Copyright 2015 konekto, Inc
# 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
Copyright 2015 konekto, Inc
# 15
MySQLで検証
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 プラグイン
Copyright 2015 konekto, Inc
# 16
phpinfo関数によるデータベースドライバの確認
PHP環境の確認
Copyright 2015 konekto, Inc
# 17
PHP環境の確認①
Copyright 2015 konekto, Inc
# 18
PHP環境の確認②
Copyright 2015 konekto, Inc
# 19
シンプルで軽量なデータベース環境を用意します。
SQLITE3のインストール
Copyright 2015 konekto, Inc
# 20
インストール手順①
SQLITE3を入手
http://www.sqlite.org/
Precompiled Binaries for Windows
sqlite-shell-win32-x86-3080802.zip
(306.08 KiB) *2/15現在
適当に展開(別途説明)
Copyright 2015 konekto, Inc
# 21
インストール手順②
SQLITE3を実行&データベースファイル
の作成
C:¥SQLITE>sqlite3 test
SQLite version 3.8.8.2 2015-01-30
14:30:45
Enter ".help" for usage hints.
起動時にデータベースファイルを指定します。
存在しない場合には、自動的に作成します。
Copyright 2015 konekto, Inc
# 22
インストール手順③
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’を作成します。
Copyright 2015 konekto, Inc
# 23
データを挿入入力
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|||
Copyright 2015 konekto, Inc
# 24
例題ファイル
処理内容
ファイル名
参照
select.php
挿入
insert.php
更新
update.php
削除
delete.php
Copyright 2015 konekto, Inc
# 25
select.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();
}
?>
Copyright 2015 konekto, Inc
# 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();
}
?>
Copyright 2015 konekto, Inc
# 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();
}
?>
Copyright 2015 konekto, Inc
# 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();
}
?>
Copyright 2015 konekto, Inc
# 29
SQLITE3を使用してベンダー固有モジュールとの比較
PDOによるデータベース処理
Copyright 2015 konekto, Inc
# 30
抽象化レイヤー
DBA — データベース (dbm 形式) 抽
象化レイヤ
dbx
ODBC — ODBC (Unified)
PDO — PHP Data Objects
Copyright 2015 konekto, Inc
# 31
PDOの目的
PDO (PHP Data Objects )
PDOは様々なRDBMSを統一的に扱うこ
とが可能です (隠蔽化:カプセル化)
言い換えると一度PDOの使い方を覚えて
しまえば、対応しているRDBMSであれば
全て同じコーディングで済みます
オブジェクト指向と例外処理に対応してい
ます
Copyright 2015 konekto, Inc
# 32
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)
Copyright 2015 konekto, Inc
# 33
データベース
PDO
PDOのクラス
PDO
RDBMSへの接続を保持するクラス
PDOStatement
SQLの実行、結果セットとして返される
PDOException
PDOStatementが投げる例外のクラス
Copyright 2015 konekto, Inc
# 34
データベース
PDO
PDOの使い方
PHPスクリプトでデータベースに接続するには ま
ずデータソース(DSN)を確認する必要があります
DSN (Database Source Name)
データベース接続の際に必要なデータを文字列であらわし
ます
ユーザ名
パスワード
'mysql:host=localhost;dbname=test','user','pass'
DBの種類
DBホスト名
使用するDB名
Copyright 2015 konekto, Inc
# 35
データベース
PDO
PDOの使い方
MySQLへの接続
DSNを引数としてPDOクラスのインスタンス
を生成することでMySQLに接続することがで
きます
$dbh = new PDO('mysql:host=localhost;dbname=test','user','pass');
PDOの切断
スクリプト終了と同時に自動的に切断するが、
明示的に切断したい場合は以下のようにする
$dbh = null;
Copyright 2015 konekto, Inc
# 36
データベース
PDO
PDOの使い方
PHPスクリプトで接続する際には例外処理を使用
します
PDOに接続してみましょう
try {
$dbh = new PDO('mysql:host=localhost;dbname=test','user','pass');
}
$dbh = null;
} catch (PDOException $e) {
print "エラー!: " . $e->getMessage() . "<br/>";
die();
}
Copyright 2015 konekto, Inc
# 37
データベース
PDO
PDOの使い方
先程作成したテーブル「test」にデータを挿入す
るスクリプトを作ります
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();
}
Copyright 2015 konekto, Inc
# 38
データベース
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();
}
Copyright 2015 konekto, Inc
# 39
例題ファイル
処理内容
ファイル名
参照
select2.php
挿入
insert2.php
更新
update2.php
削除
delete2.php
Copyright 2015 konekto, Inc
# 40
select2.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();
}
?>
Copyright 2015 konekto, Inc
# 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();
}
?>
Copyright 2015 konekto, Inc
# 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();
}
?>
Copyright 2015 konekto, Inc
# 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();
}
?>
Copyright 2015 konekto, Inc
# 44
IBMiとPHPの連係
Copyright 2015 konekto, Inc
DB2/400への接続:概要
PHPからDB2/400を操作可能
db2関数
Copyright 2015 konekto, Inc
# 46
DB2/400への接続:命令(関数)
接続と切断
プリペア
db2_connect
db2_close
db2_pconnect
db2_pclose
SQL実行
db2_prepare
db2_bind_param
db2_execute
トランザクション
db2_commit
db2_rollback
db2_exec
db2_fetch_array
db2_fetch_assoc
db2_fetch_both
Copyright 2015 konekto, Inc
# 47
DB2/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);
?>
Copyright 2015 konekto, Inc
# 48
DB2/400への接続:参考情報
Konekto技術情報ページ
http://www.konekto.jp/tech/index.php?
Old%2FZend%20Server%2FIBMi%2Fd
b2func
Ustream(PHP勉強会2011年度)
:TEAM-HALh
Copyright 2015 konekto, Inc
# 49
IBM iとの連携:概要
PHPからIBM i に接続
プログラムの実行
システム資源の参照
CL
RPG
スプール
ジョブログ
システム値
オブジェクト一覧
XML Toolkit
db2関数
Copyright 2015 konekto, Inc
RPG
# 50
IBM iとの連携:命令(メソッド)
Toolkitオブジェクト
getInstanceメソッド
ェクトの作成
Disconnectメソッド
ェクトの削除
接続とオブジ
iToolkit サービス・クラ
ス
切断とオブジ
スプール・ファイル
GetSPLList
GetSPLF
ジョブログ
メソッドの種類
CLCommand メソッド
PGMCall メソッド
パラメーター設定メソッド
AddParameterChar
AddParameterPackDec,
AddParameterZoned
AddParameterFloat
AddParameterReal
AddParameterBin
AddParameterInt32, AddParameterUInt32
AddParameterInt64, AddParameterUint64
AddDataStruct
UpdateParameterValue
Copyright 2015 konekto, Inc
JobList
createJobListArray
JobLog
システム値
SystemValuesList
GetSystemValue
オブジェクト一覧
getObjectList
# 51
IBM 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>";
?>
Copyright 2015 konekto, Inc
# 52
Fly UP