Pearでデータベース(DB)

更新日2009-02-10 (火) 14:23:30

MySQLへの接続

PEAR::DBを利用するには

DBのクラスがインストールされていることない場合はインストールする

以下で確認

$ pear list
Installed packages, channel pear.php.net:
=========================================
Package          Version State
Archive_Tar      1.3.2   stable
Auth             1.6.1   stable
(略)
Crypt_CHAP       1.0.1   stable
DB               1.7.13  stable   <==これがあること
File_Passwd      1.1.6   stable
HTTP_Client      1.1.1   stable
HTTP_Request     1.4.2   stable

インストール

# pear install --alldeps DB

DBへの接続

//PEARのクラスライブラリをインクルード
require_once("DB.php");

$dsn = array(
    "phptype" => "mysqli",        <==MySQLを指定
    "username" => "ism",          <==MySQLのユーザ名
    "password" => "****",         <==MySQLパスワード
    "hostspec" => "192.168.30.16",<==MySQLのHost(IP or Host名)
    "database" => "db_test1");    <==接続DB名

$option = array(
    "autofree" => TRUE,
    "debug" => 1,
    "portability" => DB_PORTABILITY_ALL);

$db = DB::connect($dsn, $option);
if(DB::isError($db)){
    die("接続失敗 : " . $db->getMessage() ."\n");
}

print("接続成功 \n");

$db->disconnect();

?>

接続可能なDB名(phptype)

phptypeDB名
mysqlMySQL 4.0以前
mysqliMySQL 4.1以降(PHP5が必要)
oci8Oracle7/8/9
odbcODBC
pgsqlPostgreSQL
sybaseSybase

オプション

autofree(false): trueでは読み込み可能な行がなくなった時点で結果を開放する debug(0):     0-3で指定し大きいほうが詳細情報を出力する portability(DB_PORTABILITY_NONE): DBの種類による差を吸収するオプション
DB_PORTABILITY_ALLで最大限吸収する。詳細は別途検討する。

接続エラー

以下のエラーが出た場合phpでMySQL関数が使用できないようなのでphp5-mysqlをインストールする

DB Error: extension not found

DBのデータ読み取り

SQLを発行して連想配列に取得

$result = $db->query("select * from t_test");
//エラー処理
if(DB::isError($result)){
     die("エラーメッセージ". $result->getMessage() . " /  エラーコード: " . 
$result->getCode() . "\n");
}


// 連想配列に指定 : DB_FETCHMODE_ASSOC
print "連想配列 \n";
while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)){
        printf("%s   %s   %s \n", $row['no'], $row['data2'],
mb_convert_encoding($row['data3'],"EUC-JP","UTF-8"));
}

SQLを発行してオブジェクトに取得

$result = $db->query("select * from t_test");

// オブジェクトに指定 : DB_FETCHMODE_OBJECT
print "オブジェクト \n";
while ($row = $result->fetchRow(DB_FETCHMODE_OBJECT)){
        printf("%s   %s   %s \n", $row->no, $row->data2, mb_convert_encoding
($row->data3, "EUC-JP","UTF-8"));
}

SQL発行してレコード数、フィールド数の取得

$result = $db->query("select * from t_test");

//レコード数の取得

$num = $result->numRows();

printf("取得レコード数 %d \n",$num);

//フィールド数の取得

$num = $result->numCols();
printf("取得フィールド数 %d \n",$num);

$db->queryでは配列で指定した場所(?)に代入することができる

これにより、SQLインジェクション対策になるかも

// プレイスホルダ
$result = $db->query("select * from t_test where no=?", array(2));

while ($row = $result->fetchRow(DB_FETCHMODE_OBJECT)){
        printf("%s   %s   %s \n", $row->no, $row->data2, mb_convert_encoding
($row->data3,"EUC-JP","UTF-8"));
}

MySQLでは「--」はコメントになる。SQLインジェクションに注意

SQLインジェクションの例

idとパスワードを入れる例としてidの部分に 「'' or 'a'='a';--」と入力されると'a'='a'は常に真で、--以降はコメントになるのですべてにHitする。 passは 空白でSQLは以下のようになる。

select * from t_member where id ='' or 'a'='a';-- and pass='';

テーブル参照エラー処理

// エラー処理
$result = $db->query("select * from t_test2");

if(DB::isError($result)){
     die("エラーメッセージ". $result->getMessage() . " /  エラーコード: " . 
$result->getCode() . "\n");
}

DBへの書き込み

プレイスホルダを利用したインサート

$write_data = array(
    3,
    18,
    mb_convert_encoding("静岡", "UTF-8", "EUC-JP"));

$result = $db->query("insert into t_test(no, data2, data3) values(?, ?, ?)",
$write_data);

if(DB::isError($result)){
     die("エラーメッセージ". $result->getMessage() . " /  エラーコード: " . 
$result->getCode() . "\n");
}

PostgreSQLへの接続

接続時、phptypeをpgsqlに変更するだけでMySQLと同じように利用できた

DBへの接続

<?php
// DBはPostgreSQL LocalHost

require_once("DB.php");

$dsn = array(
    "phptype" => "pgsql",
    "username" => "okada",
    "password" => "****",
    "hostspec" => "localhost",
    "database" => "db_test1");

$option = array(
    "autofree" => TRUE,
    "debug" => 1,
    "portability" => DB_PORTABILITY_ALL);

$db = DB::connect($dsn, $option);
if(DB::isError($db)){
    die("接続失敗 : " . $db->getMessage() ."\n");
}

print("接続成功 \n");

$db->disconnect();

?>

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-02-10 (火) 14:23:30 (3510d)