Aller au contenu

Problème dans une fonction


theprogrammeur

Sujets conseillés

Bonjour

J'ai créé une fonction pour gérer les erreurs qui peuvent survenir sur mon site. Malheureusement, il y a des erreurs que je ne parvient pas à régler.

Le principe de la fonction est qu'elle détecte les erreurs grace à set_error_handler();. Ma fonction affiche alors un petit message au visiteur et bloque l'exécution de la page; un mail m'est automatiquement envoyé pour me prévenir de l'erreur. De plus, la fonction écrit l'erreur dans une table MySQL comprenant 3 champs:

-fichier

-ligne

-timestamp.

La fonction doit regarder si l'erreur est déjà dans la table et si c'est la cas, ne pas envoyer de mail. En plus, elle vérifie si le timestamp date d'il y a plus de 5 jours. Si c'est le cas, elle met à jour le timestamp et renvoie un mail. Et pour finir, elle supprime toutes les erreurs qui ont un timestamp vieux de 5jours et 800 secondes.

Voici ma fonction:

function gestion_erreur($niveau, $message, $fichier, $ligne){
$date = time();
$connection = mysql_connect('localhost', 'root', '***') or die('Erreur lors de la connection au serveur');
mysql_select_db('***') or die('Erreur lors de la connection à la base de données');

$nombre_erreurs = mysql_query("SELECT COUNT * AS nb_erreurs FROM erreurs WHERE fichier=$fichier AND ligne=$ligne");
$resultat = mysql_fetch_array($nombre_erreurs);


if($resultat['nb_erreurs'] == 0){
$date_mail = $date = date('d/m/y \à H:i:s', $date);
$message = "Bonjour webmaster, \n\n Une erreur est survenue le $date_mail dans le fichier
$fichier à la ligne $ligne\n\n A+";

$sujet = 'Erreur dans un fichier';

$adresse = '***@***';

mail($adresse, $sujet, $message);

mysql_query('INSERT INTO erreurs VALUES (\'' . $fichier . '\', ' . $ligne . ', ' . time() . ')');


echo'<p id="erreur">Une erreur est survenue lors de l\'exécution de la page. Le webmaster en a été
automatiquement prévenu.<br />
Veuillez nous excuser pour le désagrément.<br />
Le webmaster</p>';
exit;
}
else{
$query = mysql_query('SELECT timestamp FROM erreurs WHERE
fichier=\'' . $fichier . '\' AND ligne=\'' . $ligne . '\'');
$date = time() - 432000;
if($query > $date){

$message = "Bonjour webmaster, \n\n Une erreur est survenue le $date_mail dans le fichier
$fichier à la ligne $ligne\n\n A+";

$sujet = 'Erreur dans un fichier';

$adresse = '***@***';

mail($adresse, $sujet, $message);

mysql_query('UPDATE erreurs SET timestamp=' . time() . ' WHERE
fichier=\'' . $fichier . '\' AND ligne=\'' . $ligne . '\'');
}

echo'<p id="erreur">Une erreur est survenue lors de l\'exécution de la page. Le webmaster en a été
automatiquement prévenu.<br />
Veuillez nous excuser pour le désagrément.<br />
Le webmaster</p>';
exit;
}

$old_date = $date = time() - 432800;
mysql_query('DELETE FROM erreurs WHERE timestamp < ' . $old_date);
mysql_close($connection);
}

Le problème est que quoi qu'il se passe, la fonction inscrit l'erreur dans la BDD et m'envoie un mail, ce que je ne veux pas.

Il est donc clair qu'il y a un problème lorsque la fonction regarde si l'erreur est déjà dans la table. Mais cette erreur, je ne la vois pas.

Quelqu'un voit-il le bogue?

Merci

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir,

Tu ne peux pas simplement faire

if($query > $date){

Car en l'occurrence $query est toujours une ressource MySQL tant que tu ne la traite pas avec une fonction comme, par exemple, mysql_result.

Le code sera donc :

$lasterrortime = mysql_result($query,0);
if($lasterrortime > $date){

Sinon à vu d'oeil (sans avoir testé ton code, même modifié), il devrait faire ce que tu souhaites.

**EDIT**

Après relecture, ta requête SQL pour déterminer si l'erreur a déjà été reporté est également erronée, elle devrait plutôt être:

$nombre_erreurs = mysql_query("SELECT COUNT(*) AS nb_erreurs FROM erreurs WHERE fichier=$fichier AND ligne=$ligne");

En effet, COUNT est une fonction, et la syntaxe SQL requiert les parenthèses et également qu'il n'y ait pas d'espace entre le nom de la fonction et ses paramètres.

Lien vers le commentaire
Partager sur d’autres sites

Peut-être qu'avec les guillemets dans ta première requête cela marchera mieux...

$nombre_erreurs = mysql_query("SELECT COUNT(*) AS nb_erreurs FROM erreurs WHERE fichier='$fichier' AND ligne='$ligne'");

D'où l'importance de choisir une syntaxe qui te convient pour toutes tes chaînes de caractères et de t'y tenir (à part quelques exceptions). Parce que là tu utilises par fois la concaténation (.), parfois l'interprétation à la volée des variables avec les double-quotes. Avoir des règles de programmation est une des bases pour obtenir un code lisible et réutilisable.

Ensuite pour trouver où se produit une erreur dans un code lorsqu'aucun message d'erreur ne s'affiche il faut y aller pas à pas. PHP ne propose pas cette fonctionnalité de debug, mais tu peux l'émuler en affichant les requêtes après interprétation et les messages d'erreurs de MySQL (qui ne sont pas automatiquement affichés), en testant ta requête directement sur ton serveur MySQL, etc.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...