php – 使用PDO执行时间记录查询 – 自动完成功能无效

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – 使用PDO执行时间记录查询 – 自动完成功能无效脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试创建一个中间类,它将在数组中记录查询及其执行时间.一切都很好,它完美无缺.但是当我尝试访问中间类时,自动完成功能不起作用.如何让自动完成工作.我正在使用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类.
@cillosis,感谢您的评论.

这就是我写课的方式.我还没有粘贴完整的代码,因为它尚未完成.但我检查它的工作原理.我也可以记录我的查询.但是我不确定我是否能够记录执行时间.

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);
    }
}

脚本宝典总结

以上是脚本宝典为你收集整理的php – 使用PDO执行时间记录查询 – 自动完成功能无效全部内容,希望文章能够帮你解决php – 使用PDO执行时间记录查询 – 自动完成功能无效所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。