ホームページ  >  記事  >  バックエンド開発  >  新しい PDO データベース操作 php バージョン (Mysql にのみ適用)_PHP チュートリアル

新しい PDO データベース操作 php バージョン (Mysql にのみ適用)_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:17:01688ブラウズ

コードをコピーします コードは次のとおりです:

/**
* 著者: Hu Rui
* 日付: 2012/07/21
* 電子メール: hooray0905@foxmail.com
*/

class HRDB{
protected $pdo;
保護された $res;
保護された $config;

/*构造関数*/
function __construct($config){
$this->Config = $config;
$this->connect();
}

/*数据库连接*/
public function connect(){
$this->pdo = new PDO($this->Config['dsn'], $this->Config['name' ], $this->Config['パスワード']);
$this->pdo->query('set names utf8;');
//把握結果順序列化成stdClass
//$this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
//自己写代码捕获Exception
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}

/*数据库关闭*/
public function 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;
}
}
public function fetchAll(){
return $this->res->fetchAll();
}
パブリック関数 fetch(){
return $this->res->fetch();
}
パブリック関数 fetchColumn(){
return $this->res->fetchColumn();
}
public function lastInsertId(){
return $this->res->lastInsertId();
}

/**
* パラメータの説明
* int $debug デバッグを有効にするかどうか、有効にするとSQL文が出力されます
* 0 無効にする
* 1 有効にする
* 2 プログラムを有効にして終了する
* int $mode 戻り値の型
* 0 Return複数のレコード
* 1 単一のレコードを返します
* 2 行数を返します
* 文字列/配列 $table データベーステーブル、2 つの値渡しモード
* 通常モード:
* 'tb_member, tb_money'
* 配列モード:
* array('tb_member', 'tb_money')
* string/array $fields クエリ対象のデータベース フィールド。空にすることができます。デフォルトはすべてを検索します。2 つの値渡しモード
* 通常モード:
* 'username,パスワード'
* 配列モード:
* array('username', 'password')
* string/array $sqlwhere クエリ条件、空許可、2 つの値渡しモード
* 通常モード:
* 'and type = 1 および"%os%" のようなユーザー名'
* 配列モード:
* array('type = 1', '%os%" のようなユーザー名')
* string $orderby 並べ替え、デフォルトは ID 逆順です
*/
パブリック関数 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();
}else if($mode === 1){
$this->query("select $fields from $table where 1=1 $sqlwhere order by $orderby");
$return = $this->fetch();
}else{
$this->query("select $fields from $table where 1=1 $sqlwhere order by $orderby");
$return = $this->fetchAll();
}
return $return;
}else{
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 "$table から $fields を選択します。ここで 1=1 $sqlwhere order by $orderby";
}
if($debug === 2){
終了;
}
}
}

/**
* パラメータの説明
* int $debug デバッグを有効にするかどうか、有効にするとSQL文が出力されます
* 0 無効です
* 1 有効になります
* 2 プログラムを開いて終了します
* int $mode 戻り値の型
* 0戻り情報なし
* 1 実行エントリの数を返します
* 2 最後に挿入されたレコードの ID を返します
* string/array $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()')
*/
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("insert into $table set $set");
$return = $this->lastInsertId();
}else if($mode === 1){
$this->exec("$table set $set に挿入");
$return = $this->res;
}else{
$this->query("$table set $set に挿入");
$return = NULL;
}
return $return;
}else{
echo "$table set $set に挿入";
if($debug === 2){
終了;
}
}
}

