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.

  • ๐Ÿงญ Front Controller: A single index.php entry point decides which view to load, giving the application one controlled place to route requests.
  • ๐Ÿง  Business Logic: A model class handles all database work, keeping data access separate from presentation for easier maintenance.
  • ๐Ÿ–ผ๏ธ View Files: The .html.php view files hold the poll form and the results page, mixing HTML with small PHP output tags.
  • ๐Ÿ—ƒ๏ธ Database Table: A single js_libraries table stores each vote as a choice number and a timestamp, keyed by an auto-increment id.
  • โœ… Validation: A small JavaScript check warns the user when the form is submitted without selecting any library.
  • ๐Ÿ“Š Counting Votes: The controller inserts the vote, then runs COUNT queries per option to build the results table.
  • ๐Ÿค– AI Assist: AI tools can extend this poll into a full survey app and review the code for bugs and security issues.

PHP Opinion Poll Application

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/

Testing an Opinion Poll Application

If you click on the OK button without selecting a JS library, you will get the following message box.

Testing an Opinion Poll Application

Select a JS library, then click on the OK button. You will get a results page similar to the one shown below.

Testing an Opinion Poll Application

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.

FAQs

The front controller routes every request through a single entry point, usually index.php, which then loads the right logic and view. It centralizes routing, authentication, and shared setup, and is the basis of most PHP frameworks.

Common approaches are setting a cookie after voting, marking the session as voted, or storing the voter’s IP and timestamp in the database. None are foolproof, so combine methods, or require login for stricter control.

Replace the concatenated queries with prepared statements in mysqli or PDO, binding the vote value as a parameter. Also validate that the choice is one of the expected numbers before it ever reaches the query.

Yes. AI can add multiple questions, dynamic options from the database, percentage results with a chart, and an admin page. Describe the features you want, then review and test the generated code before deploying.

Yes. Paste the model, controller, and views, and AI can spot undefined variables, missing connection arguments, injection risks, and unescaped output, then suggest corrected, safer versions to test.

Summarize this post with: