PHP-projecten: maak een opiniepeilingtoepassing
⚡ Slimme samenvatting
Dit PHP-project bouwt een opiniepeilingapplicatie helemaal vanaf nul op en combineert eerdere lessen in één werkend voorbeeld. De applicatie is opgedeeld in een frontcontroller, een businesslogica-model en weergavebestanden, en slaat vervolgens stemmen op en telt deze voor een favoriet. JavaScriptbibliotheek in een MySQL database.

Hoe maak je een opiniepeiling-applicatie met PHP?
In dit PHP-project gaan we een applicatie voor opiniepeilingen maken.
De opiniepeiling zal uit 3 belangrijke onderdelen bestaan:
Voorste controleur – Dit is de indexpagina die bepaalt welke HTML-code geladen moet worden. Dit zorgt ervoor dat onze applicatie één enkel toegangspunt heeft, wat ons meer controle over de applicatie geeft.
Zakelijke logica – Dit bevat de PHP-code voor de interactie met de database. Hierdoor kunnen we de bedrijfslogica scheiden van de presentatie, wat het onderhoud van onze applicatie vereenvoudigt.
Weergaves – dit bevat de HTML-code. We zullen twee pagina's hebben, namelijk:
- opinie.html.php – dit bevat de HTML-code met de vraag en opties
- results.html.php – dit bevat de HTML-code die de resultaten van de opiniepeiling weergeeft
Aannames gemaakt
In de opiniepeiling wordt de vraag gesteld: Wat is jouw favoriete JavaScript Bibliotheek?
De antwoorden zouden zijn:
- JQuery
- MooTools
- YUI-bibliotheek
- Glow
Hieronder volgen de stappen om de applicatie te maken.
Stap 1) Databaseconnectiviteit
Dit onderdeel veronderstelt kennis van MySQL en hoe je het moet toedienen. Als je niet bekend bent met MySQL, check onze SQL-tutorials pagina.
Onze applicatie zal slechts één tabel bevatten, met 3 velden, namelijk:
- id – automatisch gegenereerd nummer als primaire sleutel
- keuze – het getal dat de gekozen optie vertegenwoordigt JavaScriptbibliotheek
- ts – de tijdstempel voor de stemming
Met het onderstaande script wordt onze tabel js_libraries gemaakt.
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`) );
Stap 2) Coderen van onze applicatie
Laten we nu de bedrijfslogica-laag creëren die de databaseverbinding zal afhandelen. opiniepeiling_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_connect_error()); if (!mysqli_select_db($this->db_handle, $this->db)) die("Unable to select database: " . mysqli_error($this->db_handle)); } private function execute_query($sql_stmt) { $result = mysqli_query($this->db_handle, $sql_stmt); // execute SQL statement return !$result ? FALSE : TRUE; } public function select($sql_stmt) { $result = mysqli_query($this->db_handle, $sql_stmt); if (!$result) die("Database access failed: " . mysqli_error($this->db_handle)); $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); } } ?>
HIER,
- “public function __construct()” is de klassenconstructormethode die wordt gebruikt om de databaseverbinding tot stand te brengen
- “public function execute_query(…)” is de methode voor het uitvoeren van query's zoals invoegen, bijwerken en verwijderen.
- “public function select(…)” is de methode voor het ophalen van gegevens uit de databank en het retourneren van een array.
- “public function insert(…)” is de insert-methode die de execute_query-methode aanroept.
- “public function __destruct()” is de klassendestructor die de databaseverbinding sluit.
Laten we nu de frontcontroller maken. index.php
<?php require 'opinion_poll_model.php'; $model = new Opinion_poll_model(); if (count($_POST) == 1) { echo "<script>alert(1);</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,3)"; $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'; ?>
HIER,
- “vereis 'opinion_poll_model.php';” laadt de klasse bedrijfslogica
- “$model = nieuw Opinion_poll_model();” creëert een exemplaar van de bedrijfslogicaklasse
- “if (count($_POST) == 1)...” voert de gegevensvalidatie uit en gebruikt JavaScript om een berichtvenster weer te geven als er op geen enkele kandidaat is gestemd.
- De code “if (count($_POST) > 1)…” controleert of er een stem is uitgebracht door het aantal items in de array $_POST te tellen. Als er geen item is geselecteerd, bevat $_POST alleen het item 'submit'. Als er een bibliotheek is gekozen, bevat de array $_POST twee elementen: het item 'submit' en het item 'vote'. Deze code voegt ook een nieuw stemrecord toe en toont vervolgens de resultatenpagina.
- "exit;" wordt gebruikt om de uitvoering van het script te beëindigen nadat de resultaten zijn weergegeven, zodat het opiniepeilingformulier niet wordt getoond.
- “vereis 'opinion.html.php';” geeft het opiniepeilingformulier weer als er niets is geselecteerd.
Laten we nu de weergaven creëren. mening.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" />MooTools <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>
resultaten.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>
Stap 3) Onze applicatie testen
Als je de bestanden in de map 'opinionpoll' hebt opgeslagen, ga dan naar de betreffende map. URL http://localhost/opinionpoll/
Als u op de OK-knop klikt zonder een JS-bibliotheek te selecteren, krijgt u het volgende berichtvenster te zien.
Selecteer een JavaScript-bibliotheek en klik vervolgens op de knop OK. Je krijgt een resultatenpagina te zien die lijkt op de pagina hieronder.
Manieren om de opiniepeiling-app te verbeteren
Dit project vormt een solide basis. Om het productieklaar te maken, kunt u de volgende verbeteringen overwegen:
- Gebruik voorbereide verklaringen In het model is het risico op SQL-injectie bij de gecombineerde query's geëlimineerd.
- Voorkom dubbel stemmen met behulp van een cookie, een sessievlag of door het IP-adres van de kiezer samen met het tijdstempel vast te leggen.
- Toon percentages en een staafdiagram. Op de resultatenpagina worden de aantallen weergegeven in plaats van de ruwe cijfers, voor een duidelijker beeld van de uitkomst.
- Maak de enquête dynamisch Door de vraag en antwoordopties in de database op te slaan, kunt u de code hergebruiken voor elke enquête.



