phpデータベース基本 · ビルトイン関数 処理速度が速い...
Post on 16-Oct-2020
2 Views
Preview:
TRANSCRIPT
PHPデータベース基本
基本的な概念とサンプルコード
Copyright 2015 konekto, Inc
データベース基本
データベース処理の基本知識を解説します。
# 2Copyright 2015 konekto, Inc
# 3
データベース基礎知識
�データベースとは…
�特定のテーマに沿ったデータを集めて管理し、容易に検索・抽出などの再利用をできるようにしたもの
�データベースの管理はDBMS(データベース管理システム)が行う
Copyright 2015 konekto, Inc
# 4
データベース基礎知識
�RDBMSとは…
�リレーショナルデータベース管理システム
�現在最も多く利用されている
� 1件のデータを複数の項目(カラム/フィールド)の集合と
して表現
�レコードの集合をテーブルとして保持
カラム
レコード
テーブル
Copyright 2015 konekto, Inc
# 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...
Copyright 2015 konekto, Inc
# 7
データベース基礎知識
�データベースの役割�大量のデータを多数のユーザのもとで一元管理を
行うことが可能
DBサーバWebサーバ
SQL処理
管理者
一般ユーザ
Webアプリ
Copyright 2015 konekto, Inc
# 8
データベースSQL
�SQLとは…
� SQL: Structured Query Language
�世界標準規格のデータベース操作言語
� RDBMSにおいて、データの操作や定義を行うためのデータベース言語(問い合わせ言語)
Copyright 2015 konekto, Inc
# 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文
Copyright 2015 konekto, Inc
# 10
データベースSQL
�SQLの互換性
�原則的にANSI / JIS に準拠
�最低限の互換性が保証されているが、各RDBMSによって独自拡張機能が数多くあり、その部分の互換性は確保されていない
�上記理由によりマイグレーション作業には注意が必要
Copyright 2015 konekto, Inc
PHPのデータベース環境
ベンダー固有モジュールからPDOまで
# 11Copyright 2015 konekto, Inc
# 12
PHPデータベース機能
� PHPからデータベースを利用する�データベースサーバに接続するには以下の3つの方法
があります� ビルトイン関数
�処理速度が速い
�データベースごとに異なったコーディングが必要
� PEAR DB
� PHPに標準バンドルされているライブラリ
�データベースの種類に依存しない設計
�ビルトイン関数をPHPによってラッピングしているので処理速度の問題がある
� PDO (PHP Data Objects )
� PHP5.1以降から標準バンドル
�ライトウェイトでデータベースの種類に依存しない設計
� Zend Framework にて使用
Copyright 2015 konekto, Inc
ベンダー固有
モジュール
ベンダー固有モジュールによる
データベース処理
SQLITE3を使用して手軽にデータベース処理を体感
# 13Copyright 2015 konekto, Inc
ベンダー固有モジュール
�対象となるデータベース毎に用意された関数
�データベース固有の機能が利用可能
�対象データベースに特化した処理が可能
# 14Copyright 2015 konekto, Inc
ベンダー固有のモジュール
� 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
# 15Copyright 2015 konekto, Inc
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 プラグイン
# 16Copyright 2015 konekto, Inc
PHP環境の確認
phpinfo関数によるデータベースドライバの確認
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 Windowssqlite-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
# 25Copyright 2015 konekto, Inc
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();
}
?>
# 26Copyright 2015 konekto, Inc
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();
}
?>
# 27Copyright 2015 konekto, Inc
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();
}
?>
# 28Copyright 2015 konekto, Inc
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();
}
?>
# 29Copyright 2015 konekto, Inc
PDOによるデータベース処理
SQLITE3を使用してベンダー固有モジュールとの比較
# 30Copyright 2015 konekto, Inc
抽象化レイヤー
�DBA — データベース (dbm 形式) 抽象化レイヤ
�dbx
�ODBC — ODBC (Unified)
�PDO — PHP Data Objects
# 31Copyright 2015 konekto, Inc
# 32
PDOの目的
�PDO (PHP Data Objects )
�PDOは様々なRDBMSを統一的に扱うことが可能です (隠蔽化:カプセル化)
�言い換えると一度PDOの使い方を覚えてしまえば、対応しているRDBMSであれば全て同じコーディングで済みます
�オブジェクト指向と例外処理に対応しています
Copyright 2015 konekto, Inc
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)
# 33Copyright 2015 konekto, Inc
# 34
データベースPDO
�PDOのクラス
�PDO
�RDBMSへの接続を保持するクラス
�PDOStatement
�SQLの実行、結果セットとして返される
�PDOException
�PDOStatementが投げる例外のクラス
Copyright 2015 konekto, Inc
# 35
データベースPDO
�PDOの使い方�PHPスクリプトでデータベースに接続するには ま
ずデータソース(DSN)を確認する必要があります
�DSN (Database Source Name)
�データベース接続の際に必要なデータを文字列であらわします
'mysql:host=localhost;dbname=test','user','pass'
DBの種類 DBホスト名 使用するDB名
ユーザ名 パスワード
Copyright 2015 konekto, Inc
# 36
データベースPDO
�PDOの使い方�MySQLへの接続
�DSNを引数としてPDOクラスのインスタンスを生成することでMySQLに接続することができます
$dbh = new PDO('mysql:host=localhost;dbname=test','user','pass');
�PDOの切断�スクリプト終了と同時に自動的に切断するが、
明示的に切断したい場合は以下のようにする
$dbh = null;
Copyright 2015 konekto, Inc
# 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に接続してみましょう
Copyright 2015 konekto, Inc
# 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」にデータを挿入す
るスクリプトを作ります
Copyright 2015 konekto, Inc
# 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();
}
Copyright 2015 konekto, Inc
例題ファイル
処理内容 ファイル名
参照 select2.php
挿入 insert2.php
更新 update2.php
削除 delete2.php
# 40Copyright 2015 konekto, Inc
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();
}
?>
# 41Copyright 2015 konekto, Inc
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();
}
?>
# 42Copyright 2015 konekto, Inc
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();
}
?>
# 43Copyright 2015 konekto, Inc
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();
}
?>
# 44Copyright 2015 konekto, Inc
IBMiとPHPの連係
Copyright 2015 konekto, Inc
DB2/400への接続:概要
�PHPからDB2/400を操作可能
db2関数
# 46Copyright 2015 konekto, Inc
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
# 47Copyright 2015 konekto, Inc
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);?>
# 48Copyright 2015 konekto, Inc
DB2/400への接続:参考情報
�Konekto技術情報ページ
�http://www.konekto.jp/tech/index.php?Old%2FZend%20Server%2FIBMi%2Fdb2func
�Ustream(PHP勉強会2011年度)
�:TEAM-HALh
# 49Copyright 2015 konekto, Inc
IBM iとの連携:概要
�PHPからIBM i に接続
�プログラムの実行
�システム資源の参照
CL RPG
スプール
ジョブログ
システム値
オブジェクト一覧
db2関数XML Toolkit RPG
# 50Copyright 2015 konekto, Inc
IBM iとの連携:命令(メソッド)
� Toolkitオブジェクト� getInstanceメソッド 接続とオブジェクトの作成
� Disconnectメソッド 切断とオブジェクトの削除
� メソッドの種類� CLCommand メソッド� PGMCall メソッド� パラメーター設定メソッド
� AddParameterChar
� AddParameterPackDec, AddParameterZoned
� AddParameterFloat
� AddParameterReal
� AddParameterBin
� AddParameterInt32, AddParameterUInt32
� AddParameterInt64, AddParameterUint64
� AddDataStruct
� UpdateParameterValue
� iToolkit サービス・クラス� スプール・ファイル
� GetSPLList
� GetSPLF
� ジョブログ� JobList
� createJobListArray
� JobLog
� システム値� SystemValuesList
� GetSystemValue
� オブジェクト一覧� getObjectList
# 51Copyright 2015 konekto, Inc
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>";?>
# 52Copyright 2015 konekto, Inc
top related