首页 > 代码库 > PDO扩展
PDO扩展
<?phpclass db extends PDO { private $error; private $sql; private $bind; private $errorCallbackFunction; private $errorMsgFormat; public function __construct($dsn, $user="", $passwd="") { $options = array( PDO::ATTR_PERSISTENT => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ); try { parent::__construct($dsn, $user, $passwd, $options); } catch (PDOException $e) { $this->error = $e->getMessage(); } } private function debug() { if(!empty($this->errorCallbackFunction)) { $error = array("Error" => $this->error); if(!empty($this->sql)) $error["SQL Statement"] = $this->sql; if(!empty($this->bind)) $error["Bind Parameters"] = trim(print_r($this->bind, true)); $backtrace = debug_backtrace(); if(!empty($backtrace)) { foreach($backtrace as $info) { if($info["file"] != __FILE__) $error["Backtrace"] = $info["file"] . " at line " . $info["line"]; } } $msg = ""; if($this->errorMsgFormat == "html") { if(!empty($error["Bind Parameters"])) $error["Bind Parameters"] = "<pre>" . $error["Bind Parameters"] . "</pre>"; $css = trim(file_get_contents(dirname(__FILE__) . "/error.css")); $msg .= ‘<style type="text/css">‘ . "\n" . $css . "\n</style>"; $msg .= "\n" . ‘<div class="db-error">‘ . "\n\t<h3>SQL Error</h3>"; foreach($error as $key => $val) $msg .= "\n\t<label>" . $key . ":</label>" . $val; $msg .= "\n\t</div>\n</div>"; } elseif($this->errorMsgFormat == "text") { $msg .= "SQL Error\n" . str_repeat("-", 50); foreach($error as $key => $val) $msg .= "\n\n$key:\n$val"; } $func = $this->errorCallbackFunction; $func($msg); } } public function delete($table, $where, $bind="") { $sql = "DELETE FROM " . $table . " WHERE " . $where . ";"; $this->run($sql, $bind); } private function filter($table, $info) { $driver = $this->getAttribute(PDO::ATTR_DRIVER_NAME); if($driver == ‘sqlite‘) { $sql = "PRAGMA table_info(‘" . $table . "‘);"; $key = "name"; } elseif($driver == ‘mysql‘) { $sql = "DESCRIBE " . $table . ";"; $key = "Field"; } else { $sql = "SELECT column_name FROM information_schema.columns WHERE table_name = ‘" . $table . "‘;"; $key = "column_name"; } if(false !== ($list = $this->run($sql))) { $fields = array(); foreach($list as $record) $fields[] = $record[$key]; return array_values(array_intersect($fields, array_keys($info))); } return array(); } private function cleanup($bind) { if(!is_array($bind)) { if(!empty($bind)) $bind = array($bind); else $bind = array(); } return $bind; } public function insert($table, $info) { $fields = $this->filter($table, $info); $sql = "INSERT INTO " . $table . " (" . implode($fields, ", ") . ") VALUES (:" . implode($fields, ", :") . ");"; $bind = array(); foreach($fields as $field) $bind[":$field"] = $info[$field]; return $this->run($sql, $bind); } public function run($sql, $bind="") { $this->sql = trim($sql); $this->bind = $this->cleanup($bind); $this->error = ""; try { $pdostmt = $this->prepare($this->sql); if($pdostmt->execute($this->bind) !== false) { if(preg_match("/^(" . implode("|", array("select", "describe", "pragma")) . ") /i", $this->sql)) return $pdostmt->fetchAll(PDO::FETCH_ASSOC); elseif(preg_match("/^(" . implode("|", array("delete", "insert", "update")) . ") /i", $this->sql)) return $pdostmt->rowCount(); } } catch (PDOException $e) { $this->error = $e->getMessage(); $this->debug(); return false; } } public function select($table, $where="", $bind="", $fields="*") { $sql = "SELECT " . $fields . " FROM " . $table; if(!empty($where)) $sql .= " WHERE " . $where; $sql .= ";"; return $this->run($sql, $bind); } public function setErrorCallbackFunction($errorCallbackFunction, $errorMsgFormat="html") { //Variable functions for won‘t work with language constructs such as echo and print, so these are replaced with print_r. if(in_array(strtolower($errorCallbackFunction), array("echo", "print"))) $errorCallbackFunction = "print_r"; if(function_exists($errorCallbackFunction)) { $this->errorCallbackFunction = $errorCallbackFunction; if(!in_array(strtolower($errorMsgFormat), array("html", "text"))) $errorMsgFormat = "html"; $this->errorMsgFormat = $errorMsgFormat; } } public function update($table, $info, $where, $bind="") { $fields = $this->filter($table, $info); $fieldSize = sizeof($fields); $sql = "UPDATE " . $table . " SET "; for($f = 0; $f < $fieldSize; ++$f) { if($f > 0) $sql .= ", "; $sql .= $fields[$f] . " = :update_" . $fields[$f]; } $sql .= " WHERE " . $where . ";"; $bind = $this->cleanup($bind); foreach($fields as $field) $bind[":update_$field"] = $info[$field]; return $this->run($sql, $bind); }} ?>
PDO扩展
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。