Comments
Description
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