Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

RÉALISATION D'UN LIVRE D'OR AVEC PDO ET APPROCHE MVC 1


Information sur le tutorial

Catégorie :Tutoriaux Date de création : 23/12/2004 11:53:20 Vu : 24 686 fois

Note :
8,87 / 10 - par 15 personnes
8,87 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (41)
Ajouter un commentaire et/ou une note

Description

Les livres d'or font partie des applications dynamiques les plus populaires sur Internet. Ils permettent à aux visiteurs d'un site de déposer une trace écrite de leur passage dans le but d'aider le webmaster à améliorer son site. Nous allons présenter dans ce tutoriel, une manière simple et efficace de développer un livre d'or fonctionnel et sécurisé. Bien entendu, ce dernier s'appuiera sur une base de donnée de type MySQL et son moteur de stockage MyISAM. Dans une optique de structuration de l'application, nous nous appuyerons sur le modèle MVC.

Tutorial

  • Pré-requis

Avant de rentrer dans le vif du sujet, nous considérons que vous êtes déjà à l'aise avec


  1. Les variables, constantes et tableaux
  2. Les fonctions et procédures utilisateurs
  3. Les bases de la programmation orientée objet
  4. L'utilisation minimale (création d'une table, requête SQL SELECT, INSERT) des bases de données. Et notamment avec MySQL.


Vous devrez également vous assurer que votre serveur web fonctionne avec la version 5 de PHP et que l'extension PDO et le driver PDO MySQL sont installés.


Sachez également que ce tutoriel n'a pas l'unique but de vous présenter une solution technique fonctionnelle pour réaliser un livre d'or. Il a également l'ambition (voire même la prétention) de vous apporter des connaissances approfondies de développement PHP5 et de bonnes pratiques.

Présentation et structuration du projet


Un livre d'or est une application dynamique qui permet aux utilisateurs d'un site Internet de déposer des messages d'appréciation. C'est en quelque sorte le recueil des humeurs des visiteurs à l'encontre du site web. Vous l'aurez compris, l'intérêt pour le webmaster est double :


  • Faire remonter des idées et des suggestions pour améliorer son application
  • Promouvoir son site Internet avec des témoignages positifs d'utilisateurs satisfaits


L'application que nous allons développer devra répondre aux contraintes suivantes :


  • Poster de nouveaux messages
  • Contrôler les informations saisies dans le formulaire
  • Lister les messages
  • Paginer les résultats
  • Etre sécurisé contre les injections SQL et les failles XSS
  • S'appuyer sur le modèle MVC


Détaillons sommairement ce dernier point.


  • Qu'est-ce-que le modèle MVC ?


MVC est l'abréviation de «Modèle, Vue, Contrôleur ». C'est est une architecture et une méthode de conception (design pattern) pour le développement d'applications logicielles qui sépare le modèle de données, l'interface utilisateur et la logique de contrôle.


Dans une application web, la couche du modèle est représentée par la base de données, les librairies de fonctions, les classes, les fichiers, les structures de données... Ce sont en fait tous les composants qui permettent de stocker et de manipuler les données.


La vue est la couche logicielle qui assure l'affichage des données à l'utilisateur et l'interface Homme / Machine. Cette couche récupère donc les données brutes du modèle et les formate correctement pour l'utilisateur. Par exemple, le nombre 1 254,67 est ici issu de la vue. Il est en effet formaté pour un site français. Pour un site américain, nous l'aurions écrit 1 254.67. En revanche, dans les deux cas, cette valeur s'écrit 1254.67 dans le modèle (dans une variable de type flottant par exemple).


La dernière couche est le contrôleur. Il s'agit du moteur principal de l'application. Il fait la liaison entre le modèle et la vue. Le contrôleur a la tâche d'analyser la requête de l'utilisateur, d'appeler le modèle adéquat et de retourner la valeur de ce dernier à la vue qui prendra en charge son affichage.


Quel sont les avantages d'utiliser une telle architecture ? Le premier intérêt concerne avant tout la maintenance. En séparant le problème en 3 couches distinctes, l'application deviendra plus facile à maintenir où à faire évoluer. Le second avantage implique la vue. En effet, cet éclatement en 3 couches permet de remplacer la vue aisément sans avoir à toucher au modèle ou bien au contrôleur. Par exemple : changer le wedesign d'un site, proposer différents format d'affichage d'un contenu (XML, XHTML, PDF, image...).


Nous avons défini globalement à quoi correspond le modèle MVC. Arrêtons nous à présent sur la structuration générale de notre livre d'or. De quoi aurons-nous besoin ?


  • Une base de données
  • Un formulaire
  • Une page de listing des résultats


Nous visualisons vaguement deux couches du modèles MVC . Le modèle représenté par la base de données et le formulaire et la page de listing qui feront partie de la vue. Nous construirons le contrôleur petit à petit. Passons désormais à la création de la base de données.

  • Mise en place de la base de données
  • Choix du moteur de stockage

Nous utiliserons ici une table MySQL avec un moteur de stockage de type MyISAM. C'est le moteur par défaut de MySQL. Il est rapide, performant et supporte la recherche en texte intégral (fulltext). Néanmoins, ce moteur a le principal défaut de ne pas être conforme à la norme ACID (Atomicité, Cohérence, Isolement, Durabilité) des bases de données. Il ne supporte pas les transactions contrairement au moteur de stockage InnoDB. Malgré tout, nous décidons d'utiliser MyISAM car les enjeux d'intégrité et de cohérence des données ne justifient pas l'emploi d'un moteur de stockage transactionnel. Un livre d'or n'est pas une application critique, contrairement à une application manipulant des données bancaires ou des salaires par exemple.

Structure de la table MySQL


La table MySQL de notre livre d'or accueillera les messages des utilisateurs. Notre formulaire sera composé de 3 champs (pseudo, message et note). Il faut donc au minimum que ces informations soient stockées dans la base de données. Seulement, ces informations ne suffisent pas. Il nous manque tout d'abord la clé primaire de la table. Nous opterons naturellement pour un identifiant unique auto-incrémenté pour chaque nouvel enregistrement. Enfin, nous ajouterons un champ recevant la date d'enregistrement des message afin de pouvoir les ordonner du plus récent au plus ancien à l'affichage.


CREATE TABLE IF NOT EXISTS guestbook (

id INT(7) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

pseudo VARCHAR(20) NOT NULL,

message TEXT NOT NULL,

note TINYINT(2) NOT NULL DEFAULT 5,

creation DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'

);



Commencez par exécuter ce code SQL dans votre outil d'administration de votre base de données (PHPMyAdmin, MySQL Query Browser...). Cela aura pour effet immédiat de créer la table "guestbook" dans votre base de données. Nous pouvons à présent nous tourner vers le développement PHP.

  • Choix du connecteur de base de données

PHP5 propose plusieurs connecteurs capables de se connecter à une base de données MySQL. Le premier et le plus courant reste le driver MySQL de base. C'est le plus simple à utiliser et donc le plus populaire. Il existe également l'extension MySQLI qui n'est autre qu'un driver amélioré de l'extension MySQL de base et qui a la particularité d'être orientée objet. Avec MySQLI, le développeur manipule directement un objet de type MySQLI alors qu'avec le driver MySQL de base il doit fonctionner par appels de procédures et fonctions.


Enfin le dernier connecteur est l'extension PDO qui signifie PHP Data Objects. Cette extension permet de se connecter à de multiples bases de données à condition que les pilotes pour chaque système d'information soit installé sur le serveur Web. PDO a été intégré avec PHP5 et a le principal avantage de faire bénéficier le développeur de certaines fonctionnalités de la base de données en fonction de son pilote. Au même titre que MySQLI, PDO est une interface orientée objet, ce qui est beaucoup plus pratique à utiliser lorsque l'on est à l'aise avec de la programmation orientée objet.


C'est donc le connecteur que nous choisirons pour nous connecter sur la base de données et la manipuler. Notez que nous aurions pu également sélectionner le driver de base ou bien le connecteur MySQLI pour notre projet. Nous avons volontairement choisi PDO comme connecteur pour les raisons évoquées ci-après :


  • Introduire une solution technique purement PHP5
  • Profiter des requêtes préparées pour sécuriser plus efficacement les écritures en base de données
  • Utiliser une solution orientée objet
  • Permettre de déployer plus facilement le livre d'or sur un autre système d'informations (Oracle, Sybase, SQLI, PostgreSQL...) sans avoir à modifier excessivement le code PHP


Nous sommes donc prêts à mettre la main à la pâte et commencer à produire nos premières lignes de code PHP.

  • Construction du livre d'or
  • Détermination des fichiers à créer

Notre application se composera de 5 fichiers PHP dont un sera le front-controller ou programme principal qui contiendra toute l'application. Nous appellerons ce fichier guestbook.php. D'un point de vue du code PHP, nous verrons qu'il est relativement limité car il ne contiendra que des appels aux autres fichiers.


Nous développerons également un fichier de configuration (guestbook-config.inc.php) qui contiendra uniquement les informations de configuration de l'application. Il s'agit en fait simplement de constantes définissant les paramètres de connexion sur la base de données ainsi que le nombre de messages à afficher par page.


Puis nous créerons un fichier stockant des procédures / fonctions (ou helpers) utiles à l'application et potentiellement utilisables dans d'autres projets. Ce fichier se nommera guestbook-model.inc.php.


Ensuite nous développerons le coeur même de l'application, c'est-à-dire le contrôleur. Ce fichier PHP contiendra le code PHP qui vérifie et enregistre les données du formulaire en base de données; et récupère une liste de messages en fonction de la pagination. Nous appellerons ce fichier guestbook-controller.inc.php.


Enfin le dernier fichier contiendra le code générant la vue. Il s'agira majoritairement de code XHTML et de quelques appels à des fonctions élémentaires de PHP ainsi qu'à des fonctions utilisateurs du fichier guestbook-model.inc.php. Vous vous en doutez peut-être, ce fichier portera le nom guestbook-view.inc.php.

  • Fichier de configuration de l'application

<?php


    /**

    * Constantes d'accès à la base de données

    * et de configuration du livre d'or

    **/

    

    // Adresse du serveur de base de données

    define('DB_SERVEUR', 'localhost');

    

    // Login

    define('DB_LOGIN','root');

    

    // Mot de passe

    define('DB_PASSWORD','root');

    

    // Nom de la base de données

    define('DB_NOM','APTutoriels');

    

    // Nom de la table du livre d'or

    define('DB_GUESTBOOK_TABLE','guestbook');

    

    // Driver correspondant à la BDD utilisée

    define('DB_DSN','mysql:host='. DB_SERVEUR .';dbname='. DB_NOM);

    

    // Nombre de messages à afficher par page

    define('MAX_MESSAGES_PAR_PAGE', 1);

?>

  • Librairie de fonctions

<?php


/**

* Ce fichier contient toutes les fonctions

* utiles à l'application

**/


/**

* Fonction de connexion sur la BDD

*

* Cette fonction utilise l'extension PDO

* de PHP5

*

* @param string driver de connexion sur la BDD

* @param string login d'accès à la bdd

* @param string mot de passe d'accès à la base de données

* @return PDO objet de connexion sur la BDD

**/

function PDOConnect($sDbDsn, $sDbLogin, $sDbPassword)

{

    $oPDO = new PDO($sDbDsn, $sDbLogin, $sDbPassword);

    $oPDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    return $oPDO;

}


/**

* Convertit la date au format américain en format français

*

* @param string la date au format US

* @return string la date au format FR

**/

function convertirDate($sDateUs)

{

    return strftime('%d/%m/%Y à %H:%M', strtotime($sDateUs));

}


/**

* Fonction de pagination des résultats

*

* Retourne le code HTML des liens de pagination

*

* @param integer nombre de résultats total

* @param integer nombre de résultats par page

* @param integer numéro de la page courante

* @param integer nombre de pages avant la page courante

* @param integer nombre de pages après la page courante

* @param integer afficher le lien vers la première page (1=oui / 0=non)

* @param integer afficher le lien vers la dernière page (1=oui / 0=non)

* @return string code html des liens de pagination

**/

function paginer($nb_results, $nb_results_p_page, $numero_page_courante, $nb_avant, $nb_apres, $premiere, $derniere)

{

        // Initialisation de la variable a retourner

        $resultat = '';


        // nombre total de pages

        $nb_pages = ceil($nb_results / $nb_results_p_page);

        // nombre de pages avant

        $avant = $numero_page_courante > ($nb_avant + 1) ? $nb_avant : $numero_page_courante - 1;

        // nombre de pages apres

        $apres = $numero_page_courante <= $nb_pages - $nb_apres ? $nb_apres : $nb_pages - $numero_page_courante;


        // premiere page

        if($premiere && $numero_page_courante - $avant > 1)

        {

            $resultat .= '<a href="'. htmlspecialchars($_SERVER['PHP_SELF']) .'?numeroPage='. $numero_page_courante .'" title="Première page">&laquo;&laquo;</a>&nbsp;';

        }

        // page precedente

        if($numero_page_courante > 1)

        {

            $resultat .= '<a href="'. htmlspecialchars($_SERVER['PHP_SELF']) .'?numeroPage='. ($numero_page_courante - 1) .'" title="Page précédente '. ($numero_page_courante - 1) . '">&laquo;</a>&nbsp;';

        }


        // affichage des numeros de page

        for($i = $numero_page_courante - $avant; $i <= $numero_page_courante + $apres; $i++)

        {

                // page courante

                if($i == $numero_page_courante)

                {

                    $resultat .= '&nbsp;[<strong>' . $i . '</strong>]&nbsp;';

                }

                 else

                {

                    $resultat .= '&nbsp;[<a href="'. htmlspecialchars($_SERVER['PHP_SELF']) .'?numeroPage='. $i .'" title="Consulter la page '. $i . '">' . $i . '</a>]&nbsp;';

                }

        }


        // page suivante

        if($numero_page_courante < $nb_pages)

        {

            $resultat .= '<a href="'. htmlspecialchars($_SERVER['PHP_SELF']) .'?numeroPage='. ($numero_page_courante + 1) .'" title="Consulter la page '. ($numero_page_courante + 1) . ' !">&raquo;</a>&nbsp;';

        }


        // derniere page

        if($derniere && ($numero_page_courante + $apres) < $nb_pages)

        {

            $resultat .= '<a href="'. htmlspecialchars($_SERVER['PHP_SELF']) .'?numeroPage='. $nb_pages .'" title="Dernière page">&raquo;&raquo;</a>&nbsp;';

        }

        

        // On retourne le resultat

        return $resultat;

}


?>

  • Contrôleur de l'application

<?php


    /**

    * Contrôleur de l'application

    *

    * Ce fichier traite le formulaire

    * Enregistre les informations en base de données

    * Affiche une liste paginée de résultats

    **/

    

    /** ----

     * Déclaration des variables globales

     ** ----

    */

    

     // Objets de connexion et de manipulatin de la BDD

     $oPDO = null;

     $oPDOStatement = null;

    

     // Tableau stockant les informations du livre d'or

     $aInfosGuestbook = array();

    

     // Tableau stockant les messages récupérés de la BDD

     $aListeMessages = array();

    

     // Tableau stockant les erreurs générées

     $aListeErreurs = array();

    

     // Nombre de messages enregistrés dans la BDD

     $iNombreDeMessages = 0;

    

     // Numéro de la page courante

     $iNumeroDePageCourante = 1;

    

     // Offset à partir duquel on récupère les messages dans la BDD

     $iOffsetSelection = 0;

    

     // Note moyenne du site

     $fNoteMoyenne = 0;

    

     /** ----

     * Contrôle de la pagination

     ** ----

     */

     if(!empty($_GET['numeroPage'])

         && is_numeric($_GET['numeroPage'])

         && ($_GET['numeroPage']>1))

     {

         $iNumeroDePageCourante = intval($_GET['numeroPage']);    

         $iOffsetSelection = ($iNumeroDePageCourante - 1) * MAX_MESSAGES_PAR_PAGE;

     }

    

     /** ----

     * Initialisation de la connexion avec la base de données

     ** ----

     */

     $oPDO = PDOConnect(DB_DSN, DB_LOGIN, DB_PASSWORD);

    

     /** ----

     * Contrôle du formulaire

     ** ----

     */

    if(!empty($_POST))

    {

        // Récupération et nettoyage des données

        $_POST['pseudo'] = trim($_POST['pseudo']);

        $_POST['message'] = trim($_POST['message']);

        $_POST['note'] = trim($_POST['note']);

         

         // Le pseudo est-il rempli ?

         if(empty($_POST['pseudo']))

         {

             $aListeErreurs[] = 'Veuillez indiquer votre pseudo';

         }

         else

         {

             // Le pseudo est-il compris entre 2 et 20 caractères ?

             if(strlen($_POST['pseudo']) < 2)

             {

                 $aListeErreurs[] = 'Votre pseudo est trop court';

             }

             

             if(strlen($_POST['pseudo']) > 20)

             {

                 $aListeErreurs[] = 'Votre peudo est trop long';

             }

         }

         

         // Le message est-il rempli ?

         if(empty($_POST['message']))

         {

             $aListeErreurs[] = 'Veuillez indiquer votre message';

         }

         

         // La note est-elle correcte ?

         if(empty($_POST['note'])

             || !is_numeric($_POST['note'])

             || ($_POST['note'] < 1)

             || ($_POST['note']>10))

         {

             $aListeErreurs[] = 'Veuillez choisir une note';

         }

         

         // Si aucune erreur n'a été générée

         // On enregistre le message dans la BDD

         if(0 === sizeof($aListeErreurs))

         {

             try

             {

                 // Création d'une requête préparée

                 $oPDOStatement = $oPDO->prepare('INSERT INTO '. DB_GUESTBOOK_TABLE .' (pseudo, message, note, creation) VALUES(:pseudo, :message, :note, NOW())');

                 // Ajout de chaque paramètre à la requête

                 // Les paramètres sont automatiquement protégés par l'objet PDO

                 

                 $oPDOStatement->bindParam(':pseudo', $_POST['pseudo'], PDO::PARAM_STR);

                 $oPDOStatement->bindParam(':message', $_POST['message'], PDO::PARAM_STR);

                 $oPDOStatement->bindParam(':note', $_POST['note'], PDO::PARAM_INT);

                 

                 // Execution de la requête préparée

                 $oPDOStatement->execute();

             }

             catch(PDOException $oPdoException)

             {

                 $aListeErreurs[] = 'Une erreur est survenue et a empêché l\'enregistrement de votre message';

             }

        }

    }

    

    /** ----

    * Comptage du nombre de messages en base de données et calcule de la note moyenne

    ** ----

    */

    $oPDOStatement = $oPDO->query('SELECT COUNT(1) AS nombreMessages, SUM(note) AS noteTotale FROM '. DB_GUESTBOOK_TABLE);

    $oPDOStatement->setFetchMode(PDO::FETCH_ASSOC);

    $aInfosGuestbook = $oPDOStatement->fetch();

    

    $iNombreDeMessages = intval($aInfosGuestbook['nombreMessages']);

    

    // Calcul de la note moyenne

    if($iNombreDeMessages > 0)

    {

        $fNoteMoyenne = round(intval($aInfosGuestbook['noteTotale']) / $iNombreDeMessages, 2);

    }

    

    $oPDOStatement = null;


    /** ----

    * Récupération des messages en fonction de la pagination

    ** ----

    */

    if(sizeof($iNombreDeMessages)>0)

    {

        $oPDOStatement = $oPDO->prepare('SELECT pseudo, message, creation FROM '. DB_GUESTBOOK_TABLE .' ORDER BY creation DESC LIMIT :offset, '. MAX_MESSAGES_PAR_PAGE);

        $oPDOStatement->bindParam(':offset', $iOffsetSelection, PDO::PARAM_INT);

        $oPDOStatement->execute();

        

        // Récupération des résultats sélectionnés dans le tableau $aListeMessages

        $aListeMessages = $oPDOStatement->fetchAll(PDO::FETCH_OBJ);

    }

    

// Fermeture de la connexion SQL

$oPDOStatement = null;

$oPDO = null;

?>

  • Affichages des messages et du formulaire

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">

    <head>

        <title>Mon livre d'or</title>

        <meta http-equiv="content-type" content="text/html; charset=utf-8"/>

    </head>

    <body>

        <h1>Mon livre d'or</h1>

        

            <h2>Poster un message</h2>

            

            <?php /** Affichage des erreurs générées **/ ?>

            <?php if(sizeof($aListeErreurs) > 0) : ?>

                <ul>

                    <?php foreach($aListeErreurs as $sErreur) : ?>

                    <li><?php echo htmlspecialchars($sErreur); ?>

                    <?php endforeach; ?>

                </ul>

            <?php endif; ?>

                        

            <form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post">

                <div>

                    <label for="pseudo">Pseudo :</label>

                    <input type="text" name="pseudo" id="pseudo" value="<?php if(!empty($_POST['pseudo'])) : echo htmlspecialchars($_POST['pseudo']); endif; ?>" />

                </div>

                <div>

                    <label for="message">Message :</label>

                    <textarea name="message" id="message" rows="10" cols="45"><?php if(!empty($_POST['message'])) : echo htmlspecialchars($_POST['message']); endif; ?></textarea>

                </div>

                <div>

                    <label for="note">Note :</label>

                    <select name="note" id="note">

                        <?php for($i=1; $i<11; $i++) : ?>

                        <option value="<?php echo $i; ?>"<?php if(!empty($_POST['note']) && ($_POST['note'] == $i)) : echo ' selected="selected"'; endif; ?>><?php echo $i; ?></option>

                        <?php endfor; ?>

                    </select>

                </div>

                <div>

                    <input type="submit" name="envoyer" value="Soumettre" />

                </div>

            </form>

            

            <h2>Liste des messages</h2>

            

            <?php /** Affichage des messages **/ ?>

            <?php if($iNombreDeMessages > 0) : ?>

            

                <ul>

                    <li><?php echo $iNombreDeMessages; ?> message<?php if($iNombreDeMessages > 1) : ?>s<?php endif; ?></li>

                    <li>Note moyenne : <?php echo $fNoteMoyenne; ?> / 10

                </ul>

                

                <?php foreach($aListeMessages as $oMessage) : ?>

                    <div>

                        <p>

                            Par <?php echo htmlspecialchars($oMessage->pseudo); ?>, le <?php echo convertirDate($oMessage->creation); ?>

                        </p>

                        <blockquote>

                            <p>

                                <?php echo nl2br(htmlspecialchars($oMessage->message)); ?>

                            </p>

                        </blockquote>

                    </div>

                    <hr/>

                <?php endforeach; ?>

                

                <?php /** Affichage de la pagination si nécessaire **/ ?>

                <?php if($iNombreDeMessages > MAX_MESSAGES_PAR_PAGE) : ?>

                <div class="pagination">

                    <?php echo paginer($iNombreDeMessages, MAX_MESSAGES_PAR_PAGE, $iNumeroDePageCourante, 4, 4, 1, 1); ?>

                </div>

                <?php endif; ?>

            <?php else : ?>

            <p>

                Aucun message enregistré

            </p>

            <?php endif; ?>

    </body>

</html>

  • Programme principal

<?php


    /**

    * Programme principal

    * Construit la page à partir de tous les fichiers

    ***/

    

    require(dirname(__FILE__).'/guestbook-config.inc.php');

    require(dirname(__FILE__).'/guestbook-model.inc.php');

    require(dirname(__FILE__).'/guestbook-controller.inc.php');

    require(dirname(__FILE__).'/guestbook-view.inc.php');

?>

  • Utilisation du livre d'or


Pour tester le livre d'or, il vous suffit simplement de placer tous les fichiers dans le même répertoire et d'appeller le script principal dans votre navigateur.


Par exemple : http://monsite.com/guestbook/guestbook.php

  • Téléchargement et licence des fichiers sources


Les fichiers sources du programme sont disponibles en téléchargement libre. Vous pouvez les modifier et les commercialiser librement.



  • Améliorations possibles


Ce livre d'or reste malgré tout sommaire et il ne tient qu'à vous à présent de l'améliorer. Voici quelques idées pour agrémenter ce programme de nouvelles fonctionnalités :


  • Ajout d'un captcha visuel ou image pour empêcher le spamm par des robots
  • Ajout de nouveaux champs : email, site web...
  • Utilisation d'un éditeur WYSIWYG ou de tags BBCode pour personnaliser les messages
  • Développement du module d'administration des messages
  • ...
  • Un petit mot sur le portage de l'application sur un autre SGBDR


Du fait de l'implémentation de l'objet PDO, cette application devient plus aisément portable sur un autre système de bases de données relationnelles. Si vous comptez utiliser ce livre d'or sur un système Oracle par exemple, il ne vous suffira qu'à changer la constante DB_DSN du fichier de configuration, et modifier les requête SQL du contrôleur en conséquence. Vous n'aurez nul besoin de toucher aux autres fichiers. C'est là tout l'avantage du modèle MVC comme nous l'avons expliqué plus haut.

  • Conclusion

Nous sommes arrivés au terme de ce tutoriel. Nous avons pu découvir progressivement comment réaliser une application Web PHP5 structurée et sécurisée s'appuyant sur le modèle MVC. Bien entendu ce n'est pas la seule et unique façon de procéder. Il en existe beaucoup d'autres mais cela vous donnera probablement de nouvelles idées pour vos prochains développements...

24 mars 2008 15:38:31 :
J'ai entièrement réécrit le tutoriel car depuis il était devenu complètement obsolète. A présent, ce tutoriel utilise l'extension PHP5 PDO et est structuré selon une approche MVC 1. Je vous laisse le soin de le (re)découvrir et d'apporter vos commentaires :)
24 mars 2008 16:06:05 :
Ce tutoriel a été mis à jour car il était devenu obsolète. Il ne présentait pas les bonnes pratiques de développement et n'était pas sécurisé. Aujourd'hui, le tutoriel présente l'extension PDO de PHP5 et est structuré suivant le design pattern MVC1
signaler à un administrateur
Commentaire de Lynk Hirosue le 13/05/2005 13:50:10

et bien merci beaucoup pour ce tutorial, ca m'a beaucoup aider. Clair et simple...
merci

signaler à un administrateur
Commentaire de Lynk Hirosue le 13/05/2005 13:53:11

il manque une parenthèse dans le code :


    // On nettoie les données (sauts de ligne en trop&#8230;).

    $pseudo = trim(ucfirst(addslashes($_POST['pseudo'])));
    $email = trim(addslashes($_POST['email']));
    $message = trim(ucfirst(addslashes($_POST['message']));


remplacer :

$message = trim(ucfirst(addslashes($_POST['message']));

par :

$message = trim(ucfirst(addslashes($_POST['message'])));

signaler à un administrateur
Commentaire de johann1 le 13/05/2005 14:11:51

Salut Webdeb,

Je tenais simplement à te remercier pour la réalisation de ce tuto, mais aussi et surtout, pour le temps que tu as passé afin qu'un débutant comme je le suis puisse le comprendre...et surtout l'appliquer sur son site!
Il y a des champions d'informatique sur Codes Sources, mais qui ne parlent toujours qu'en language d'initiés qu'ils sont! Et les débutants, même les plus acharnés, ont souvent du mal à suivre! Ce n'est certes pas un reproche, mais une réalité quand même!
Je reste à l'affût de tes prochaines réalisations, et réitère encore mes remerciements

Johann1

signaler à un administrateur
Commentaire de Lynk Hirosue le 13/05/2005 14:19:05

2ème faute :

<td width="100%" style="border: 1 solid #000000"><?php echo nl2br(sripslashes($row['message'])); ?></td>


on écrit stripslashes !!

remplacer :

<td width="100%" style="border: 1 solid #000000"><?php echo nl2br(sripslashes($row['message'])); ?></td>

par :

<td width="100%" style="border: 1 solid #000000"><?php echo nl2br(stripslashes($row['message'])); ?></td>

signaler à un administrateur
Commentaire de Tryphoon le 14/05/2005 14:17:07

Super source, je me joins au commentaire de Johann1 et il faudrait peut être pouvoir administrer ce livre d'or, pour enlever les massages en trop ou indesire. Est ce que tu as une idée de la méthode?
Merci.

signaler à un administrateur
Commentaire de avengerfrance le 31/05/2005 18:35:29

Au secours !
Voici le message d'erreur:
Forbidden
You don't have permission to access /LIVREDOR/<br /><b>Notice</b>: Undefined variable: PHP_SELF in <b>d:/program files/easyphp1-8/www/livredor/guestbook.php</b> on line <b>54</b><br /> on this server.
Et ce a chaque fois que je veux poster un nouveau message.
Est-ce dut aux privileges accordes dans la base ou au php 4 que j'emploi ?
Sinon pour le tutorial : je trouve qu'il manque d'explications intermediaires sur la creation de la base mais c'est extremement bien commente. Merci !

signaler à un administrateur
Commentaire de webdeb le 01/06/2005 13:49:07

Salut !

Remplace <?php echo $PHP_SELF; ?> par livredor/guestbook.php (ou le chemin qui mène au fichier contenant ce script).

Le tutorial a été revu et corrigé sur mon site à cette adresse :

http://www.webmaster-debutant.net/show_article-6.html

Cordialement !

@ Bientôt !

Webdeb.

signaler à un administrateur
Commentaire de crazygoth le 03/06/2005 15:55:12

Notice: Undefined variable: start in c:\program files\easyphp1-8\www\guestbook\livredor.php on line 84
voila le message qui m'affiche
ensuite,
la reglette pour passer à la page suivant ne marche pas
avez vous la solution a ce problème
appart ca vraiment bon tutorial


signaler à un administrateur
Commentaire de Losrentros le 11/06/2005 20:10:49

salut a tous
alors deja $start est doffice !$start car elle n est initialisée nulle part

j ai une autre source a proposer pour la navigation de page en page de maniere dynamique et en faisant le compte des ligne dans mysql aussi

[code]
/*-tout d abord combien de message par  page?
ensuite
combien de message dans la base de donnée?
ensuite
arrondire vers l entier superieur la division du deuxieme par le premiere
--*/
$retour = mysql_query("SELECT COUNT(*) AS nb FROM table");
$donnees = mysql_fetch_array($retour);
$totalDesMessages = $donnes['nb'];
$nombreDeMessagesParPage = 15;//valeur au choix
$nombreDePages = ceil($totalDesMessages / $nombreDeMessagesParPage);

/*--ensuite pour l affichage --*/
}
<p class="ce_que_vous_voulez_ou_pouvez">
{
<?php

echo 'Page : ';
for ($i = 1 ; $i <= $nombreDePages ; $i++)
{
    echo '<a href="livre.php?page=' . $i . '">' . $i . '</a> ';
}
/*---la on recoit en $_GET ou $_REQUEST cela depend des gouts la variable $page
cette variable va determiner quels messages (en faisant une requete avec l ordre sql  LIMIT--*/
$retour_mess = mysql_query("SELECT * FROM table ORDER BY id DESC LIMIT ".$dep_message.",".$NombreDeMessagesParPage." ");
while($mess = mysql_fetch_array($retour_mess)){
echo '<tr><td class ="ce_que_vous_voulez_ou_pouvez">'.$mess['message'].'</td></tr>';
}
?>
//cette fois cela depends des noms des champs dans la base de donnée
/*--ces lignes doivent etre executée dans un div qui comprend deja une definition de tableau html genre <table> et doit se fermer avec </table>--*/

/*--pour connaitre $dep_message et $ fin_message --*/
<?(isset ($GET_['page'])?$page =$GET_['page'] : $page = 1;

$dep_message = ($page - 1) * $nombreDeMessagesParPage;
/*--maintenant a vous de voir comment vous assemblez tous ces elements bien sur il y a plusieurs possibilités --*/
?>

}
</p>
[/code]



enfin voila pour continuer ce tuto je met ma vision des choses
sinon c est pas mal du tout comme contribution en tout cas
le truc ici je trouve c est l affichage de lien pour l affichage des pages dispo et cela dynamiquement en fonction et des message present et du nombre de messages que l on desire afficher .
Au debut j ai eu du mal avec ca je dois dire
a plus et bonne continuation a tous

signaler à un administrateur
Commentaire de kisscatcool le 10/08/2005 01:01:23

lut voila j'ai un petit soucis: j'ai repris le tuto a fond et je bloque sur la fin, je ne sais pas ou mettre le premier code php. Il est marqué qu'il est entre <form></form> mais quand je saisi du text dans le formulaire et valide je me retrouve sur une page blanche. Merci de vos futures reponses.

signaler à un administrateur
Commentaire de ombrey20 le 20/08/2005 18:17:48

merci beaucoup pour ce tutorial, c vraiment Clair et simple à comprendre...

salut kisscatcool
bon dans la page guestbook.php tu copie ce code la:
<?php

// Inclusion du fichier infos_sql.php

include 'infos_sql.php';  

// Test du champ caché posted.

if($_POST['posted'])
{

   // Si tous les champs sont remplis.

    if(!empty($_POST['pseudo']) AND !empty($_POST['email']) AND !empty($_POST['message']))
    {

    // On nettoie les données (sauts de ligne en trop…).

    $pseudo = trim(ucfirst(addslashes($_POST['pseudo'])));
    $email = trim(addslashes($_POST['email']));
    $message = trim(ucfirst(addslashes($_POST['message'])));

    // On définit la requête d’insertion.

    $insert = "INSERT INTO guestbook VALUES('','$pseudo','$email','$message','$date')";

    // On exécute l’insertion des données dans la table.

    $query = mysql_query($insert) OR die("Impossible d’ajouter le message<br>".mysql_error());

    // On affiche un message de remerciement au visiteur.

    echo '<script language="JavaScript">';
    echo 'alert("Merci pour votre message !");';
    echo '</script>';

    }
      // sinon on affiche un message d’erreur et on redirige.
      else
    {
    echo '<script language="Javascript">';
    echo 'alert("Remplissez chaque champ svp !");';
    echo 'javascript:history.back(1);';
    echo '</script>';
    }
}

?>
<html>
<head>
<title>Livre d'or</title>
</head>
<body>
<form action="<?php echo $PHP_SELF; ?>" method="POST">
<input type="hidden" name="posted" value="1">
<div align="center">
<center>
<table border="0" cellpadding="4" cellspacing="5" width="60%" height="107" style="border-style: solid; border-width: 0">
<tr>
<td width="32%" height="22" style="border: 1px solid #008000">Votre Pseudo :</td>
<td width="68%" height="22" style="border: 1 px solid #008000"><input type="text" name="pseudo" size="46"></td>
</tr>
<tr>
<td width="32%" height="21" style="border: 1px solid #008000">Votre Email :</td>
<td width="68%" height="22" style="border: 1px solid #008000"><input type="text" name="email" size="46"></td>
</tr>
<tr>
<td width="32%" height="21" valign="top" style="border: 1 solid #008000">Votre Message</td>
<td width="68%" height="21" style="border: 1px solid #008000"><textarea rows="9" name="message" cols="63"></textarea></td>
</tr>
<tr>
<td width="32%" height="21" style="border: 1px solid #008000"></td>
<td width="68%" height="21" style="border: 1px solid #008000"><input type="submit" value="Soumettre" name="submit">
<input type="reset" value="Recommencer" name="reset"></td>
</tr>
</table>
</center>
</div>
</form>
<?php

// On vérifie à quel endroit dans la table on récupère les messages.

if(!$start) {$start=0;}

// On effectue une requête de recherche et de sélection des messages.
$rec = mysql_query("SELECT * FROM guestbook ORDER BY id DESC LIMIT ".$start.",".$nb);

// On extrait les données une à une à l’aide d’une boucle While() ;

while ($row = mysql_fetch_assoc($rec))
{

?>
<div align="center">
<center>
<table border="0" cellpadding="4" cellspacing="0" width="60%">
<tr>
<td width="100%" style="border: 1 solid #000000">&nbsp;De <?php echo stripslashes($row['pseudo']); ?> le <?php echo $row['date']; ?></td>
</tr>
<tr>
<td width="100%" style="border: 1 solid #000000"><?php echo nl2br(stripslashes($row['message'])); ?></td>
</tr>
</table>
</center>
</div>
<br><br>
<?php
}

// On libère la mémoire cache après la requête.

mysql_free_result($rec);

// On compte le nombre d’enregistrements.

$result=mysql_query("SELECT COUNT(*) FROM guestbook");
$row = mysql_fetch_row($result);
?>
<p align="left"></p>
<p align="center">
<?php

// On utilise un script pour un affichage du nombre de pages :

if ($start == "0") {
echo"<b><font size=\"1\" face=\"Verdana\">[1]</font></b>";
} else {
echo"<a href=\"guestbook.php?start=0\">[1]</a> ";
}
for($index=1;($index*$nb)<$row[0];$index++) {
$pg = $index+1;
if(($index*$nb)!=$start) {
print("<a href=\"guestbook.php?start=".($index*$nb)."\">");
echo"[".$pg."]";
print("</a>");
}
else {
echo" <b><font size=\"1\" face=\"Verdana\">[".$pg."]</font></b>";
} }
?>
</p>
<p align="center">&nbsp;</p>
</body>
</html>

et ça va marché

signaler à un administrateur
Commentaire de jnbrunet le 06/09/2005 03:09:45

You don't have permission to access /<br /><b>Notice</b>: Undefined variable: PHP_SELF in <b>c:/program files/easyphp1-7/www/guestbook.php</b> on line <b>60</b><br /> on this server.


si je change php_self pour guestbook.php sa ne marche pas non plus....je débute en php...

jn

signaler à un administrateur
Commentaire de ombrey20 le 06/09/2005 12:09:22

salut jnbrunet
la version 1-7 ne prend pas en compte les variables globales.
Pour modifier cela :
rechercher php.ini dans easyPhp
et modifie : registers_globals="OFF" =>registers_globals="On"

signaler à un administrateur
Commentaire de jnbrunet le 06/09/2005 22:58:02

super merci!

signaler à un administrateur
Commentaire de johann1 le 07/09/2005 00:46:15

Bonjour "Webded",

Je suis véritablement épaté par la description de ta source... que tu as réalisé du haut de tes 18 ans! Si tous les gosses de ton âge possédait autant de connaissances acquises sans aucun doute par passion, les vieux "cons" comme moi retourneraient à "votre" école.
J'ai pour ma part commencé à "envoyer un mail" voici un an et demi (j'ai 47 ans), et me fond (et me perd aussi  lol)aujourd'hui dans divers languages informatiques... dont le PHP et SQL... et tous languages qui s'y fondent, tel le java script et le flash.

Je ne me perdrai pas beaucoup plus dans les méandres de mes apprentissages tardifs, mais je tenais juste à te remercier pour toutes les explications et descriptions de ta source.

Tu as véritablement pensé, avec une telle description, à faire bénéficier de ton expérience à chacun d'entre-nous... des débutants de mon âge, mais aussi du tien.

Sâche que grâce à toi et ton tuto aussi descriptif j'ai compris enfin plein de choses en PHP et SQL!

Je tenais en t'en remercier Webded!

Ce petit mot s'adresse également,et surtout, à tous les supers pros (de ce super site, faut-il le rappeler!)qui ont tendance à oublier leurs débuts difficiles,et qui dénigrent sans pitié les informaticiens en herbe.

Bien que je ne généralise pas! Bien sûr!

Bonne chance à toi Webded et bonne continuation!

J'espère que tu m'en apprendras encore et encore!!!

Johann

signaler à un administrateur
Commentaire de webdeb le 08/09/2005 11:02:12

Merci à toi Johann1 ca fait toujours plaisir des commentaires comme les tiens ;)

