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.

  • 🧭 Bedieningspaneel aan de voorzijde: Een enkel index.php-bestand bepaalt welke weergave geladen moet worden, waardoor de applicatie één gecontroleerde plek heeft om verzoeken af ​​te handelen.
  • ???? Bedrijfslogica: Een modelklasse handelt al het databasewerk af, inclusief het bijhouden van gegevens.ping Gegevenstoegang gescheiden van presentatie voor eenvoudiger onderhoud.
  • 🖼️ Bestanden bekijken: De .html.php-viewbestanden bevatten het enquêteformulier en de resultatenpagina, waarbij HTML wordt gecombineerd met kleine PHP-uitvoertags.
  • 🗃️ Databasetabel: Elke stem wordt in één tabel (js_libraries) opgeslagen als een keuzenummer en een tijdstempel, gekoppeld aan een automatisch gegenereerde ID.
  • validatie: Een kleine JavaDe scriptcontrole waarschuwt de gebruiker wanneer het formulier wordt verzonden zonder een bibliotheek te selecteren.
  • 📊 Stemmen tellen: De controller voegt de stem toe en voert vervolgens per optie een COUNT-query uit om de resultatenstabel op te bouwen.
  • 🤖 AI-assistentie: AI-tools kunnen deze enquête uitbreiden tot een volwaardige enquête-app en de code controleren op bugs en beveiligingsproblemen.

PHP-opiniepeilingapplicatie

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/

Een opiniepeilingtoepassing testen

Als u op de OK-knop klikt zonder een JS-bibliotheek te selecteren, krijgt u het volgende berichtvenster te zien.

Een opiniepeilingtoepassing testen

Selecteer een JavaScript-bibliotheek en klik vervolgens op de knop OK. Je krijgt een resultatenpagina te zien die lijkt op de pagina hieronder.

Een opiniepeilingtoepassing testen

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.

Veelgestelde vragen

De frontcontroller leidt elk verzoek via één centraal punt, meestal index.php, dat vervolgens de juiste logica en weergave laadt. Het centraliseert routing, authenticatie en gedeelde configuratie en vormt de basis van de meeste PHP-frameworks.

Gangbare methoden zijn het plaatsen van een cookie na het stemmen, het markeren van de sessie als gestemd, of het opslaan van het IP-adres en de tijdstempel van de stemmer in de database. Geen van deze methoden is waterdicht, dus combineer methoden of vereis een login voor strengere controle.

Vervang de samengevoegde query's door prepared statements in mysqli of PDO, waarbij de stemwaarde als parameter wordt meegegeven. Controleer bovendien of de gekozen waarde een van de verwachte getallen is voordat deze de query bereikt.

Ja. AI kan meerdere vragen toevoegen, dynamische opties uit de database, percentages met een grafiek en een beheerderspagina. Beschrijf de gewenste functies en bekijk en test vervolgens de gegenereerde code voordat u deze implementeert.

Ja. Plak het model, de controller en de views, en de AI kan ongedefinieerde variabelen, ontbrekende verbindingsargumenten, injectierisico's en niet-geëscapte uitvoer detecteren en vervolgens gecorrigeerde, veiligere versies voorstellen om te testen.

Vat dit bericht samen met: