php – 使用PDO执行时间记录查询 – 自动完成功能无效
发布时间:2020-12-13 22:46:49 所属栏目:PHP教程 来源:网络整理
导读:我正在尝试创建一个中间类,它将在数组中记录查询及其执行时间.一切都很好,它完美无缺.但是当我尝试访问中间类时,自动完成功能不起作用.如何让自动完成工作.我正在使用Netbeans. 中级类名是Model. 从我的应用程序中,我有一个名为Users的类,它扩展了Model. cla
我正在尝试创建一个中间类,它将在数组中记录查询及其执行时间.一切都很好,它完美无缺.但是当我尝试访问中间类时,自动完成功能不起作用.如何让自动完成工作.我正在使用Netbeans.
中级类名是Model. 从我的应用程序中,我有一个名为Users的类,它扩展了Model. class Users extends Model { function __construct() { parent::__construct(); $stmt = $this->prepare('SELECT * FROM users WHERE id=? '); $stmt->bindValue(1,1); //$stmt-> auto-complete is unavailable $stmt->execute(); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); print_r($rows); //i get results } } 我的Model类看起来像这样. class Model extends PDO { public static $log = array(); private $query_cache = array(); public function __construct() { parent::__construct( "mysql:dbname=".MYSQL_DB.";host=".MYSQL_HOST,MYSQL_USER,MYSQL_PASSWORD ); } public function query($query) { $time = ""; $query = mysql_real_escape_string(preg_replace( '/s+/',' ',$query )); if (key_exists($query,$this->query_cache) && is_object($this->query_cache[$query])) { $result = $this->query_cache[$query]; } else { $start = microtime(true); $result = parent::query($query); $time = microtime(true) - $start; $this->query_cache[$query] = $result; Logger::$logText['DATABASE'][] = array( 'QUERY' => $query,'TIME' => number_format($time,4) ); } return $result; } /** * @return LoggedPDOStatement */ public function prepare($query) { return new LoggedPDOStatement(parent::prepare($query)); } } 我的LoggedPDOStatement看起来像这样. class LoggedPDOStatement { /** * The PDOStatement we decorate */ private $statement; public function __construct(PDOStatement $statement) { $this->statement = $statement; } /** * When execute is called record the time it takes and * then log the query * @return PDO result set */ public function execute() { $start = microtime(true); $result = $this->statement->execute(); $time = microtime(true) - $start; Model::$log[] = array( 'query' => '[PS] ' . $this->statement->queryString,'time' => round($time * 1000,3) ); return $result; } /** * Other than execute pass all other calls to the PDOStatement object * @param string $function_name * @param array $parameters arguments */ public function __call($function_name,$parameters) { return call_user_func_array( array($this->statement,$function_name),$parameters ); } } 他们有更好的方法吗? 解决方法
我已经修复了@cillosis和@Touki的建议
@Touki,我同意我不应该扩展PDO类. 这就是我写课的方式.我还没有粘贴完整的代码,因为它尚未完成.但我检查它的工作原理.我也可以记录我的查询.但是我不确定我是否能够记录执行时间. class Model { /** * The singleton instance * */ static private $PDOInstance; public function __construct($dsn="",$username = false,$password = false,$driver_options = false) { if (!self::$PDOInstance) { try { self::$PDOInstance = new PDO( "mysql:dbname=".MYSQL_DB.";host=".MYSQL_HOST,MYSQL_PASSWORD ); } catch (PDOException $e) { die("PDO CONNECTION ERROR: " . $e->getMessage() . "<br/>"); } } return self::$PDOInstance; } /** * Initiates a transaction * * @return bool */ public function beginTransaction() { return self::$PDOInstance->beginTransaction(); } public function prepare($statement,$driver_options = false) { //log the $statement if (!$driver_options) $driver_options = array(); return self::$PDOInstance->prepare($statement,$driver_options); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读