Cordialement,

Le Webmaster de http://www.webmaster-debutant.net

signaler à un administrateur
Commentaire de angelofdarkness le 04/11/2005 12:44:09

Bonjour ^^

Tout d'abord, merci pour ce script clair, simple et bien expliqué ^^
Ouais je sais, ca fait figure de déjà vu mais c'est que ca doit vrai alors ;) lol

Je vais poser une tite question qui aura déjà été posée sur ce forum mais qui n'a visiblement pas trouvé de réponse ^^

En fait, j'ai un message d'erreur qui me dit :
Notice: Undefined variable: start in :\XXXXXX\XXXXX\guestbook.php on line 114

Donc visiblement un soucis avec la fonction : if(!$start) {$start=0;}

Si quelqu'un à une tite idée ^^

Merci ^^

signaler à un administrateur
Commentaire de jnbrunet le 04/11/2005 15:39:45

Salut,

Voici ce que je te propose...

remplace ça:
if(!$start) {$start=0;}

Par ça:
if(isset($_GET['start'])) {$start = $_GET['start'];} else {$start=0;}

Jn

signaler à un administrateur
Commentaire de angelofdarkness le 04/11/2005 16:27:51

salut !

tip top ca marche nikel ^^ Merci beaucoup ;)

Je voudrais mettre un outil admin pour gerer les messages indesirables et autres, zavez une idée ? ^^

