PHP Projects: Δημιουργήστε μια εφαρμογή δημοσκόπησης

⚡ Έξυπνη Σύνοψη

Αυτό το έργο PHP δημιουργεί μια εφαρμογή δημοσκόπησης από την αρχή, συνδέοντας προηγούμενα μαθήματα σε ένα λειτουργικό παράδειγμα. Χωρίζει την εφαρμογή σε έναν μπροστινό ελεγκτή, ένα μοντέλο επιχειρηματικής λογικής και αρχεία προβολής, και στη συνέχεια αποθηκεύει και μετράει ψήφους για ένα αγαπημένο. JavaΒιβλιοθήκη σεναρίων σε ένα MySQL βάση δεδομένων.

  • 🧭 Μπροστινό χειριστήριο: Ένα μοναδικό σημείο εισόδου index.php αποφασίζει ποια προβολή θα φορτωθεί, δίνοντας στην εφαρμογή ένα ελεγχόμενο σημείο για τη δρομολόγηση αιτημάτων.
  • 🧠 Επιχειρηματική Λογική: Μια κλάση μοντέλου χειρίζεται όλη την εργασία στη βάση δεδομένων, διατηρώνταςping πρόσβαση στα δεδομένα ξεχωριστά από την παρουσίαση για ευκολότερη συντήρηση.
  • Προβολή αρχείων: Τα αρχεία προβολής .html.php περιέχουν τη φόρμα δημοσκόπησης και τη σελίδα αποτελεσμάτων, συνδυάζοντας HTML με μικρές ετικέτες εξόδου PHP.
  • 🗃️ Πίνακας βάσης δεδομένων: Ένας μεμονωμένος πίνακας js_libraries αποθηκεύει κάθε ψήφο ως αριθμό επιλογής και χρονική σήμανση, που κωδικοποιείται από ένα αναγνωριστικό αυτόματης αύξησης.
  • Επικύρωση: Ενα μικρό JavaΟ έλεγχος σεναρίου προειδοποιεί τον χρήστη όταν η φόρμα υποβάλλεται χωρίς να επιλεγεί κάποια βιβλιοθήκη.
  • 📊 Καταμέτρηση ψήφων: Ο ελεγκτής εισάγει την ψήφο και, στη συνέχεια, εκτελεί COUNT ερωτήματα ανά επιλογή για να δημιουργήσει τον πίνακα αποτελεσμάτων.
  • 🤖 AI Assist: Τα εργαλεία τεχνητής νοημοσύνης μπορούν να επεκτείνουν αυτήν την δημοσκόπηση σε μια πλήρη εφαρμογή έρευνας και να ελέγξουν τον κώδικα για σφάλματα και προβλήματα ασφαλείας.

Εφαρμογή Δημοσκόπησης PHP

Πώς να δημιουργήσετε μια εφαρμογή δημοσκόπησης γνώμης χρησιμοποιώντας PHP

Σε αυτό το έργο PHP, θα δημιουργήσουμε μια εφαρμογή δημοσκόπησης.

Η δημοσκόπηση θα αποτελείται από 3 βασικά στοιχεία:

Μπροστινό χειριστήριο – αυτή είναι η σελίδα ευρετηρίου που θα καθορίσει τον κώδικα HTML που θα φορτωθεί. Αυτό διασφαλίζει ότι η εφαρμογή μας έχει ένα μόνο σημείο εισόδου, το οποίο μας δίνει μεγαλύτερο έλεγχο επί της εφαρμογής.

Επαγγελματική λογική – αυτό θα περιέχει τον κώδικα PHP για την αλληλεπίδραση με τη βάση δεδομένων. Αυτό μας επιτρέπει να διαχωρίσουμε την επιχειρηματική λογική από την παρουσίαση, καθιστώντας την εφαρμογή μας εύκολη στη συντήρηση.

Προβολές – αυτό θα περιέχει τον κώδικα HTML. Θα έχουμε δύο σελίδες, δηλαδή:

  • opinion.html.php – θα περιέχει τον κώδικα HTML με την ερώτηση και τις επιλογές
  • results.html.php – θα περιέχει τον κώδικα HTML που εμφανίζει τα αποτελέσματα της δημοσκόπησης

Υποθέσεις που έγιναν

Η δημοσκόπηση θα θέσει το ερώτημα: Ποιο είναι το αγαπημένο σας; JavaΓραφή Βιβλιοθήκη?

