2017-03-03 21 views
0

這似乎是一個常見問題,我讀了很多關於它試圖使用'ini_set'來改變超時,並仍然得到這個錯誤後,只有5秒。下面是我的代碼示例,以顯示類之間的流程。PDO :: __構造():MySQL服務器已經消失

我最困惑的是它在5秒後(甚至在刷新頁面後)拋出這個警告,但它仍然從數據庫中檢索數據。

require('../cfg/config.php'); 

class Process { 

    /** 
    * @var PDO 
    */ 
    private $conn = null; 
    /** 
    * @var PDOException 
    */ 
    public $error = null; 
    private $host = DB_SERVER; 
    private $user = DB_USER; 
    private $pass = DB_PASS; 
    private $db = DB_NAME; 

    public function __construct() { 
     ini_set('mysql.connect_timeout', 300); 
     ini_set('default_socket_timeout', 300); 
     $this->connect(); 
    } 

    private function connect() { 

     $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->db; 
     $options = [ 
      PDO::ATTR_PERSISTENT => true, 
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 
     ]; 
     try { 
      $this->conn = new PDO($dsn, $this->user, $this->pass, $options); 
     } catch(PDOException $e) { 
      $this->error = $e->getMessage(); 
     } 

     return $this->conn; 
    } 

    public function query($sql, $params = null) { 

     preg_match('/SELECT/', $sql) ? $select = true : $select = false; 

     $connect = $this->conn->getAttribute(PDO::ATTR_CONNECTION_STATUS); 

     echo "CONNECTION STATUS::: " . $connect; 

     if($this->error == null) { 

      $query = $this->conn->prepare($sql); 
      $query->execute($params); 

      $query ? (!$select ? $results = true : $results = $query->fetchAll(PDO::FETCH_ASSOC)) 
       : $results = false; 
     } else { 
      $results = $this->error; 
     } 

     return $results; 
    } 


} 

class Arrays { 
    public $family = []; 
    /** 
    * @var \Process 
    */ 
    private $db; 

    public function __construct() { 

     $this->db = new Process(); 

    } 
    public function setFamily() { 
     $a = []; 

     $sql = "SELECT familyNick, familyName FROM budget.family ORDER BY familyOrder"; 
     $query = $this->db->query($sql); 

     if($query != false && is_array($query)) { 
      foreach($query as $k => $v) { 
       $a[$v['familyNick']] = $v['familyName']; 
      } 
     } 

     $this->family = $a; 
    } 
    /** 
    * @return array 
    */ 
    public function getFamily() { 

     if(empty($this->family) || !isset($this->family)) { 
      $this->setFamily(); 
     } 

     return $this->family; 
    } 

} 

class Options { 

    public $family = []; 

    /** 
    * @var \Arrays 
    */ 
    private $arrays; 

    public function __construct() { 
     $this->arrays = new Arrays(); 
    } 

    public function setFamily() { 

     $this->family = $this->arrays->getFamily(); 
    } 
    public function getFamilyOptions() { 

     if(empty($this->family)) { 
      $this->setFamily(); 
     } 

     $options = []; 

     foreach($this->family as $famNick => $famName) { 
      $options[] = "<option class='family' value='$famNick'>" . $famName . "</option>"; 
     } 

     return $options; 

    } 


} 


$test = new Options(); 

$family = $test->getFamilyOptions(); 

var_dump($family); 

我敢肯定有不同的設計缺陷這個代碼。我現在只關心PDO警告。

+0

也許這有助於:http://stackoverflow.com/questions/2232150/pdo-mysql-server-has-gone-away – Yolo

+0

仍然遇到同樣的問題。我試過在連接方法中設置$ conn爲null。我已經從__construct中取出了連接方法。我在查詢後將conn變量設置爲null,然後我試圖在查詢後取消設置conn變量。仍然得到相同的結果。想法???? –

回答

0

什麼,我試圖完成從簡單的選項陣列移除

ATTR_PERSISTENT => true 

的伎倆!