Merci all ^^

signaler à un administrateur
Commentaire de Fullnet Software le 13/11/2005 17:28:30

J'ai ajouté quelques variables dedans ce merveuilleux script, ce qui m'a permis de fabriquer un sytème d'inventaire convivial :)... le seul hic est représenté kand je les affiches :

   De 110 $ CDN
Ajouté le Chaise pliante en métal

taille: 13-11-2005 à 11:12:37
masse: chaise.jpg
Description : 15
Prix de base: 3" 4 pouces de haut, 1 " 1/2 ' de large
Nombre en inventaire : 500 g

toutes les variables son mélangées, pourtant je les présentent dans l'ordre quelles apparaissetn danns la base SQL...

j'utilise ce code pour afficher... j'y ai meme modifié les fameux stripslashes :

<div align="center">
<center>
<table border="0" cellpadding="4" cellspacing="0" width="60%">
<tr>
<td width="100%" style="border: 1 solid #000000"><img src="/images/<?php echo nl2br(stripslashes($row['urlimage'])); ?>" noborder> &nbsp; De <?php echo stripslashes($row['nom']); ?> <BR> Ajouté le <?php echo $row['date']; ?></td>
</tr>
<tr>
<td width="100%" style="border: 1 solid #000000">
<br> taille: <?php echo nl2br(stripslashes($row['taille'])); ?>
<br> masse: <?php echo nl2br(stripslashes($row['masse'])); ?>
<br> Description : <?php echo nl2br(stripslashes($row['description'])); ?>
<br> Prix de base: <?php echo nl2br(stripslashes($row['prix'])); ?>
<br> Nombre en inventaire : <?php echo nl2br(stripslashes($row['stock'])); ?>
</td>
</tr>
</table>
</center>
</div>
<br><br>


bon voila j'aimerais savoir pourquoi les variables ne sont pas classées comme elles le devraient ... (je sui debutant, sa fé 3 jours que g commencer... :P)

signaler à un administrateur
Commentaire de aziman le 06/12/2005 02:10:37

Un livre d'or m'a été fourni avec mon hébergement. Il est en PHP. Il est envahi par des spammers. Mon hébergeur m'a informé que le seul moyen de solutionner ce problème consiste à autoriser les commentaires à l'aide d'un script. Mais il n'offre pas ce service. J'ai fouillé sur le Web mais je n'ai rien trouvé. Je ne connais pas PHP. Quelqu'un peut-il me suggérer une piste ?

signaler à un administrateur
Commentaire de linkid le 28/01/2006 17:40:47

Salut,
voila, je ne sais pas si ça fait ça chez vous, mais chez moi, on ne peut pas envoyer d'email au poster de message car il n'y a pas de liens !
Alors je me demandais si on pouvais mélanger le php et le HTML ??? Car si on peut, il faudrait mettre :
<div align="center">
<center>
<table border="0" cellpadding="4" cellspacing="0" width="60%">
<tr>
<td width="100%" style="border: 1 solid #000000">&nbsp;De <?php echo <a href="$email" target="_blank"> stripslashes($row['pseudo'])</a>; ?> le <?php echo $row['date']; ?></td>
</tr>

Alors ? On peut ? Je vais le tester chez moi et vous dire si ça marche ou non... ou se sera vous qui me le diront !
linkid, webmaster de http://thelegend.free.fr

signaler à un administrateur
Commentaire de linkid le 25/02/2006 17:15:45

Salut, finalement, j'ai réussi à mettre le lien pour les emails (trop facile !!!)
Ce tuto est vraiment super et ma appris énormément de chose en PHP ! Mais il me reste beaucoup à apprendre...
En fait, voilà, je voudrais prendre des smileys de ma base de donnée, puis les mettre dans la case Message. Pour cela, je n'y arrive pas, hélas ! ALors svp, help me...
Merci

signaler à un administrateur
Commentaire de jojokun le 28/03/2006 13:39:25

voila j'ai repris tous les correction sur cette tuto mais sur ma page il s'affiche:Undefined index: start in c:\program files\easyphp1-8\www\kaweni site\guestbook.php on line 62
et quand j'envoie un message j'ai: You don't have permission to access /Kaweni site/<br /><b>Notice</b>: Undefined variable: PHP_SELF in <b>c:/program files/easyphp1-8/www/kaweni site/guestbook.php</b> on line <b>32</b><br /> on this server.
Qu'est ce qui cloche?
merci.

