webleads-tracker

WordPress & Référencement naturel
Mes servicesWordPress - Référencement
Hébergement WordPress
Vous êtes ici : SeoMix » WordPress » Thèmes WordPress » Db-error.php et les erreurs SQL de WordPress

Db-error.php et les erreurs SQL de WordPress

Quel que soit la solution technique utilisée, il peut arriver que la base de données soit indisponible, empêchant ainsi l'internaute de visiter votre site

Sur WordPress, cela nous donne de magnifiques messages d'erreur, comme par exemple le magnifique "error establising a database connection". Et pourtant, le CMS nous permet à la fois de les personnaliser et de créer un système d'alerte en temps réel, le tout grâce à un simple petit fichier appelé db-error.php.

Les erreurs SQL

La base peut-être corrompue, le mot de passe a pu être changé, le serveur SQL peut mettre trop de temps à répondre, ... : il existe de nombreux types d'erreurs pour une base de données, et WordPress n'y échappe pas.

Ces erreurs s'affichent à la place de votre site, sans pour autant prévenir le webmaster ni donner de solutions pour l'internaute qui arrive sur votre site Internet.

Error establishing a database connection

Exemple d'erreur SQL

Le pire, c'est que souvent ces erreurs sont communes à toutes les pages. Ce n'est donc pas un seul contenu qui est inaccessible, mais bien toute votre site Internet.

Il existe en réalité des dizaines et des dizaines d'erreurs différentes (cf. cet article). D'ailleurs, il peut même s'agir d'erreurs SQL causées par de mauvais développements, et qui n'apparaissent que dans certains cas de figure (auquel cas vous avez le droit de flageller votre développeur).

Le fichier db-error.php

Et pourtant, WordPress a tout prévu. Quand votre base de données SQL ne répond pas, quel qu'en soit le motif, le CMS nous laisse la possibilité de gérer l'affichage de cette erreur avec le fichier db-error.php. Et mieux encore, cela nous permet de mettre en place un système automatisé pour prévenir le webmaster.

Signaler une erreur temporaire

La première étape est d'indiquer aux moteurs de recherche que le problème rencontré est temporaire avec un code 503, et de leur dire qu'ils peuvent essayer de nouveau de crawler le contenu d'ici dix minutes.

Pour cela, créez un fichier db-error.php dans le répertoire wp-content de votre installation WordPress, et copiez-y ce code :

<?php
$protocol = $_SERVER["SERVER_PROTOCOL"];
if ( 'HTTP/1.1' != $protocol && 'HTTP/1.0' != $protocol ) $protocol = 'HTTP/1.0';
header( "$protocol 503 Service Unavailable", true, 503 );
header( 'Content-Type: text/html; charset=utf-8' );
header( 'Retry-After: 600' );

On évite ainsi d'indexer des pages d'erreurs ou de freiner l'indexation d'un site qui rencontrerait en peu de temps un trop grand nombre d'erreurs.

Avertir le webmaster

La deuxième étape consiste à alerter la personne qui gère le site Internet. On capture donc deux informations :

  • $myerror : pour enregistrer l'erreur SQL rencontrée.
  • $myurl : pour enregistrer l'URL où l'erreur a été générée. Cela inclut à la fois le front-office du site et l'administration de WordPress.

Copiez à la suite le code suivant :

$myerror=mysql_error();
$myurl=curPageURL();
function curPageURL() {
 $pageURL = 'http';
 if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
 $pageURL .= "://";
 if ($_SERVER["SERVER_PORT"] != "80") {
  $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
 } else {
  $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
 }
 return $pageURL;
}

Une fois ces deux informations trouvées, on peut envoyer un email au webmaster pour lui indiquer quel type d'erreur WordPress a rencontré au niveau de la base de données, et sur quelle page l'erreur s'est produite.

Là encore, copiez à la suite du fichier db-error.php ce nouveau code, en remplaçant MONSITE par le nom de votre site Internet et MONEMAIL par l'email de la personne à prévenir :

mail( 'MONEMAIL', 'Erreur SQL sur MONSITE', 'Ceci est un message automatis&eacute; suite &agrave; une erreur SQL rencontr&eacute; sur le site Internet. Le message est : '.$myerror.'. L\URL est : '.$myurl);?>

