Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP OOP高效的数据库读取减少_Php_Oop_Methods_Mysqli - Fatal编程技术网

PHP OOP高效的数据库读取减少

PHP OOP高效的数据库读取减少,php,oop,methods,mysqli,Php,Oop,Methods,Mysqli,六年前,我在没有任何经验的情况下开始了一个新的PHP OOP项目,所以我只是边做边做。无论如何,我注意到我相当强大的mySQL服务器有时太容易陷入困境,我想知道什么是限制某些db活动的最佳方法,当我想到这个时,作为一个例子 private $q_enghours; public function gEngHours() { if ( isset($this->q_enghours) ) { } else { $q = "SELECT q_eh FROM "

六年前,我在没有任何经验的情况下开始了一个新的PHP OOP项目,所以我只是边做边做。无论如何,我注意到我相当强大的mySQL服务器有时太容易陷入困境,我想知道什么是限制某些db活动的最佳方法,当我想到这个时,作为一个例子

private $q_enghours;
public function gEngHours() {
    if ( isset($this->q_enghours) ) {
    } else {
        $q = "SELECT q_eh FROM " . quQUOTES . " WHERE id = " . $this->id;
        if ($r = $this->_dblink->query($q)) {
            $row = $r->fetch_row();
            $r->free();
            $this->q_enghours = $row[0];
        }
        else {
            $this->q_enghours = 0;
        }
    }
    return $this->q_enghours;
}

这似乎可以有效地大大减少对数据库的必要读取。如果对象属性已填充,则无需访问数据库。注意,对于“getter”,几乎有24个类都具有相同的db访问例程。我只在一个地方实现了这个更改,我想知道是否有一个“最佳实践”,在我重新编写所有类之前,我可能错过了它。

我想说,这个问题是基于错误的前提

如果您想处理“容易陷入困境”的数据库,那么您必须挖掘特定原因,而不仅仅是猜测。这些你非常关心的琐碎读物,实际上不会有任何区别。您必须分析整个应用程序,并找到真正的原因。

如果要减少读取次数,请在对象创建时读取某个数据库记录并填充所有属性一次,使对象映射该记录。构造函数是为它而生的

作为补充说明,您确实需要一个好的数据库包装器,以减少每次数据库调用所需编写的代码量,因此,此代码可以按如下方式编写:

public function gEngHours() {
    if ( !isset($this->q_enghours) ) {
        $this->q_enghours = $this->db->getOne("SELECT q_eh FROM ?n WHERE id = ?", quQUOTES,  $this->id);
    }
    return $this->q_enghours;
}

其中getOne()方法完成了运行查询、获取行、从中获取第一个结果的所有工作,以及其他许多类似于正确的错误处理和确保查询安全的想法。

让我们从以下事实开始:您的代码100%对SQL注入开放(绑定变量,不要将它们粘贴到SQL!)。虽然这是一个有效点,这不适用于我问的问题。我在应用程序的另一个部分处理SQL注入,我不是DBA,所以我没有必要的知识来深入研究mySQL日志并找出我的根本原因。我已经调整了每个参数,我可以找到很好的信息。至于db包装器,我仍在进行完全重写。。只是为了消除已经编写的代码。是的,有几个地方我一次获取整个对象,但对于只需要关于对象的特定信息的地方,我使用这些类。