signaler à un administrateur
Commentaire de webdeb le 28/03/2006 17:11:00

Salut !

Remplace $PHP_SELF par $_SERVER['PHP_SELF'] et $start par $_GET['start'].

++

PS : je mettrai ce tuto à jour quand j'en trouverais le temps lol :)

signaler à un administrateur
Commentaire de linkid le 28/03/2006 18:44:01

Bon, je renouvelle ma demande : Pourriez-vous m'aider à inclure des smileys dans la case message en les prenant à partir d'une table de ma Base de donnée ??? merci !

signaler à un administrateur
Commentaire de linkid le 28/03/2006 18:44:19

Bon, je renouvelle ma demande : Pourriez-vous m'aider à inclure des smileys dans la case message en les prenant à partir d'une table de ma Base de donnée ??? merci !

signaler à un administrateur
Commentaire de jojokun le 28/03/2006 23:01:59

Merci beaucoup WEBDEB.
mais il ya toujours un probleme qui me dépasse. voila: le message suivant est sur ma page de formulaire:Undefined index: start in c:\program files\easyphp1-8\www\kaweni site\guestbook.php on line 63
Erreur : Erreur de syntaxe près de '10' à la ligne 1
ma ligne 63 est:$rec = mysql_query("SELECT pseudo, email, message, date FROM guestbook ORDER BY id DESC LIMIT ".$_GET['start'].",".$nb) OR die("Erreur : ".mysql_error());
De plus qd je fais envoyer: un message d'ALERTE s'affiche "merci de votre message"et ça charge...très longtemps pour n'aboutir à rien.
Que faire?

signaler à un administrateur
Commentaire de webdeb le 28/03/2006 23:24:16

>> Bon, je renouvelle ma demande : Pourriez-vous m'aider à inclure des smileys dans la case message en les prenant à partir d'une table de ma Base de donnée ??? merci !

Pourquoi d'une table ? Tu peux très bien faire un tableau associatif :

$tab_smilies = array(

':-)' => '<img src="smile.gif" alt="Un smile" />',
':-(' => '<img src="bad.gif" alt="Sad" />',
';-)' => '<img src="oeil.gif" alt="Clin d'oeil" />'
);

Ensuite tu fais un foreach par exemple pour remplacer tes smilies textes par les images.

++

signaler à un administrateur
Commentaire de linkid le 29/03/2006 18:13:44

Ok, merci, mais je ne connais pas très bien foreach, pourrais-tu m'expliquer te plait ...???
Merci

signaler à un administrateur
Commentaire de webdeb le 29/03/2006 21:40:21

Teste ce script :

<?php

$tab_couleurs = array('rouge' => '#FF0000', 'blanc' => '#FFFFFF', 'noir' => '#000000');

// On affiche uniquement les clés (donc les couleurs en lettres)

foreach($tab_couleurs as $cles)
{
  echo $cles;
  echo '<br />';
}

// On affiche les clés et les valeurs
foreach($tab_couleurs as $cles => $valeurs)
{
   echo $cles ,' : ', $valeurs ,'<br />';
}

?>

Voila, je te laisse apprécier le côté pratique de cette boucle pour traiter les tableaux ;)

++

signaler à un administrateur
Commentaire de Christouw le 08/06/2006 21:28:32

Bonjours, ça me met ça lorsque j'essaye d'aller sur la page.
Comment établir l'accès ?
"Warning: mysql_connect(): Access denied for user 'chu2'@'172.20.244.129' (using password: YES) in /var/www/free.fr/d/4/chu2/infos_sql.php on line 26
Le Serveur ne répond pas"

Merci d'avance :p.

signaler à un administrateur
Commentaire de Christouw le 08/06/2006 21:31:10

Bonjours. Lorsque j'essaye d'accèder à la page, ça m'affiche cela :
"Warning: mysql_connect(): Access denied for user 'chu2'@'172.20.244.129' (using password: YES) in /var/www/free.fr/d/4/chu2/infos_sql.php on line 26
Le Serveur ne répond pas"

Comment je peux faire pour établir la connection ?
Merci davance :)

signaler à un administrateur
Commentaire de mammelle le 20/06/2006 15:24:12

bonjour
j'ai le même probleme :
Warning: mysql_connect(): Accès refusé pour l'utilisateur: 'cat'@'@localhost' (mot de passe: OUI) in /var/www/infos_sql.php on line 26
Le Serveur ne répond pas

je suis un debutant donc j'ai surement  du oublier un truc con mais je ne vois pas ce que c'est.
pourriez vous me repondre
merci

signaler à un administrateur
Commentaire de Le Prince Dragon le 28/08/2006 02:37:35

merci pour ce fomidable tuto,
mais j'ai un problaime que je ne comprend pas, tout est bien
mais
jai cette erreur:
Parse error: parse error in c:\program files\easyphp1-8\www\infos_sql.php on line 3

cette ligne (la ligne 3) correspone a ceci:
$login = "root"

je suis en local avec EasyPhp la dernierre version telecharger depuis leur site web ( donc pas de probaime pour la version je crois )

vous pouvez m'aidai

signaler à un administrateur
Commentaire de webdeb le 28/08/2006 10:06:39

Ajoute un point virgule à la fin de l'assignation de la variable :

$login = "root";

++

signaler à un administrateur
Commentaire de Le Prince Dragon le 31/08/2006 18:03:35

on core un problaime
la page d'ajout marche mes l'affichage non:
Notice: Undefined index: posted in c:\program files\easyphp1-8\www\guestbook.php on line 9

signaler à un administrateur
Commentaire de BruceL le 14/01/2007 17:32:07

Bonjour, je viens de suivre ce tuto qui est très intéressant,
Cependant, j'ai un problème, le même que Le Prince Dragon :
tout fonctionne très bien, enregistremen tet affichage, cependant ce message d'erreur s'affiche :
Notice: Undefined index: poste in W:\var\www\site\guestbook.php on line 9
Si qelqu'un pourrait m'éclairer la dessus, merci.

signaler à un administrateur
Commentaire de tibob135 le 04/12/2007 01:51:05

Copieur du site du zero?

signaler à un administrateur
Commentaire de nepi le 23/12/2007 20:02:37

Tuto très interessant, bravo et merci =)

Bonne soirée, Florian.

Note : 9/10.

signaler à un administrateur
Commentaire de nepi le 23/12/2007 20:03:50

Tuto très interressant, merci beaucoup.

Bonne soirée,
Florian.

Note : 9/10.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,156 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.