Moins de quelques secondes après l'erreur, le webmaster est prévenu en temps réel.

Informer l'internaute

Enfin, nous pouvons changer le message qui s'affiche auprès de l'internaute. Au lieu d'avoir un message rébarbatif sans aucun sens, on peut afficher ce que l'on veut, comme par exemple ce simple message :

Message d'erreur personnalisé sur WordPress avec db-error.php

Un message d'erreur personnalisé sur WordPress avec db-error.php

Pour afficher ce type de message, copiez à la suite du fichier db-error.php le contenu suivant en remplaçant MONSITE par le nom de votre site WordPress (2 fois) :

<html>
<head>
    <title>MONSITE temporairement indisponible</title>
    <style>
        body{background:#fff;font:16px verdana, serif;line-height:1.3;margin:0;padding:0}
        #wrapper{height:225px;margin: 80px auto 0;width:575px}
        h1{font-size:34px;font-weight:normal;margin-top:0}
        p{margin:0 0 10px 5px}
    </style>
</head>
<body>
    <div id="wrapper">
        <h1>MONSITE est temporairement inaccessible.</h1>
        <p>Le webmaster du site a été averti. Merci de revenir plus tard.</p>
    </div>
</body>
</html>

Lorsque WordPress rencontre une erreur avec la base de données, il est fort possible que votre site soit entièrement indisponible. Je vous invite donc à étoffer ce message d'erreur en fonction de votre site Internet, avec par exemple :

  • Un lien vers vos profils sociaux
  • L'affichage d'une durée de "maintenance"
Revenez dans 24 heures
  • Une explication plus poussée de l'erreur
  • Des liens vers des partenaires ou d'autres sites du réseau
  • ...

Laissez libre court à votre imagination. Vous pouvez d'ailleurs très bien ajouter des images ou des vidéos si vous souhaitez faire patienter l'internaute.

Le code complet

Et pour les flemmards, voici le code complet du fichier db-error.php, qui je vous le rappelle se place dans le répertoire wp-content de WordPress. Pensez à remplacer l'email et les 3 occurrences du nom du site :

<?php
    $protocol = $_SERVER["SERVER_PROTOCOL"];
    if ( 'HTTP/1.1' != $protocol && 'HTTP/1.0' != $protocol ) $protocol = 'HTTP/1.0';
    header( "$protocol 503 Service Unavailable", true, 503 );
    header( 'Content-Type: text/html; charset=utf-8' );
    header( 'Retry-After: 600' );
    $temp=mysql_error();
    $url=curPageURL();
    function curPageURL() {
     $pageURL = 'http';
     if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
     $pageURL .= "://";
     if ($_SERVER["SERVER_PORT"] != "80") {
      $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
     } else {
      $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
     }
     return $pageURL;
    }

    mail( 'MONEMAIL', 'Erreur SQL sur MONSITE', 'Ceci est un message automatis&eacute; suite &agrave; une erreur SQL rencontr&eacute; sur le site Internet. Le message est : '.$temp.'. L\URL est : '.$url);
?>

<html>
<head>
    <title>MONSITE temporairement indisponible</title>
    <style>
        body{background:#fff;font:16px verdana, serif;line-height:1.3;margin:0;padding:0}
        #wrapper{height:225px;margin: 80px auto 0;width:575px}
        h1{font-size:34px;font-weight:normal;margin-top:0}
        p{margin:0 0 10px 5px}
    </style>
</head>
<body>
    <div id="wrapper">
        <h1>MONSITE est temporairement inaccessible.</h1>
        <p>Le webmaster du site a été averti. Merci de revenir plus tard.</p>
    </div>
</body>
</html>

Les thèmes relatifs

Voici les thématiques abordées par Db-error.php et les erreurs SQL de WordPress:

  • db-error.php -
  • Erreur serveur
12 commentaires
  1. Cristophe
    4 messages

    Cristophe - Le 12 juillet 2012, 11:12

    Merci pour cet article ! Voilà qui sera pluss sympa pour le visiteur, tout en espérant que cela ne lui arrive pas. d:-)

  2. stef
    5 messages

    stef - Le 12 juillet 2012, 11:27

    C’est bon ca apres les pages 404 personalisées ;-)

  3. djib's
    27 messages

    djib's - Le 13 juillet 2012, 07:54

    Moi perso à la place d’un message je mets le cache de google du coup ca ne me fait pas perdre de visiteurs.

    $host=$_SERVER['HTTP_HOST'];
    $uri=urlencode($_SERVER['REQUEST_URI']);
    header("Location: http://google.com/search?q=cache:$host$uri");
    exit();
  4. Daniel Roch
    711 messages

    Daniel Roch - Le 13 juillet 2012, 10:01

    Excellente ton idée Djib’s ;)

  5. stef
    5 messages

    stef - Le 13 juillet 2012, 10:40

    @Djib’s : static.iphoneaddict.fr/A-propos moi ca j’aime bien aussi :-(

    erreur 500

  6. Vital.it
    1 message

    Vital.it - Le 13 juillet 2012, 11:41

    Merci c’est très utile, surtout chez certains fournisseurs mutualisés!
    J’avais déjà quelque chose en place, mais vraiment succint côté rapport d’erreur. Je viens d’améliorer ça.

    Du coup j’aimerai intégrer la solution de Djib’s à celle de Daniel mais je ne sait pas la coder. Ca donnerai au lecteur qqchose comme: « Revenez dans quelques minutes blabla… vous pouvez aussi cliquer ici pour voir si google a une copie de cette page. »

    Car j’ai des pages que je ne souhaite pas « cacher », dans ce cas le redirect strict de Djib’s peut donner quelquechose d’indigeste, non?

    Comment peut-on faire ça svp?
    Merci.

  7. Djib's
    27 messages

    Djib's - Le 13 juillet 2012, 13:09

    merci :-)

  8. Cristophe
    4 messages

    Cristophe - Le 13 juillet 2012, 13:10

    Bien cette idée d’utiliser le cache de google.
    Je voudrais afficher le message tel que expliqué dans l’article, et ajouter ensuite :
    « Vous pouvez consulter le cache de google :  » + le lien vers ce cache.
    ~~~~~~~
    En tant que néophyte, je ne sais pas comment faire. Quelqu’un pourrait-il me donner le code ?

  9. djib's
    27 messages

    djib's - Le 14 juillet 2012, 22:26

    @stef
    merci c’est corrigé

  10. Gwaradenn
    32 messages

    Gwaradenn - Le 17 juillet 2012, 08:51

    Cristophe, il suffit de l’ajouter dans la div « wrapper » au format HTML :
    Vous pouvez consulter le cache de google :

    <a href="URLDUCACHE" rel="nofollow">ICI</a>.
  11. master case
    1 message

    master case - Le 24 juillet 2012, 12:43

    Super idée Djibs pour l’affichage du cache google :) moi qui me contentais jusque là d’un message inquiétant, j’avais jamais pensé à faire ça :D

  12. shaza
    1 message

    shaza - Le 11 novembre 2012, 02:15

    Personnellement, je renvoie vers une version statique, pour ne pas perdre de visiteur

    <?php
     header(&#039;HTTP/1.1 503 Service Temporarily Unavailable&#039;);
     header(&#039;Status: 503 Service Temporarily Unavailable&#039;);
     $host="http://".$_SERVER[&#039;HTTP_HOST&#039;];
    $host.="/mirror".$_SERVER[&#039;REQUEST_URI&#039;];
    $host2=="http://".$_SERVER[&#039;HTTP_HOST&#039;];
    $host2.=$_SERVER[&#039;REQUEST_URI&#039;];

    $host2 me permet de savoir sur quelle page s'est produite l'erreur et $host me permet de rediriger vers la page statique correspondante, pour l'utilisateur ça se fait de manière quasi transparente…

» Commentez cet article !
(Merci de donner un vrai prénom)
(Ne sera jamais publié)
(Modèration subjective)
Html accepté <a> <i> <b> [codesyntax]CODE[/codesyntax]
» Prévisualisez votre message

© 2010-2012 SeoMix : WordPress & Référencement
Propulsé par WordPress et Daniel Roch. Logo créé par Willy-Bahuaud

Indispensable
WordPress
A propos de SeoMix
Mes servicesWordPress - Référencement
Suivez-nous !
  • 8191 abonnés
  • 195 articles
  • 4523 messages
Vous devriez lire
Seo et emarketing
Les amis
2fac11e831935e7f1c6af6cc5f733a60''''''''''''''''''''''''