За последние 24 часа нас посетили 17960 программистов и 1650 роботов. Сейчас ищут 1669 программистов ...

PDO ошибки при работе класса

Тема в разделе "PHP и базы данных", создана пользователем biryukovm, 18 фев 2018.

  1. biryukovm

    biryukovm Активный пользователь

    С нами с:
    15 окт 2015
    Сообщения:
    54
    Симпатии:
    1
    Привет всем.

    Я как то давно занимался настройкой класса PDO и периодически у меня срабатывают ошибки которые я не могу проконтролировать и не совсем понимаю.

    Вот ошибки которые я получаю
    Код (Text):
    1.  
    2. Fatal error: Call to a member function prepare() on a non-object in /*****/pdo.php on line 33 (строку переделал под пост)
    3. Ошибка: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away
    4. Ошибка: SQLSTATE[08S01]: Communication link failure: 1053 Server shutdown in progress
    Вот образец моего класса
    PHP:
    1. define("CHARSET", "utf8");
    2.  
    3.  
    4.  
    5.  
    6. class Database{
    7.     private $host      = DB_HOST;
    8.     private $user      = DB_USER;
    9.     private $pass      = DB_PASS;
    10.     private $dbname    = DB_NAME;
    11.     private $charset    = CHARSET;
    12.     private $dbh;
    13.     public $error;
    14.     private $stmt;
    15.  
    16.     public function __construct(){
    17.         // Установить DSN
    18.         $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname . ';charset=' . $this->charset;
    19.         // Настройка параметров
    20.         $options = array(
    21.             PDO::ATTR_PERSISTENT         => true,
    22.             PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION
    23.             //PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
    24.         );
    25.         // Создает новый объект PDO
    26.         try{$this->dbh = new PDO($dsn, $this->user, $this->pass, $options);}
    27.         // Ловим ошибки
    28.         catch(PDOException $e){$this->error = $e->getMessage()."\r\n";}
    29.     }
    30.  
    31.     public function query($query){
    32.         $this->stmt = $this->dbh->prepare($query);
    33.     }
    34.  
    35.     public function bind($param, $value, $type = null){
    36.         try{
    37.         if (is_null($type)) {
    38.             switch (true) {
    39.                 case is_int($value):
    40.                     $type = PDO::PARAM_INT;
    41.                     break;
    42.                 case is_bool($value):
    43.                     $type = PDO::PARAM_BOOL;
    44.                     break;
    45.                 case is_null($value):
    46.                     $type = PDO::PARAM_NULL;
    47.                     break;
    48.                 default:
    49.                     $type = PDO::PARAM_STR;
    50.             }
    51.         }
    52.         $this->stmt->bindValue($param, $value, $type);
    53.         }catch(PDOException $e){$this->error = $e->getMessage()."\r\n";}
    54.     }
    55.  
    56.     public function execute(){//Запускает подготовленный запрос на выполнение
    57.         try{
    58.         return $this->stmt->execute();
    59.         }catch(PDOException $e){$this->error = $e->getMessage()."\r\n";}
    60.     }
    61.     public function resultset(){//Возвращает массив, содержащий все строки результирующего набора
    62.         try{
    63.         $this->execute();
    64.         return $this->stmt->fetchAll(PDO::FETCH_BOTH);
    65.         }catch(PDOException $e){$this->error = $e->getMessage()."\r\n";}
    66.     }
    67.     public function single(){//Извлечение следующей строки из результирующего набора
    68.         try{
    69.         $this->execute();
    70.         return $this->stmt->fetch(PDO::FETCH_BOTH);
    71.         }catch(PDOException $e){$this->error = $e->getMessage()."\r\n";}
    72.     }
    73.     public function rowCount(){//Возвращает количество строк, модифицированных последним SQL запросом
    74.         return $this->stmt->rowCount();
    75.     }
    76.     public function lastInsertId(){//возвращает последним добавленным идентификатором в виде строки
    77.         return $this->dbh->lastInsertId();
    78.     }
    79.     public function beginTransaction(){//начать транзакцию
    80.         return $this->dbh->beginTransaction();
    81.     }
    82.     public function endTransaction(){//Для завершения транзакции и зафиксировать изменения
    83.         return $this->dbh->commit();
    84.     }
    85.     public function cancelTransaction(){//Чтобы отменить транзакцию и выполнить откат изменений
    86.         return $this->dbh->rollBack();
    87.     }
    88.     public function debugDumpParams(){//Параметры , методы Дебютный Dump сбрасывает информацию , которая содержится в подготовленном заявлении.
    89.         return $this->stmt->debugDumpParams();
    90.     }
    91.     public function InsertId(){//Получаем ID транзакции записи INSERT
    92.         return $this->lastInsertId();
    93.     }
    94.  
    95. }

    Как их подправить ???
    И у PDO есть такое понимает как закрытые подключения ?
     
  2. ElisDN

    ElisDN Активный пользователь

    С нами с:
    13 фев 2018
    Сообщения:
    605
    Симпатии:
    130
    А без ATTR_PERSISTENT работает?
     
  3. biryukovm

    biryukovm Активный пользователь

    С нами с:
    15 окт 2015
    Сообщения:
    54
    Симпатии:
    1
    Да закомментировал работает.