コードをコピーする コードは次のとおりです。
class HRDB{
protected $pdo;
protected $config;
/*constructor*/
function __construct($config){
$this-> Config = $config;
$this->connect();
}
/*データベース接続*/
public function connect(){
$this->pdo = new PDO($this->Config[ 'dsn '], $this->Config['name'], $this->Config['password']);
$this->pdo->query('set names utf8;');
/ /結果を stdClass にシリアル化します
//$this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
//例外をキャッチする独自のコードを作成します
$this->pdo ->setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
/*データベースクローズ*/
パブリック関数close(){
$this->pdo = null;
パブリック関数クエリ($sql) {
$res = $this->pdo->query($sql);
if($res){
$this->res = $res;
} パブリック関数 exec ($sql) {
$res = $this->pdo->exec($sql);
if($res){
$this->res = $res;
}
パブリック関数 fetchAll (){
return $this->res->fetchAll();
}
public function fetch(){
return $this->res->fetch();
public function fetchColumn(); {
return $this->res->fetchColumn();
}
public function lastInsertId(){
return $this->res->lastInsertId();
/**
* パラメータの説明
* int $debug デバッグを有効にするかどうか、有効にすると SQL 文が出力されます
* 0 無効にする
* 1 有効にする
* 2 プログラムを有効にして終了する
* int $mode 戻り値の型
* 0 複数のレコードを返す
* 1 単一のレコードを返す
* 2 行数を返す
* string/array $table データベーステーブル、2 つの値渡しモード
* 通常モード:
* 'tb_member, tb_money'
* 配列モード:
* array('tb_member', 'tb_money')
* string/array $fields クエリ対象のデータベース フィールド。空にすることができます。デフォルトはすべてを検索します。2 つの値渡しモード
* 通常モード:
* 'ユーザー名、パスワード'
* 配列モード:
* array('username', 'password')
* string/array $sqlwhere クエリ条件、空許可、2 つの値渡しモード
* 通常モード:
* 'and type = 1 とユーザー名 like "%os%"'
* 配列モード:
* array('type = 1', 'username like "%os%"')
* string $orderby 並べ替え、デフォルトは ID の逆順です
*/
public function select($debug, $mode, $table, $fields="*", $sqlwhere="", $orderby="tbid desc"){
//パラメータ処理
if(is_array($table) )){
$table = implode(', ', $table);
}
if(is_array($fields)){
$fields = implode(', ', $fields)
}
if(is_array( $sqlwhere)) {
$sqlwhere = ' および '.implode(' および ', $sqlwhere);
}
//データベース操作
if($debug === 0){
if($mode === 2) ){
$ this->query("select count(tbid) from $table where 1=1 $sqlwhere");
$return = $this->fetchColumn(); = 1){
$this->query("select $fields from $table where 1=1 $sqlwhere order by $orderby");
$return = $this->fetch(); $this-> ;query("select $fields from $table where 1=1 $sqlwhere order by $orderby");
$return = $this->fetchAll();
return $return
}; {
if( $mode === 2){
echo "select count(tbid) from $table where 1=1 $sqlwhere";
}else if($mode === 1){
echo "select $fields from $table where 1=1 $sqlwhere order by $orderby";
}
else{
echo "select $fields from $table where 1=1 $sqlwhere order by $orderby";
}
if($debug == = 2){
exit;
}
}
}
/**
* パラメータの説明
* int $debug デバッグを有効にするかどうか、有効にすると SQL ステートメントが出力されます
* 0 無効にする
* 1 有効にする
* 2 プログラムを有効にして終了します
* int $mode return type
* 0 戻り情報なし
* 1 実行エントリの数を返します
* 2 最後に挿入されたレコードの ID を返します
* string/array $table データベーステーブル、 2 つの値渡しモード
* 通常モード:
* 'tb_member, tb_money'
* 配列モード:
* array('tb_member', 'tb_money')
* string/array $set 挿入されるフィールドとコンテンツ、2 つの値渡しモード
* 通常モード:
* 'ユーザー名 = "テスト"、タイプ = 1、dt = now()'
* 配列モード:
* 配列('ユーザー名 = "テスト"'、'タイプ = 1'、'dt = now()')
*/
public function insert($debug, $mode, $table, $set){
//パラメータ処理
if(is_array($table)){
$table = implode(', ', $table)
}
if(is_array($set)){
$set = implode(', ', $set);
}
//データベース操作
if($debug === 0){
if($mode === 2 ){
$this->query("$table set $set に挿入");
$return = $this->lastInsertId();
}else if($mode === 1){
$this ->exec("$table セット $set に挿入");
$return = $this->res;
}else{
$this->query("$table セット $set に挿入");
$return = NULL;
return $return;
echo "$table set $set";
if($debug === 2){
}
}
/**
* パラメータ 説明
* int $debug デバッグを有効にするかどうか、有効にすると SQL 文が出力されます
* 0 無効
* 1 有効にする
* 2 プログラムを有効にして終了します
* int $mode 戻り値の型
* 0 戻り情報なし
* 1 実行エントリの数を返します
* string $table データベーステーブル、2 つの値渡しモード
* 通常モード:
* 'tb_member, tb_money'
* 配列モード:
* array('tb_member ', 'tb_money')
* string/ array $set 更新する必要があるフィールドとコンテンツ、2 つの値転送モード
* 通常モード:
* 'username = "test"、type = 1、dt = now()'
* 配列モード:
* array('username = "test"', 'type = 1', 'dt = now()')
* string/array $sqlwhere 条件を変更し、空の 2 つの値渡しモードを許可します
* 通常モード:
* 'and type = 1 and username like "%os%"'
* 配列モード:
* array('type = 1', 'username like "%os%"')
*/
public function update($debug, $mode, $table, $set, $sqlwhere=""){
//パラメータ処理
if(is_array($table)){
$テーブル = implode(', ', $table);
}
if(is_array($set)){
$set = implode(', ', $set);
}
if(is_array($sqlwhere))
$sqlwhere = ' および '.implode(' および ', $sqlwhere);
}
//データベース操作
if($debug === 0){
if($mode === 1){
$this ->exec("update $table set $set where 1=1 $sqlwhere");
$return = $this->res;
}else{
$this->query("update $table set $ set where 1=1 $sqlwhere");
$return = NULL;
}
return $return;
}else{
echo "update $table set $set where 1=1 $sqlwhere";
if($debug = == 2){
終了;
}
}
}
/**
* パラメータ 説明
* int $debug デバッグを有効にするかどうか、有効にすると SQL 文が出力されます
* 0 無効
* 1 有効にする
* 2 プログラムを有効にして終了します
* int $mode 戻り値の型
* 0 戻り情報なし
* 1 実行エントリの数を返します
* string $table データベーステーブル
* string/array $sqlwhere 削除条件、空でも可、2 つの値渡しモード
* 通常モード:
* 'およびtype = 1 およびユーザー名 like "%os%" '
* 配列モード:
* array('type = 1', 'username like "%os%"')
*/
public function delete($debug, $mode, $table, $sqlwhere=""){
//パラメータ処理
if(is_array($sqlwhere)){
$sqlwhere = ' および '.implode(' および ', $sqlwhere);
}
//データベース操作
if($debug === 0){
if($ mode === 1){
$this->exec("$table where 1=1 $sqlwhere")
$return = $this->res;
$this-> query("$table where 1=1 $sqlwhere から削除");
$return = NULL;
}else{
echo "$table where 1=1 $sqlwhere から削除"; ($debug === 2){
exit;
}
}
}
}
実際、使用法は以前のものとあまり変わりませんが、目的は移植を容易にすることです。
この書き換えにより、いくつかの問題が解決されました:
① Insert ステートメントが複雑すぎて、フィールドと値の対応にエラーが発生しやすい
最も一般的な SQL の Insert ステートメントを見てみましょう
コードをコピーコードは以下の通りです: insert into tb_member (username , type, dt) names ('test', 1, now())
従来のモードではfieldsとvaluesのパラメータは別々に渡されますが、 2 つのパラメータが同じ順序で渡されるようにするために必要です。これにより、順序の乱れやパラメーターの欠落が容易に発生する可能性があります。
今回は、MySQL の独自の挿入構文を使用して問題を修正しました。 上記と同じ関数をこの書き方に変更できます
コードをコピー コードは次のとおりです: insert into tb_member set username = "test ", type = 1, lastlogindt = now()
update同様、一目瞭然です。
②一部のパラメータは配列に置き換えることができます
例えばこのSQL
コードをコピー コードは以下の通りです: delete from tb_member where 1=1 and tbid = 1 and username = "hooray"
メソッドが元々あるときと呼ばれます。手動で組み立てる必要があります。 where 条件は良好です。この操作のコストは非常に高くなります。これで、このフォームを完全に使用できるようになります。
コードをコピーします。 コードは次のとおりです。
$where = array(
'tbid = 1' ,
'username = "hooray"'
);
$ db->delete(1, 0, 'tb_member', $where);
条件がいくつあっても思考が混乱することはありません。同様に、where パラメーターだけでなく、update のセットもこの形式にすることができます (詳細については完全なソース コードを参照してください)
コードをコピーします コードは次のとおりです:
$set = array('username = "123" ', 'type = 1 ', 'lastlogindt = now()');
$where = array('tbid = 1');
$db->update(1, 0, 'tb_member', $set, $ where);
③ カスタマイズ可能な SQL ステートメント
SQL が複雑すぎて、クラスで提供されているメソッドを使用して SQL ステートメントを組み立てることができない場合があります。このとき、SQL ステートメントを直接渡す関数が必要になります。 SQL ステートメントを組み立てて実行し、情報を返します。現在、この関数も利用可能です
コードをコピー コードは次のとおりです:
$db->query('select username,password from tb_member');
$rs = $db->fetchAll();とても似ていませんか? pdo の本来の書き方は何ですか?
④複数のデータベース接続の作成をサポートします
オリジナルのものは単なるデータベースの操作方法なので、実装では2つの同一のファイルをコピーし、いくつかの変数を変更する必要があります。操作は非常に複雑です。 。この問題は現在解決されています。
コードをコピーする コードは次のとおりです:
$db_hoorayos_config = array(
'dsn'=>'mysql:host=localhost;dbname=hoorayos',
'name'=>'root',
'password' => 'やったー
);
$db = 新しい HRDB($db_hoorayos_config);
$db_hoorayos_config2 = array(
'dsn'=>'mysql:host=localhost;dbname=hoorayos2',
'name' => 'root',
'password'=>'hooray'
);
$db2 = new HRDB($db_hoorayos_config2)
このようにして、2 つのデータベース接続を同時に作成できます。データベースとデータベース間の相互作用。
以上が新機能のすべてであり、コード全体はそれほど多くありませんが、読んで理解することを歓迎します。以下は私が執筆時に書いたテストコードであり、誰もが学ぶことができるように提供されています。
コードをコピーする コードは次のとおりです:
require_once('global.php');
$db = new HRDB($db_hoorayos_config);