*Pearでデータベース(DB) [#v3c4d5a8]

RIGHT:更新日&lastmod();  

**MySQLへの接続 [#adc621eb]

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への接続 [#t22cee89]

 //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)''~

|phptype|DB名|
|mysql|MySQL 4.0以前|
|mysqli|MySQL 4.1以降(PHP5が必要)|
|oci8|Oracle7/8/9|
|odbc|ODBC|
|pgsql|PostgreSQL|
|sybase|Sybase|

''オプション''~

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

''接続エラー''

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

 DB Error: extension not found


***DBのデータ読み取り [#fc62abef]

''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"));
 }

&color(red){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への書き込み [#ye43056b]

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

 $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への接続 [#x41e2433]

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

***DBへの接続 [#fe5188a3]

 <?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