fermeture de connexion mysql_close()

Petit nouveau ! | 1 Messages

08 mai 2007, 12:46

Bonjour,
:( J'ai une (petite) application avec php mysql qui marche bien mais qui plante de temps en temps mon site avec le message Service unavailable sur une page blanche. Ce phénomène se produit assez souvent, dure de quelques secondes à plus d'une minute. Pendant cette période, mon site est out.
J'arrive à reproduire le problème à moi tout seul, en cliquant rapidement sur les pages du genre mapage.php?id=125 qui sollicite la base de donnée. Mon hébergeur mutualisé (payant) me dit que je ne ferme pas mes connections.
Pour ma part, je ne vois pas ce qui cloche. Est-ce que je ferme trop vite?

Ma table comprend 30 champs, le premier se nomme "numero", est smallint(4) et c'est la clé primaire. Dans le code ci-dessous, je sélectionne avec * parce que j'ai besoin de tous les champs.

voici le début du code:

Code : Tout sélectionner

$db=mysql_connect("localhost", "ma_table", "password"); if ($db >0) ; // echo "Connexion réussie au serveur <br><br>"; else {echo "Connexion impossible au serveur <br><br>"; exit;} mysql_select_db("ma_table", $db); $sql = "SELECT * FROM tout WHERE numero = '$Num'"; $result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); mysql_close($db); while($voir = mysql_fetch_assoc($result)) // après, je traite les données récupérées
Je suis sur php 5.1.1, Mysql 4.xx Cette table fait 73K octets
Qu'en pensez-vous?

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

15 mai 2007, 10:58

Tu l'as deviné, non seulement tu ferme la connexion trop tôt mais tu perturbe le bon fonctionnement de mysql_fetch_assoc qui lit le $result en fermant avant.
le mysql_close() doit être la dernière instruction après toutes les fonctions mysql_...

A voir aussi le "or die()" dans mysql_query() car il faut fermer la connexion avant de quitter si tu veux prendre la main.

proposition de changement:
$db=mysql_connect("localhost", "ma_table", "password");
//gérer l'erreur 
if (!$db) {
    echo "Connexion impossible au serveur <br><br>"; 
    exit;
} 
//requête
$sql = "SELECT * FROM tout WHERE numero = '$Num'"; 
//exécution
$result = mysql_db_query("ma_base", $sql, $db) ; 
//lecture résultat
while($result && ($voir = mysql_fetch_assoc($result))) {
// après, je traite les données récupérées
}
//fermer la connexion
mysql_close($db); 
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène