Projets PHP : créer une application de sondage d'opinion

Dans ce projet PHP, nous allons créer une application de sondage d'opinion.

Le sondage d'opinion comprendra 3 composantes principales ;

Contrôleur frontal – c’est la page d’index qui déterminera le code HTML à charger. Cela garantira que notre application dispose d’un point d’entrée unique. Cela nous donnera plus de contrôle sur l'application.

Logique métier – celui-ci contiendra le code PHP pour interagir avec la base de données. Cela nous permettra de séparer la logique métier de la présentation, ce qui rendra notre application facile à maintenir.

Vues – celui-ci contiendra le code HTML. Nous aurons deux pages à savoir ;

  • opinion.html.php – celui-ci contiendra le code HTML avec la question et les options
  • results.html.php – celui-ci contiendra le code HTML qui affiche les résultats du sondage d’opinion

Hypothèses formulées

Le sondage d’opinion posera la question –

Quel est ton préféré Javascénario Bibliothèque?

Les réponses seraient

  • JQuery
  • MooTools
  • Bibliothèque YUI
  • Lueur

Voici les étapes pour créer l’application –

Étape 1) Connectivité de la base de données

Cette section suppose la connaissance de MySQL et comment l'administrer, si vous ne les connaissez pas MySQL, consultez notre Tutoriels SQL .

Notre application n'aura qu'une seule table avec 3 champs à savoir ;

  • id – numéro généré automatiquement comme clé primaire
  • choix – le numéro représentant un candidat à la présidentielle
  • ts – l'horodatage du vote

Le script ci-dessous crée notre table js_libraries.

<?php
CREATE TABLE `js_libraries` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `choice` tinyint(4) NOT NULL DEFAULT '0',

  `ts` timestamp NULL DEFAULT NULL,

  PRIMARY KEY (`id`)

);
?>

Étape 2) Codage de notre application

Créons maintenant notre couche de logique métier qui gérera la connectivité de la base de données. 'opinion_poll_model.php'

<?php

class Opinion_poll_model {

 private $db_handle; private $host = 'localhost'; private $db = 'opinion_poll';private $uid = 'root'; private $pwd = 'melody';

    public function __construct() {

        $this->db_handle = mysqli_connect($this->host, $this->uid, $this->pwd); //connect to MySQL server

        if (!$this->db_handle) die("Unable to connect to MySQL: " . mysqli_error());

        if (!mysqli_select_db($this->db_handle,$this->db)) die("Unable to select database: " . mysqli_error());

    }

    private function execute_query($sql_stmt) {

        $result = mysqli_query($db_handle,$sql_stmt); //execute SQL statement

        return !$result ? FALSE : TRUE;

    }

    public function select($sql_stmt) {

        $result = mysqli_query($db_handle,$sql_stmt);

        if (!$result) die("Database access failed: " . mysqli_error());

        $rows = mysqli_num_rows($result);

        $data = array();

        if ($rows) {

            while ($row = mysqli_fetch_array($result)) {

                $data = $row;

            }

        }

        return $data;

    }
    public function insert($sql_stmt) {

        return $this->execute_query($sql_stmt);

    }

    public function __destruct(){

        mysqli_close($this->db_handle);

    }

}

?>

ICI,

  • « fonction publique __construct() » est la méthode de constructeur de classe utilisée pour établir la connexion à la base de données
  • « fonction publique exécuter_query(…) » est la méthode pour exécuter des requêtes telles que l'insertion, la mise à jour et la suppression
  • « public function select » est la méthode permettant de récupérer des données à partir du base de données et renvoyer un tableau numérique.
  • « public function insert(…) » est la méthode d'insertion qui appelle la méthodeexecute_query.
  • « fonction publique __destruct() » est le destructeur de classe qui ferme la connexion à la base de données.

Créons maintenant le contrôleur frontal index.php

<?php

require 'opinion_poll_model.php';

$model = new Opinion_poll_model();

if (count($_POST) == 1) {

    echo "<script>alert('You did not vote!');</script>";

}

if (count($_POST) > 1) {

    $ts = date("Y-m-d H:i:s");

    $option = $_POST['vote'][0];

    $sql_stmt = "INSERT INTO js_libraries (`choice`,`ts`) VALUES ($option,'$ts')";

    $model->insert($sql_stmt);

    $sql_stmt = "SELECT COUNT(choice) choices_count FROM js_libraries;";

    $choices_count = $model->select($sql_stmt);

    $libraries = array("", "JQuery", "MooTools", "YUI Library", "Glow");

    $table_rows = '';

    for ($i = 1; $i < 5; $i++) {

        $sql_stmt = "SELECT COUNT(choice) choices_count FROM js_libraries WHERE choice = $i;";

        $result = $model->select($sql_stmt);

        $table_rows .= "<tr><td>" . $ libraries [$i] . " Got:</td><td><b>" . $result[0] . "</b> votes</td></tr>";

    }

    require 'results.html.php';

    exit;

}

require 'opinion.html.php';

?>

ICI,

  • "exiger 'opinion_poll_model.php';" charge la classe de logique métier
  • "$model = nouveau Opinion_poll_model();" crée une instance de la classe de logique métier
  • «if (count($_POST) == 1)…» effectue la validation des données et utilise JavaScript pour afficher une boîte de message si aucun candidat n'a été voté.
  • « if (count($_POST) > 1)… » vérifie si un vote a été sélectionné en comptant le nombre d'éléments dans le tableau $_POST. Si aucun élément n'a été sélectionné, le $_POST ne contiendra que l'élément soumis. Si un candidat a été choisi, le tableau $_POST comportera deux éléments, l'élément de soumission et l'élément de vote. Ce code sert également à insérer un nouvel enregistrement de vote puis à afficher la page des résultats
  • "sortie;" permet de terminer l'exécution du script après l'affichage des résultats afin que le formulaire de sondage d'opinion ne soit pas affiché.
  • "exiger 'opinion.html.php';" affiche le formulaire de sondage d'opinion si rien n'a été sélectionné.

Créons maintenant les vues. opinion.html.php

<html>
    <head>
        <title>JavaScript Libraries - Opinion Poll</title>
    </head>
    <body>

        <h2>JavaScript Libraries - Opinion Poll</h2>

        <p><b>What is your favorite JavaScript?</b></p>

        <form method="POST" action="index.php">

            <p> <input type="radio" name="vote" value="1" />JQuery

                <br /><input type="radio" name="vote" value="2" />MooToolsl

                <br /><input type="radio" name="vote" value="3" />YUI Library

                <br /><input type="radio" name="vote" value="4" />Glow

            </p>

            <p><input type="submit" name="submitbutton" value="OK" /></p>

        </form>

    </body>

</html>

résultats.html.php

<html>

    <head>

        <title>JavaScript Libraries Poll Results</title>

    </head>

    <body>

        <h2>Opinion Poll Results</h2>

        <p><b>What is your favorite JavaScript Library?</b></p>

        <p><b><?php echo $choices_count[0]; ?></b> people have thus far taken part in this poll:</p>

        <p>
<table>

            <?php echo($table_rows); ?>
        </table>
</body>
</html>

Étape 3) Tester notre application

En supposant que vous avez enregistré les fichiers dans le dossier opinionpoll, accédez à l'URL http://localhost/opinionpoll/

Tester une application de sondage d'opinion

Si vous cliquez sur le bouton Ok sans sélectionner de bibliothèque JS, vous obtiendrez la boîte de message suivante.

Tester une application de sondage d'opinion

Sélectionnez une bibliothèque JS puis cliquez sur le bouton OK. Vous obtiendrez la page de résultats similaire à celle présentée ci-dessous.

Tester une application de sondage d'opinion

Résumé

  • Diviser votre application en logique métier et en couches de vue du contrôleur frontal est une bonne pratique de conception d'applications
  • JavaLe script est utile pour effectuer une validation côté client
  • C'est une bonne pratique de programmation d'utiliser file.html.php pour les fichiers contenant à la fois du HTML et du HTML. Codes PHP
  • L'application de sondage d'opinion montre comment les connaissances acquises dans les leçons précédentes peuvent être mises en commun pour développer une application fonctionnelle avec une base de données back-end.