web-dev-qa-db-fra.com

Comment vérifier si la connexion mysqli est ouverte avant de la fermer

Je vais utiliser mysqli_close($connection) pour fermer le $connection. Mais avant de fermer, je dois m'assurer que la connexion concernée est ouverte.

J'ai essayé

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

Mais ça ne marche pas. Toute solution?

16
Munib

Vieille question, mais peut aider quelqu'un d'autre. Cela vient de PHP.net .

Style orienté objet

<?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();
?>

Style procédural

<?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);
?>
27
user2060451

Alors que certains suggèrent de vérifier $connection->ping(), $connection->stat() ou mysqli_thread_id($connection), les trois lanceront: 'Couldn't fetch mysqli 'si la connexion a été fermée auparavant.

La solution qui a fonctionné pour moi a été:

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

PS: Vérifier seulement s'il s'agit d'un ressource pourrait suffire dans un contexte contrôlé.

4
Leopoldo Sanczyk

Si vous ouvrez une connexion, elle restera ouverte jusqu'à ce qu'elle soit explicitement fermée ou que le script se termine (sauf si les connexions persistantes sont activées). L'utilisation du code dont vous disposez devrait fonctionner.

Une option consiste à étendre la classe mysqli et à avoir une propriété de statut appelée $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;
    }
  }
}

Vérification de la $connected La propriété est un peu exagérée, mais garantira que la connexion est toujours ouverte.

3
Chris Bornhoft

Vérifiez les erreurs de connexion. mysqli_connect () renvoie toujours un objet MySQLi.

utilisez ceci:

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

Essaye ça:

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

}

Cela fermera la connexion que vous avez ouverte en utilisant un style orienté objet comme celui-ci:

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

C'est l'idée de base, mais si vous utilisez le style procédural, je suis sûr que vous pourrez personnaliser le code selon vos besoins.

0
Hazem_M