PHP准备好的语句导致多少次往返或DB命中?

时间:2015-04-21 04:32:46

标签: php mysqli

这可能是StackOverFlow的错误部分,但是我很好奇...我已经找了大约一个小时询问谷歌各种问题而且从未找到答案。我用Google搜索了......

“PHP准备好的往返次数”

和其他约20个“尝试”查找此信息。几周前我确实看到了一张小图表,其中有一些往返行程说要做一个简单的选择但是因为有时候我再也找不到那个网站了。

基本上,我的PHP非常简单。一个简单的......

  1. 数据库单例(读或写)
  2. 一次选择,更新,替换或插入SINGLE行
  3. 关闭stmt
  4. 在析构函数中,单例关闭数据库连接
  5. 我想我记得读过它的2次点击但是我想澄清一下。另外,我是OOP编程的新手,所以如果我的功能非常糟糕且不正确,请告诉我。我知道它有效,但有时候只是因为某些东西起作用并不意味着它是设计它的正确方法。

    谢谢!下面是我的PHP类中典型的1函数示例。

        # returns false on error, $numOfRows on success
    # $NUD just needs to be of type array - passed by REFERENCE
    public function FetchUserFromDB($username, &$NUD)
    {
        if (DEBUGMODE) MyDebug::DebugMsgs('DB.php--FetchUserFromDB--$username--<b>' . $username . '</b>');
        $query = 'SELECT ' . User::GetUserDBFields() . ' FROM UserDB WHERE username = ?'; // builds the SELECT and pulls in all fields from the User::GetUserDBFields function
    
        try {
            $stmt = $this->db->stmt_init(); // get the statement handle for prepared statements
            if ($stmt->prepare($query) === false) throw new Exception('DB.php--FetchUserFromDB--prepare--FAILED--' . $stmt->error, 1);
            if ($stmt->bind_param("s", $username) === false) throw new Exception('DB.php--FetchUserFromDB--bind_param--FAILED--' . $stmt->error, 1);
            if ($stmt->execute() === false) throw new Exception('DB.php--FetchUserFromDB--execute--FAILED--' . $stmt->error, 1);
            if ($stmt->store_result() === false) throw new Exception('DB.php--FetchUserFromDB--store_result--FAILED--' . $stmt->error, 1);
            if ($stmt->bind_result($NUD["user_id"], $NUD["username"], $NUD["company_name"], $NUD["f_name"], $NUD["l_name"], $NUD["street_num"], etc) === false) throw new Exception('DB.php--FetchUserFromDB--bind_result--FAILED--' . $stmt->error, 1);
    
            $numOfRows = $stmt->num_rows(); // store the number of rows
    
            if ($numOfRows > 0) $stmt->fetch(); // only bother to fetch if there are more than 0 rows
    
            if (DEBUGMODE) MyDebug::DebugMsgs('DB.php--FetchUserFromDB--fetch--$numOfRows=' . $numOfRows);
    
            $stmt->close();
    
            if (DEBUGMODE) MyDebug::DebugMsgs('DB.php--FetchUserFromDB--fetch--$NUD["username"]=<b>' . $NUD["username"] . '</b>');
            return $numOfRows;
        } catch (Exception $e) {
            $stmt->close();
            if (DEBUGMODE) MyDebug::DebugMsgs('DB.php--FetchUserFromDB--**********' . $e->getMessage());
            return false; // error
        }
    }
    

1 个答案:

答案 0 :(得分:0)

一次发送语句,一次发送bindvars并执行它......但是你可以将不同的bindvars发送到同一个语句(无需重新发送语句)以便再次执行它参数使得db跳数的计数稍微不那么有意义.....并且你只在执行点将绑定变量发送到db,而不是每个绑定var(在抽象层中缓冲) - Mark Ba​​ker 2几天前

我没有办法给予马克信用,因为他作为评论回答了这个问题。我让他来这里回答这个问题所以他会得到信用,但是在2天内没有回复,所以我想我会回答。如果管理员可以给他一个很棒的功劳!

顺便说一句 - 谢谢Mark!