ホームページ >php教程 >PHP开发 >新しい PDO データベース操作クラスの php バージョン

新しい PDO データベース操作クラスの php バージョン

高洛峰
高洛峰オリジナル
2016-12-02 13:55:561131ブラウズ

コードをコピーする コードは次のとおりです。

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); select test


';
echo '通常モード、文字列を直接渡します
'; $rs = $db->select(1, 0) 、'tb_member'、'ユーザー名、パスワード'、'およびタイプ = 1 およびユーザー名は "%os%" のようになります');
echo '
配列モードでは、配列を渡すことができます
';フィールド = array('ユーザー名', 'パスワード');
$where = array('type = 1', 'ユーザー名は "%os%" のような');
$rs = $db->select(1, 0) , ' tb_member', $fields, $where);

echo '
insert test
';
echo '通常モードでは、文字列を
に直接渡します。 ';
$db->insert(1, 0, 'tb_member', 'username = "test", type = 1, lastlogindt = now()');
echo '
配列モードを渡すことができます配列内
';$set = array('username = "test"', 'type = 1', 'lastlogindt = now()');
$db->insert(1, 0, 'tb_member', $set); echo '
update test
';
echo '通常モード、
に文字列を直接渡します'; 'tb_member', 'username = "123", type = 1, lastlogindt = now()', 'and tbid = 7');
echo '
配列モードで渡すことができます
;
$set = array('username = "123"', 'lastlogindt = now()');
$db-> (1, 0, 'tb_member', $set, $where);

echo '
delete test
';
echo '通常モード、直接文字を渡しますstring in
';
$db->delete(1, 0, 'tb_member', 'and tbid = 1 and username = "hooray"');
echo '
配列モード、利用可能配列
';
$where = array(
'tbid = 1',
'username = "hooray"'
);
$db->delete(1, 0, 'tb_member', $ where) ;

echo '


カスタム SQL
';
$db->query('tb_member からユーザー名、パスワードを選択'); >fetchAll();
var_dump($rs);

$db->close();
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。