PHP PDO - 在进行查询之前测试连接?

时间:2013-08-03 15:35:44

标签: mysql pdo

   public function smart_query($query, $options = null, $bindoptions = null)
    {  

      // Code to Reconnect incase of timeout
      try {
           $this->db->query('SELECT * FROM templates');
          }
      catch (PDOException $e) 
          {  
            echo $e;

            $pdooptions = array(
            PDO::ATTR_PERSISTENT    => true,
            PDO::ATTR_ERRMODE       => PDO::ERRMODE_EXCEPTION
            );

            $this->db = new PDO("mysql:host=localhost;dbname=$this->database", "$this->username", "$this->password", $pdooptions);
          }

      $this->statement = $this->db->prepare($query);

      if($bindoptions != null)
        {
          $this->bind($bindoptions);
        }

      $this->execute();

      if($options != null)
       {
         // Return Single Row
         if($options['rows'] == 1)
          {
           return $this->statement->fetch(PDO::FETCH_ASSOC);
          }

         // Return Multiple Rows
         elseif($options['rows'] != 1)
          {
           return $this->statement->fetchAll(PDO::FETCH_ASSOC);      
          } 
       }
    }

我今天看到了这段代码,真的很困惑。 在进行实际查询之前,他似乎正在尝试处理一个简单的查询。

他为什么要检查连接是否仍然打开?

我认为PDO只会在脚本自动完成执行后破坏它的连接? 检查它是打开还是关闭是否正确?

1 个答案:

答案 0 :(得分:0)

这实现了lazy loading

的形式

第一次通过此类/函数执行查询时,可能尚未建立数据库连接。这是此检查的目的,因此消费者(您)不必考虑它。

然后将连接存储在$this->db类成员中,以便在脚本过程中再次调用此方法时将来重用(是的,此连接将保持打开状态直到脚本结束 - 除非它当然,事先明确表示。

有关信息,此检查效率稍低。一个简单的$this->db->query('SELECT 1')就足够了,根本不需要读表。