Οι απαντήσεις θα ήταν:

  • JQuery
  • MooTools
  • Βιβλιοθήκη YUI
  • Λάμψη

Ακολουθούν τα βήματα για τη δημιουργία της εφαρμογής.

Βήμα 1) Συνδεσιμότητα βάσης δεδομένων

Αυτή η ενότητα προϋποθέτει τη γνώση MySQL και πώς να το χορηγήσετε. Εάν δεν είστε εξοικειωμένοι με MySQL, ελέγξτε μας Εκμάθηση SQL τμήμα.

Η εφαρμογή μας θα έχει μόνο έναν πίνακα, με 3 πεδία, συγκεκριμένα:

  • id – αριθμός που δημιουργείται αυτόματα ως πρωτεύον κλειδί
  • επιλογή – ο αριθμός που αντιπροσωπεύει την επιλεγμένη JavaΒιβλιοθήκη σεναρίων
  • ts – η χρονική σήμανση για την ψηφοφορία

Το παρακάτω σενάριο δημιουργεί τον πίνακα js_libraries.

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`)
);

Βήμα 2) Κωδικοποίηση της εφαρμογής μας

Ας δημιουργήσουμε τώρα το επίπεδο επιχειρηματικής λογικής που θα χειριστεί τη συνδεσιμότητα της βάσης δεδομένων. 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_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);
}
 
}
 
?>

ΕΔΩ,

  • Η "δημόσια συνάρτηση __construct()" είναι η μέθοδος κατασκευής κλάσης που χρησιμοποιείται για τη δημιουργία της σύνδεσης της βάσης δεδομένων
  • Η «public function execute_query(…)» είναι η μέθοδος για την εκτέλεση ερωτημάτων όπως εισαγωγή, ενημέρωση και διαγραφή
  • Η «επιλογή δημόσιας συνάρτησης(…)» είναι η μέθοδος για την ανάκτηση δεδομένων από το βάσεις δεδομένων και επιστρέφοντας έναν πίνακα.
  • Η "δημόσια συνάρτηση insert(…)" είναι η μέθοδος εισαγωγής που καλεί τη μέθοδο execute_query.
  • Η "δημόσια συνάρτηση __destruct()" είναι ο καταστροφέας κλάσης που κλείνει τη σύνδεση της βάσης δεδομένων.

Ας δημιουργήσουμε τώρα τον μπροστινό ελεγκτή 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';
 
?>

ΕΔΩ,

  • "απαιτείται 'opinion_poll_model.php';" φορτώνει την κλάση επιχειρηματικής λογικής
  • "$model = new Opinion_poll_model();" δημιουργεί ένα παράδειγμα της κατηγορίας επιχειρηματικής λογικής
  • "if (count($_POST) == 1)…" εκτελεί την επικύρωση δεδομένων και χρησιμοποιεί JavaΣκριπτ για την εμφάνιση ενός πλαισίου μηνύματος εάν δεν έχει ψηφιστεί κανένας υποψήφιος.
  • Η συνάρτηση «if (count($_POST) > 1)…» ελέγχει εάν έχει επιλεγεί μια ψήφος μετρώντας τον αριθμό των στοιχείων στον πίνακα $_POST. Εάν δεν έχει επιλεγεί κανένα στοιχείο, ο πίνακας $_POST θα περιέχει μόνο το στοιχείο υποβολής. Εάν έχει επιλεγεί μια βιβλιοθήκη, ο πίνακας $_POST θα έχει δύο στοιχεία, τα στοιχεία υποβολής και ψήφου. Αυτός ο κώδικας εισάγει επίσης μια νέα εγγραφή ψήφου και στη συνέχεια εμφανίζει τη σελίδα αποτελεσμάτων.
  • Η συνάρτηση «έξοδος;» χρησιμοποιείται για τον τερματισμό της εκτέλεσης του σεναρίου μετά την εμφάνιση των αποτελεσμάτων, έτσι ώστε να μην εμφανίζεται η φόρμα δημοσκόπησης.
  • "απαιτείται "opinion.html.php";" εμφανίζει τη φόρμα δημοσκόπησης εάν δεν έχει επιλεγεί τίποτα.

Ας δημιουργήσουμε τώρα τις προβολές. 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" />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>

results.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>

Βήμα 3) Δοκιμή της εφαρμογής μας

Υποθέτοντας ότι έχετε αποθηκεύσει τα αρχεία στον φάκελο opinionpoll, μεταβείτε στο URL http://localhost/opinionpoll/

Δοκιμή μιας εφαρμογής δημοσκόπησης

Εάν κάνετε κλικ στο κουμπί OK χωρίς να επιλέξετε μια βιβλιοθήκη JS, θα εμφανιστεί το ακόλουθο πλαίσιο μηνύματος.

Δοκιμή μιας εφαρμογής δημοσκόπησης

Επιλέξτε μια βιβλιοθήκη JS και, στη συνέχεια, κάντε κλικ στο κουμπί OK. Θα εμφανιστεί μια σελίδα αποτελεσμάτων παρόμοια με αυτήν που φαίνεται παρακάτω.

Δοκιμή μιας εφαρμογής δημοσκόπησης

Τρόποι βελτίωσης της εφαρμογής δημοσκόπησης γνώμης

Αυτό το έργο αποτελεί μια σταθερή βάση. Για να είναι έτοιμο για παραγωγή, λάβετε υπόψη τις ακόλουθες βελτιώσεις:

  • Χρησιμοποιήστε έτοιμες δηλώσεις στο μοντέλο για την εξάλειψη του κινδύνου ένεσης SQL από τα συνενωμένα ερωτήματα.
  • Αποτροπή διπλής ψηφοφορίας με ένα cookie, μια σημαία περιόδου σύνδεσης ή καταγράφοντας τη διεύθυνση IP του ψηφοφόρου δίπλα στη χρονική σήμανση.
  • Εμφάνιση ποσοστών και γραφήματος ράβδων στη σελίδα αποτελεσμάτων αντί για ακατέργαστες μετρήσεις, για μια πιο σαφή εικόνα του αποτελέσματος.
  • Κάντε τη δημοσκόπηση δυναμική αποθηκεύοντας την ερώτηση και τις επιλογές στη βάση δεδομένων, ώστε να μπορείτε να επαναχρησιμοποιήσετε τον κώδικα για οποιαδήποτε δημοσκόπηση.

Συχνές Ερωτήσεις

Ο μπροστινός ελεγκτής δρομολογεί κάθε αίτημα μέσω ενός μόνο σημείου εισόδου, συνήθως του index.php, το οποίο στη συνέχεια φορτώνει τη σωστή λογική και προβολή. Συγκεντρώνει τη δρομολόγηση, τον έλεγχο ταυτότητας και την κοινόχρηστη ρύθμιση και αποτελεί τη βάση των περισσότερων πλαισίων PHP.

Συνήθεις προσεγγίσεις είναι η εγκατάσταση ενός cookie μετά την ψηφοφορία, η σήμανση της συνεδρίας ως ψηφισμένης ή η αποθήκευση της διεύθυνσης IP και της χρονικής σήμανσης του ψηφοφόρου στη βάση δεδομένων. Καμία δεν είναι αλάνθαστη, επομένως συνδυάστε μεθόδους ή απαιτήστε σύνδεση για αυστηρότερο έλεγχο.

Αντικαταστήστε τα συνενωμένα ερωτήματα με προετοιμασμένες εντολές σε mysqli ή PDO, συνδέοντας την τιμή ψήφου ως παράμετρο. Επίσης, επαληθεύστε ότι η επιλογή είναι ένας από τους αναμενόμενους αριθμούς πριν φτάσει ποτέ στο ερώτημα.

Ναι. Η Τεχνητή Νοημοσύνη μπορεί να προσθέσει πολλές ερωτήσεις, δυναμικές επιλογές από τη βάση δεδομένων, ποσοστά αποτελεσμάτων με γράφημα και σελίδα διαχειριστή. Περιγράψτε τις λειτουργίες που θέλετε και, στη συνέχεια, ελέγξτε και δοκιμάστε τον δημιουργημένο κώδικα πριν από την ανάπτυξη.

Ναι. Επικολλήστε το μοντέλο, τον ελεγκτή και τις προβολές και η τεχνητή νοημοσύνη μπορεί να εντοπίσει απροσδιόριστες μεταβλητές, ελλείποντα ορίσματα σύνδεσης, κινδύνους έγχυσης και έξοδο χωρίς διαφυγή και, στη συνέχεια, να προτείνει διορθωμένες, ασφαλέστερες εκδόσεις για δοκιμή.

Συνοψίστε αυτήν την ανάρτηση με: