Подтвердить что ты не робот

Как проверить, открыто ли соединение mysqli до его закрытия

Я собираюсь использовать mysqli_close($connection), чтобы закрыть $connection. Но перед закрытием мне нужно убедиться, что соответствующее соединение открыто.

Я пробовал

if($connection)
{
  mysqli_close($connection);
}

Но он не работает. Любое решение?

4b9b3361

Ответ 1

Старый вопрос, но может помочь кому-то другому. Это от PHP.net.

Объектно-ориентированный стиль

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}

/* check if server is alive */
if ($mysqli->ping()) {
    printf ("Our connection is ok!\n");
} else {
    printf ("Error: %s\n", $mysqli->error);
}

/* close connection */
$mysqli->close();
?>

Процедурный стиль

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

/* check if server is alive */
if (mysqli_ping($link)) {
    printf ("Our connection is ok!\n");
} else {
    printf ("Error: %s\n", mysqli_error($link));
}

/* close connection */
mysqli_close($link);
?>

Ответ 2

Если вы откроете соединение, оно останется открытым до тех пор, пока оно явно не будет закрыто, или конец script (если только постоянные подключения не включены). Использование кода, который вы должны работать.

Один из вариантов заключается в расширении класса mysqli и наличии свойства status $connected:

class CustomMysqli {
  public $connected;

  public function __construct($host, $username, $password, $dbname) { // db info
    $conn = new mysqli($host, $username, $password, $dbname);

    if (!$conn->connect_errno) {
      $this->connected = true;
    }

    return $conn;
  }

  public function close($conn) {
    if ($this->connected) {
      $conn->close();
      $this->connected = false;
    }
  }
}

Проверка свойства $connected немного завышена, но будет гарантировать, что соединение все еще открыто.

Ответ 3

В то время как некоторые предлагают проверить $connection->ping(), $connection->stat() или mysqli_thread_id($connection), три будут бросать: 'Couldn't fetch mysqli', если соединение было закрыто раньше.

Решение, которое сработало для меня, было:

if(is_resource($connection) && get_resource_type($connection)==='mysql link'){
    $connection->close(); //Object oriented style
    //mysqli_close($connection); //Procedural style 
}

PS: Проверка только в том случае, если resource может быть достаточно в контролируемом контексте.

Ответ 4

Попробуйте следующее:

function close_connection(){
    $thread = $mysqli->thread_id;
    $mysqli->close();
    $mysqli->kill($thread);

}

Это закрывает соединение, которое вы открыли с помощью объектно-ориентированного стиля следующим образом:

$mysqli = new mysqli($db_server, $db_username, $db_password, $db_name);

Это основная идея, но если вы используете процедурный стиль, я уверен, что вы сможете настраивать код по мере необходимости.

Ответ 5

Проверьте ошибки подключения. mysqli_connect() всегда возвращает объект MySQLi.

используйте это:

$mysqli_connection = new MySQLi('localhost', 'user', 'pass', 'db');
if ($mysqli_connection->connect_error) {
   echo "Not connected, error: " . $mysqli_connection->connect_error;
}
else
{
   echo "Connected.";
}

Ответ 6

Просто не закрывай. Это было бы лучшим решением.