ホームページ >php教程 >php手册 >新しい PDO データベース操作 php バージョン (Mysql にのみ適用可能)

新しい PDO データベース操作 php バージョン (Mysql にのみ適用可能)

WBOY
WBOYオリジナル
2016-06-13 11:58:461167ブラウズ

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


/**
* 著者: 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['password']);
$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;
}

パブリック関数 query($sql){
$res = $this->pdo->query($sql);
if($res){
$this->res = $res;
}
}
public function exec($sql){
$res = $this->pdo->exec($sql);
if($res){
$this->res = $res;
}
}
public function 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 $ モードの戻り値の型
* 0 複数のレコードを返します
* 1 単一のレコードを返します
* 2 行数を返します
* 文字列/配列 $table データベース テーブル、2値渡しモード
* 通常 パターン:
* 'tb_member, tb_money'
* 配列パターン:
* array('tb_member', 'tb_money')
* string/array $fieldsクエリ対象のデータベース フィールド。空にすることができます。デフォルトはすべてを検索します。2 つの値渡しモード
* 通常モード:
* 'ユーザー名、パスワード'
* 配列モード:
* array('username', 'password')
* string/array $sqlwhere クエリ条件、空許可、2 つの値渡しモード
* 通常モード:
* '、type = 1、ユーザー名は " %os%"'
* 配列モード :
* array('type = 1', 'username like "%os%"')
* string $orderby sort、デフォルトは 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 (未定) $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 "$table から $fields を選択します。ここで 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 $ モード戻り型
* 0 戻り情報なし
* 1 実行エントリ数を返します
* 2 最後に挿入されたレコードの ID を返します
* string/array $テーブル データベース テーブル、2 つの値渡しモード
* 通常モード:
* 'tb_member, tb_money'
* 配列モード:
* array('tb_member', 'tb_money')
*文字列/配列 挿入される $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 $テーブルセット$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 $ モード戻り型
* 0 戻り情報なし
* 1 実行エントリ数を返す
* string $table データベース テーブル、2 つの値渡しモード
* 通常モード:
* 'tb_member, tb_money '
* 配列モード:
* array('tb_member', 'tb_money')
* 更新する必要がある文字列/配列 $set フィールドと内容、2 つの値-passing モード
* 通常モード:
* 'username = "test"、type = 1、dt = now()'
* 配列モード:
* array('username = "test" ', 'type = 1', 'dt = now()')
* string/array $sqlwhere 条件を変更し、空の 2 つの値渡しモードを許可
* 通常モード:
* ' および type = 1 およびユーザー名 like "%os%"'
* 配列モード:
* array('type = 1', 'ユーザー名 like "%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 $テーブルセット $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 $ モード戻り型
* 0 戻り情報なし
* 1 実行エントリ数を返す
* 文字列 $table データベーステーブル
* 文字列/配列 $sqlwhere 削除条件、空許可される 2 つの値渡しモード
* 通常モード:
* 'および type = 1 および "%os%" のようなユーザー名'
* 配列モード:
* array('type = 1' , 'ユーザー名は "%os %" のようなもの')
*/
public function delete($debug, $mode, $table, $sqlwhere=""){
//パラメータ处処理
if(is_array($sqlwhere)){
$sqlwhere = ' and '.implode(' and ', $sqlwhere);
}
//データ库操作
if($debug === 0){
if($mode === 1){
$this->exec("から削除$table where 1=1 $sqlwhere");
$return = $this->res;
}else{
$this->query("delete from $table where 1=1 $sqlwhere");
$return = NULL;
}
return $return;
}else{
echo "$table where 1=1 $sqlwhere から削除";
if($debug === 2){
終了;
}
}
}
}


其他使用上,和前的位相差不大,目的是為方便移植。重写着重处処理了几个问题:

①挿入语句太复杂,フィールド有値对应容易出现误差

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



复制代码代码如下:tb_member (username, type, dt) 値 ('test', 1, now()) に挿入します

転送モードでは、フィールドと値のパラメータは別々に転送されますが、両方のパラメータの転送の順序が一致している必要があります。これは、順序の乱れや特定のパラメータの漏洩を引き起こす可能性があります。 > 今回既得问题修正,採用mysql独自的挿入语法,同样是上面那機能,就可换成这样的写法





复制代

代暗号次:insert into tb_member set username = "test", type = 1, lastlogindt = now() 就像更新一样、完遂然。

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


比如这样一句sql




复制代

代码如下: delete from tb_member where 1=1 and tbid = 1 and username = "hooray" 在原先调使用方法的時候,需要手動拼装好処条件,这样操作的本很高,现在完全可用种形式


复制代码

代码如下: $where = array( 'tbid = 1',

'ユーザー名 = "やったー"'

);
$db->delete(1, 0, 'tb_member', $where);


さらに多くの条件もまた、誤った思考回路に遭遇しない。 🎜>

复制代码

代码如下:


$set = array('username = "123"', 'type = 1', 'lastlogindt = now()');
$where = array('tbid = 1'); 🎜>$db->update(1, 0, 'tb_member', $set, $where);

③ カスタマイズ可能な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'=>'hooray'
); new HRDB( $db_hoorayos_config);

$db_hoorayos_config2 = array(
'dsn'=>'mysql:host=localhost;dbname=hoorayos2',
'name'=> ',
'password'=>'hooray'
);
$db2 = new HRDB($db_hoorayos_config2);


このようにして、2 つのデータベース接続が可能になります。データベース間の相互作用の処理を容易にするために、同時に作成されます。


以上が新機能のすべてであり、コード全体はそれほど多くありません。読んで理解することを歓迎します。以下は私が執筆時に書いたテストコードであり、皆様の便宜のためにも提供されています。



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

require_once('global.php'); require_once(' inc/setting.inc.php');


$db = new HRDB($db_hoorayos_config);

echo '


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

echo '
insert test
';
echo '通常モード、直接文字列転送
$db->insert(1, 0, 'tb_member', 'username = "test", type = 1, lastlogindt = now()') と入力します。
echo '< ; br>配列モードでは、配列を渡すことができます
';
$set = array('username = "test"', 'type = 1', 'lastlogindt = now()'); $db->insert(1, 0, 'tb_member', $set);

echo '


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

echo '
delete test
';
echo '$db->delete(1, 0, 'tb_member', 'and tbid = 1 and username = "hooray"');
echo '
配列モードでは、配列を渡すことができます。 br>';
$where = array(
'tbid = 1',
'ユーザー名 = "hooray"'
); 'tb_member', $where);

echo '
custom sql
';
$db->query(' ユーザー名を選択, tb_member からのパスワード');
$db->fetchAll();

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