PHP Projects: Create an Opinion Poll Application
โก Smart Summary
This PHP project builds an opinion poll application from scratch, tying together earlier lessons into one working example. It splits the app into a front controller, a business logic model, and view files, then stores and counts votes for a favorite JavaScript library in a MySQL database.

How to Create an Opinion Poll Application Using PHP
In this PHP project, we are going to create an opinion poll application.
The opinion poll will consist of 3 major components:
Front controller โ this is the index page that will determine the HTML code to be loaded. This ensures that our application has a single entry point, which gives us more control over the application.
Business Logic โ this will contain the PHP code for interacting with the database. This allows us to separate the business logic from the presentation, making our application easy to maintain.
Views โ this will contain the HTML code. We will have two pages, namely:
- opinion.html.php โ this will contain the HTML code with the question and options
- results.html.php โ this will contain the HTML code that displays the opinion poll results
Assumptions made
The opinion poll will ask the question: What is your favorite JavaScript Library?
Answers would be:
- JQuery
- MooTools
- YUI Library
- Glow
Here are the steps to create the application.
Step 1) Database Connectivity
This section assumes knowledge of MySQL and how to administer it. If you are not familiar with MySQL, check our SQL tutorials section.
Our application will have one table only, with 3 fields, namely:
- id โ auto-generated number as the primary key
- choice โ the number representing the chosen JavaScript library
- ts โ the timestamp for the vote
The script below creates our js_libraries table.
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`) );
Step 2) Coding our application
Let us now create our business logic layer that will handle the database connectivity. 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); } } ?>
HERE,
- “public function __construct()” is the class constructor method that is used to establish the database connection
- “public function execute_query(โฆ)” is the method for executing queries such as insert, update, and delete
- “public function select(โฆ)” is the method for retrieving data from the database and returning an array.
- “public function insert(โฆ)” is the insert method that calls the execute_query method.
- “public function __destruct()” is the class destructor that closes the database connection.
Let us now create the front controller 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'; ?>
HERE,
- “require ‘opinion_poll_model.php’;” loads the business logic class
- “$model = new Opinion_poll_model();” creates an instance of the business logic class
- “if (count($_POST) == 1)โฆ” performs the data validation and uses JavaScript to display a message box if no candidate has been voted for.
- “if (count($_POST) > 1)โฆ” checks if a vote has been selected by counting the number of items in the $_POST array. If no item has been selected, the $_POST will only contain the submit item. If a library has been chosen, the $_POST array will have two elements, the submit and vote items. This code also inserts a new vote record and then displays the results page.
- “exit;” is used to terminate the script execution after the results have been displayed, so that the opinion poll form is not displayed.
- “require ‘opinion.html.php’;” displays the opinion poll form if nothing has been selected.
Let us now create the views. 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>
Step 3) Testing our application
Assuming you have saved the files in the opinionpoll folder, browse to the URL http://localhost/opinionpoll/
If you click on the OK button without selecting a JS library, you will get the following message box.
Select a JS library, then click on the OK button. You will get a results page similar to the one shown below.
Ways to Improve the Opinion Poll App
This project is a solid foundation. To make it production ready, consider the following improvements:
- Use prepared statements in the model to eliminate the SQL injection risk from the concatenated queries.
- Prevent double voting with a cookie, a session flag, or by recording the voter’s IP address alongside the timestamp.
- Show percentages and a bar chart on the results page instead of raw counts, for a clearer view of the outcome.
- Make the poll dynamic by storing the question and options in the database, so you can reuse the code for any poll.



