2013-08-03 4 views
0
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);  
      } 
     } 
    } 

Я видел этот код сегодня и очень запутался. Похоже, он пытается обработать простой запрос, прежде чем делать фактический запрос.PHP PDO - проверка соединения перед выполнением запроса?

Почему он проверяет, что соединение все еще открыто?

Я думал, что PDO уничтожает это соединение при завершении выполнения скрипта автоматически? Правильно ли проверить, открыто ли оно или закрыто?

ответ

0

В нем используется форма lazy loading.

В первый раз, когда запрос выполняется через этот класс/функцию, соединение с базой данных еще не установлено. Это цель этой проверки, так что потребитель (вы) не должен об этом думать.

Соединение затем сохраняется в элементе класса $this->db для последующего повторного использования при повторном вызове этого метода в ходе вашего сценария (и да, это соединение будет оставаться открытым до тех пор, пока скрипт не закончится - если он не закрыт явно заранее, конечно).

Для информации эта проверка немного неэффективна. Простого $this->db->query('SELECT 1') было бы достаточно, без необходимости читать таблицу вообще.

+3

Было бы еще более эффективно просто запускать запрос, который предположительно будет запущен вместо фиктивного. – Vatev

+0

Совершенно верно: o) – RandomSeed