PDOは、クラスをカスタマイズせずに、PHPのデフォルト設定でデータベースを操作するために直接使用することができます。 , pdo 有効になっていないため、使用する前に php.ini で有効にする必要があります。
php の PDO サポートを有効にする必要があります。これは php5.1 以降でサポートされています
データベース接続シングルトンを実装するには、静的変数、静的インスタンス化メソッド、プライベート コンストラクター DPDO.php の 3 つの要素があります
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
クラス DPDO{ プライベート $DSN; プライベート $DBUser; プライベート $DBPwd; プライベート $longLink; プライベート $pdo; //直接インスタンス化を防ぐためのプライベートコンストラクター プライベート関数 __construct($dsn, $DBUser, $DBPwd, $longLink = false) { $this->DSN = $dsn; $this->DBUser = $DBUser; $this->DBPwd = $DBPwd; $this->longLink = $longLink; $this->connect(); } //クローン化を防ぐためのプライベート空クローン機能 プライベート関数 __clone(){} //静的インスタンス化関数は PDO オブジェクトを返します 静的パブリック関数インスタンス($dsn, $DBUser, $DBPwd, $longLink = false){ static $singleton = array();//インスタンス化されたオブジェクトの保存に使用される静的関数 $singIndex = md5($dsn . $DBUser . $DBPwd . $longLink); if (empty($singleton[$singIndex])) { $singleton[$singIndex] = 新しい自己($dsn, $DBUser, $DBPwd, $longLink = false); } return $singleton[$singIndex]->pdo; }
プライベート関数 connect(){ 試してください{ if($this->longLink){ $this->pdo = 新しい PDO($this->DSN, $this->DBUser, $this->DBPwd, array(PDO::ATTR_PERSISTENT => true)); }その他{ $this->pdo = 新しい PDO($this->DSN, $this->DBUser, $this->DBPwd); } $this->pdo->query('SET NAMES UTF-8'); } catch(PDOException $e) { die('エラー:' . $e->getMessage() . ' } } } |
フィールド マッピングの処理に使用されます。PDO フィールド マッピングを使用すると、SQL インジェクションを効果的に回避できます。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
//フィールド連想配列処理。主にデータの書き込みと更新、同じ and or or による条件のクエリ、SQL ステートメントとマップされたフィールドの配列の生成に使用されます パブリック関数 FDFields($data, $link = ',', $judge = array(), $aliasTable = ''){ $sql = ''; $mapData = array(); foreach($data as $key => $value) { $mapIndex = ':' . ($link != ',' ? 'c' : '') . $aliasTable . $sql .= ' ' . ($aliasTable ? $aliasTable . '.' : '') . ''key . ' ' . ($judge[$key] : ' =') . $mapIndex; $mapData[$mapIndex] = $value; } $sql = トリム($sql, $link); 配列を返す($sql, $mapData); } //単一フィールドの処理を処理するために使用されます パブリック関数 FDField($field, $value, $judge = '=', $preMap = 'cn', $aliasTable = '') { $mapIndex = ':' . $aliasTable . $sql = ' ' . ($aliasTable . '.' : '') . $field . $mapIndex;$mapData[$mapIndex] = $value; 配列を返す($sql, $mapData); } //Gang メソッドを使用すると、クエリ条件と対応するデータ配列を簡単に生成できます パブリック関数 FDCondition($condition, $mapData) { if(is_string($condition)) { $where = $condition; } else if (is_array($condition)) { if($condition['str']) { if (is_string($condition['str'])) { $where = $condition['str']; } 他 { false を返す; } } if(is_array($condition['data'])) { $link = $condition['link'] ? $condition['link'] : 'そして'; list($conSql, $mapConData) = $this->FDFields($condition['data'], $link, $condition['judge']); if ($conSql) { $where .= ($where ? ' ' . $link : '') . $conSql; $mapData = array_merge($mapData, $mapConData); } } } 配列を返す($where, $mapData); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
パブリック関数 fetch($sql, $searchData = array(), $dataMode = PDO::FETCH_ASSOC, $preType = array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)) { if ($sql) { $sql .= '制限 1'; $pdoStatement = $this->pdo->prepare($sql, $preType); $pdoStatement->execute($searchData); return $data = $pdoStatement->fetch($dataMode); } 他 { false を返す; } }
パブリック関数 fetchAll($sql, $searchData = array(), $limit = array(0, 10), $dataMode = PDO::FETCH_ASSOC, $preType = array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY) ){ if ($sql) { $sql .= ' 制限 ' . (int) $limit[0] . ',' . (intval($limit[1]) > 0 ? intval($limit[1]) : 10); $pdoStatement = $this->pdo->prepare($sql, $preType);$pdoStatement->execute($searchData); return $data = $pdoStatement->fetchAll($dataMode); } 他 { false を返す; } }
パブリック関数 insert($tableName, $data, $returnInsertId = false, $replace = false) { if(!empty($tableName) && count($data) > 0){ $sql = $replace ? 'REPLACE INTO' : 'INSERT INTO'; list($setSql, $mapData) = $this->FDFields($data); $sql .= $tableName . $setSql; $pdoStatement = $this->pdo->prepare($sql, array(PDO::ATTR_CURSOR =>PDO::CURSOR_FWDONLY)); $execRet = $pdoStatement->execute($mapData); return $execRet ? ($returnInsertId ? $this->pdo->lastInsertId() : $execRet) : false; } 他 { false を返す; } }
パブリック関数 update($tableName, $data, $condition, $mapData = array(), $returnRowCount = true) { if(!empty($tableName) && count($data) > 0) { $sql = 'UPDATE' .$tableName . list($setSql, $mapSetData) = $this->FDFields($data); $sql .= $setSql; $mapData = array_merge($mapData, $mapSetData); list($where, $mapData) = $this->FDCondition($condition, $mapData); $sql .= $where ? ' WHERE ' : ''; $pdoStatement = $this->pdo->prepare($sql, array(PDO::ATTR_CURSOR =>PDO::CURSOR_FWDONLY)); $execRet = $pdoStatement->execute($mapData); return $execRet ? ($returnRowCount ? $pdoStatement->rowCount() : $execRet) : false; } 他 { false を返す; } }
パブリック関数 delete($tableName, $condition, $mapData = array()) { if(!empty($tableName) && $condition){ $sql = '$テーブル名から削除' . list($where, $mapData) = $this->FDCondition($condition, $mapData); $sql .= $where ? ' どこ ' 。 $where : ''; $pdoStatement = $this->pdo->prepare($sql, array(PDO::ATTR_CURSOR =>PDO::CURSOR_FWDONLY)); $execRet = $pdoStatement->execute($mapData); $execRet を返す; } } |
测试文件test.php
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
header("コンテンツタイプ: text/html; charset=utf-8"); define('APP_DIR', dirname(__FILE__));
if (function_exists('spl_autoload_register')) { spl_autoload_register('autoClass'); } 他 { 関数 __auto_load($className){ autoClass($className); } }
関数 autoClass($className){ 試してください{ require_once APP_DIR.'/class/'.$className.'.php'; } catch (例外 $e) { die('エラー:' . $e->getMessage() . ' } } $DB = 新しい DB(); //插入 $inData['a'] = ランド(1, 100); $inData['b'] = rand(1, 1000); $inData['c'] = rand(1,200) 。 「。」 。ランド(1,100); $ret = $DB->insert('a', $inData); 「插入」をエコーします。 ($ret ? '成功' : '失败') 。 ' //更新 $upConData['a'] = 100; $upConJudge['a'] = '<'; $upConData['b'] = 30; $upConJudge['b'] = '>'; list($upConStr, $mapUpConData) = $DB->FDField('b', 200, '<', 'gt'); $condition = 配列( 'str' => $upConStr、 'データ' => $upConData、 「裁判官」=> $upConJudge、 'リンク' => 「そして」 ); $upData['a'] = ランド(1, 10); $upData['b'] = 1; $upData['c'] = 1.00; $changeRows = $DB->update('a', $upData, $condition, $mapUpConData); echo '更新行数:' 。 (int) $changeRows 。 ' //删除 $delVal = ランド(1, 10); list($delCon, $mapDelCon) = $DB->FDField('a', $delVal); $delRet = $DB->delete('a', $delCon, $mapDelCon); echo '删除a=' 。 $delVal 。 ($delRet ? '成功' : '失败') 。 '
//查询 $data['a'] = '10'; $judge['a'] = '>'; $data['b'] = '400'; $judge['b'] = '<'; list($conSql, $mapConData) = $DB->FDFields($data, 'and', $judge); $mData = $DB->fetch('select * from a where ' . $conSql . ' order by `a` desc', $mapConData);
var_dump($mData); |
以上がこの記事の全内容ですが、皆さんに気に入っていただければ幸いです。