rvller
@rvller

Lost connection to MySQL server during query

Гуру PHP, подскажите почему так.

Есть класс, в котором есть статический метод для коннекта к БД:
class DB
{
    static function init()
    {
        // blah-blah-blah

        $db = new mysqli($host, $user, $pass, $bd_name);
        if (mysqli_connect_errno()) {
            echo("Подключение к серверу MySQL невозможно. Код ошибки: ".mysqli_connect_error()."\n");
            exit;
        }
        return $db;
    }
}


И есть метод, который этим пользуется:

function add_prof() {
    
    $name = trim($_POST['name']);
    
    $q = DB::init()->prepare(DB::SQL_ADD_PROF);
    $q->bind_param('s', $name);

    $q->execute();
    echo "err".$q->error;
    $q->close();

}


При такой записи: $q = DB::init()->prepare(DB::SQL_ADD_PROF);
На строке $q->bind_param('s', $name); падает «Lost connection to MySQL server during query»

Но если написать так:
$db = DB::init()
$q =$db->prepare(DB::SQL_ADD_PROF);


То всё работает.
PHP 5.3.3
  • Вопрос задан
  • 4882 просмотра
Решения вопроса 1
cutwater
@cutwater
Дело в том что локальная переменная $db, которую Вы возвращаете из функции после вызова $prepare уничтожается, соответственно закрывается соединение с MySQL.
Во втором примере Вы продлеваете время жизни присвоив результат DB::init и таким образом у Вас соединение поддерживается до тех пор пока жива $db.

Это «простое объяснение», для более глубокого понимания читать о счетчиках ссылок, механизмах сборки мусора в PHP
php.net/manual/en/features.gc.refcounting-basics.php
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы