*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で最大限吸収する。詳細は別途検討する。 ''接続エラー'' 以下のエラーが出た場合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(); ?>