/**
* パラメータの説明
* int $debug デバッグを有効にするかどうか、有効にするとSQL文が出力されます
* 0 無効にする
* 1 有効にする
* 2 プログラムを有効にして終了する
* int $mode 戻り値の型
* 0 No戻り情報
* 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 つの値渡しモードを許可します
* Normalモード:
* 'および type = 1 および "%os%" のようなユーザー名'
* 配列モード:
* array('type = 1', '"%os%" のようなユーザー名')
*/
public function update($debug, $mode, $table, $set, $sqlwhere=""){
//パラメータ处理
if(is_array( $table)){
$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 つの値渡しモード
* 通常モード:
* 'and type = 1 およびユーザー名 like "%os%" '
* 配列モード:
* array('type = 1', 'ユーザー名 like "%os%"')
*/
public function delete($debug, $mode, $table, $sqlwhere=""){
//パラメータ处処理
if(is_array($sqlwhere) ){
$sqlwhere = ' および '.implode(' および ', $sqlwhere);
}
//データベース库操作
if($debug === 0){
if($mode === 1){
$this->exec("1=1 $sqlwhere の $table から削除") ;
$return = $this->res;
}else{
$this->query("1=1 $sqlwhere の $table から削除");
$return = NULL;
}
return $return;
}else{
echo "$table where 1=1 $sqlwhere から削除";
if($debug === 2){
終了;
}
}
}
}

その使用上、および前の相差不大、目的就是方便移植。フィールド与値应容易出现误差

私们看下最常见的一句sql插入语句




复制代码
代码如下: tb_member (username, type, dt) 値に挿入('テスト', 1, now()) 転送モードでは、fields と value パラメータは別々に転送されますが、両方のパラメータの転送の順序は一致しています。これは順序の乱れや特定のパラメータの漏洩を引き起こしやすいです。次は、mysql 独自の挿入法を採用し、この機能を使用してこの書き込み法を作成できます」 test", type = 1, lastlogindt = now()
像更新一样、一目了然。

② 一部のパラメータは数組の代わりに使用できます

例えばこのように一SQL

复制代詞 代码如下:
delete from tb_member where 1=1 and tbid = 1 and username = "hooray"

在原先调用方法的時候,需要手動拼装好場所条件,这样操作的本很高,现在完全可用この形式



复制代码

代码如下:
$where = array( 'tbid = 1', 'username = "hooray"'
);
$db->delete(1, 0, 'tb_member', $where);


どんなに条件があったとしても、思考を混乱させることはありません。同様に、where パラメーターだけでなく、更新のセットもこの形式にすることができます (詳細は完全なソース コードを参照してください)

コードをコピーします コードは次のとおりです:

$set = array ('ユーザー名 = "123 "', 'タイプ = 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'); >fetchAll() ;

元の pdo の書き方とよく似ていますか?

④複数のデータベース接続の作成をサポート

元のメソッドは単なるデータベースの操作メソッドであるため、実装では、2つの同一のファイルをコピーし、いくつかの変数を変更する必要があります。操作は非常に複雑です。 。この問題は現在解決されています。


コードをコピーします コードは次のとおりです:
$db_hoorayos_config = array(
'dsn'=>'mysql:host=localhost;dbname=hoorayos',
'name'=> 'root',
'パスワード'=>'hoorayos'
);
$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);

echo '
select test
';
echo '通常モード、
に文字列を直接渡します'; -> ;select(1, 0, 'tb_member', 'ユーザー名, パスワード', 'and type = 1 and username like "%os%"');
echo '
配列モードで渡すことができます。 array$fields = array('username', 'password');
$where = array('type = 1', 'username like "%os%"'); -> select(1, 0, 'tb_member', $fields, $where);

echo '
挿入テスト
';
echo '通常モード,直接文字列
'; で渡される文字列
$db->insert(1, 0, 'tb_member', 'username = "test", type = 1, lastlogindt = now()'); br> ;配列モードでは、配列を渡すことができます
';
$set = array('username = "test"', 'type = 1', 'lastlogindt = now()'); ;insert (1, 0, 'tb_member', $set);

echo '
更新テスト
'
echo '通常モード、直接文字列入力$db->update(1, 0, 'tb_member', 'username = "123", type = 1, lastlogindt = now()', 'and tbid = 7'); br>配列モードでは、配列を渡すことができます
';
$set = array('username = "123"', 'type = 1', 'lastlogindt = now()'); ('tbid = 1');
$db->update(1, 0, 'tb_member', $set, $where);

echo '
テストを削除';
echo '通常モード、文字列を直接渡します
';
$db->delete(1, 0, 'tb_member', 'and tbid = 1 and username = "hooray "') ;
echo '
配列モードで渡すことができます
';
$where = array(
'tbid = 1',
'username = "hooray"'
); >delete(1, 0, 'tb_member', $where);

echo '
カスタムSQL
';
$db->クエリtb_member からのユーザー名、パスワード
$rs = $db->fetchAll();

$db->close();
作者:胡一瑞丶

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/325810.html技術記事次のようにコードをコピーします。 /*** 著者: Hu Rui * 日付: 2012/07/21 * 電子メール: hooray0905@foxmail.com*/ class HRDB{ protected $pdo; protected $config; /*Constructor...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。