Demystifying PHP: Building a Job Portal Website with Modern Programming Paradigms Print

  • 0

Mastering PHP: A Practical Approach to Building a Job Portal

In this article, we'll delve into practical applications of PHP, focusing on key programming paradigms and design patterns. We'll build a simple job portal website, using concepts of Object-Oriented Programming (OOP), Functional Programming (FP), Asynchronous Programming, Event-Driven Programming, the Model-View-Controller (MVC) pattern, and essential Data Structures & Algorithms.

Part 1: Structuring with Object-Oriented Programming (OOP)

PHP Classes

We'll start with creating classes for the different entities in our application. The `Job` class will represent a job post.


class Job {
private $title;
private $description;
private $salary;

function __construct($title, $description, $salary) {
$this->title = $title;
$this->description = $description;
$this->salary = $salary;
}

// Getters and Setters here
}

Part 2: Functional Programming (FP) Approach

Let's use FP to handle job applications. Here's how we can use a closure to create a function that applies a user to a job:


function applyToJob($user, $job) {
return function() use ($user, $job) {
// apply the user to the job here
};
}

Part 3: Asynchronous Programming

In PHP, asynchronous operations can be achieved using `ReactPHP`. Let's use it to send an email to the job poster when an application is received:


$loop = React\EventLoop\Factory::create();
$timer = $loop->addTimer(0.001, function () use ($user, $job) {
sendEmailToPoster($user, $job);
});
$loop->run();

Part 4: Event-Driven Programming

For event-driven programming, we'll use `Ratchet` library to implement WebSockets. When a user applies for a job, we can push an event to the job poster:


$webSock = new React\Socket\Server('0.0.0.0:8080', $loop);
new Ratchet\Server\IoServer(
new Ratchet\Http\HttpServer(
new Ratchet\WebSocket\WsServer(
new JobApplicationHandler()
)
),
$webSock
);

Part 5: MVC Pattern

In our job portal, let's structure the code using the MVC pattern. Here is a sample structure of a controller:


class JobController {
private $model;

public function __construct(JobModel $model) {
$this->model = $model;
}

public function apply($jobId, $userId) {
$this->model->applyToJob($jobId, $userId);
}
}

Part 6: Data Structures & Algorithms

A common data structure we'll use is an array to store our jobs. For efficient search, we can implement binary search:


function binarySearch($jobs, $targetTitle) {
$left = 0;
$right = count($jobs) - 1;

while ($left <= $right) {
$mid = floor(($left + $right) / 2);

if ($jobs[$mid]->getTitle() < $targetTitle) {
$left = $mid + 1;
} else if ($jobs[$mid]->getTitle() > $targetTitle) {
$right = $mid - 1;
} else {
return $mid;
}
}

return -1;
}

Through this article, we've walked you through creating a basic job portal website using modern PHP concepts. We have only scratched the surface, but this foundation will empower you to explore deeper and create more complex and robust PHP applications. Keep in mind that real-world applications will often involve many more aspects such as authentication, database interactions, security, and more.

Part 7: PHP Database Interactions

Now let's expand our code to interact with a database. We'll use the PDO (PHP Data Objects) extension which provides a data-access abstraction layer.

Establishing a Connection


function connectDB() {
$host = 'localhost';
$db = 'job_portal';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];

try {
$pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

return $pdo;
}

Storing a Job Post

Next, let's write the function to store a job in the database:


function storeJob(Job $job) {
$pdo = connectDB();

$sql = "INSERT INTO jobs (title, description, salary) VALUES (?, ?, ?)";
$stmt= $pdo->prepare($sql);
$stmt->execute([$job->getTitle(), $job->getDescription(), $job->getSalary()]);
}

Part 8: Error Handling

PHP 7 introduced throwable exceptions. We can now catch both exceptions and errors using a single catch block.


try {
// Our database query or other piece of code
} catch (\Throwable $e) {
// Handle exception or error
echo $e->getMessage();
}

Part 9: User Authentication

User authentication is an integral part of many applications. Let's see how you can handle user registration:


function register($username, $password) {
$pdo = connectDB();

// Hash the password before storing it to ensure security
$hashed_password = password_hash($password, PASSWORD_DEFAULT);

$sql = "INSERT INTO users (username, password) VALUES (?, ?)";
$stmt= $pdo->prepare($sql);
$stmt->execute([$username, $hashed_password]);
}

And here's how you can handle user login:


function login($username, $password) {
$pdo = connectDB();

$sql = "SELECT * FROM users WHERE username = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$username]);
$user = $stmt->fetch();

if ($user && password_verify($password, $user['password'])) {
// User is authenticated
$_SESSION['user'] = $user;
return true;
}

return false;
}

This wraps up our introduction to building a job portal in PHP using various programming paradigms. Remember that building a real-world application requires careful thought and planning, and often involves many other considerations not covered here, such as data validation, security, testing, etc. 

Part 10: API Development and Consumption

Today's web is built around the concept of APIs. In the context of our job portal, we might want to expose an API for other systems to use, or consume APIs from other platforms. Let's explore both aspects.

Creating an API

Here is a very simple example of an API endpoint in PHP to get a list of all jobs:


header('Content-Type: application/json');

$pdo = connectDB();

$sql = "SELECT * FROM jobs";
$stmt = $pdo->query($sql);

$jobs = [];
while ($row = $stmt->fetch())
{
$jobs[] = new Job($row['title'], $row['description'], $row['salary']);
}

echo json_encode($jobs);

Consuming an API

Let's say we want to consume an API that gives us the average salary for a particular job title, for setting realistic salary expectations. We can use the `curl` extension in PHP to do this:


function getAverageSalary($title) {
$curl = curl_init();

curl_setopt_array($curl, array(
CURLOPT_URL => "https://api.example.com/salaries?title=".urlencode($title),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => array(
"cache-control: no-cache"
),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
return "cURL Error #:" . $err;
} else {
$responseArray = json_decode($response, true);
return $responseArray['averageSalary'];
}
}

Part 11: Working with Files

File handling is a common task in web applications. Here's how you can handle file uploads in PHP. This can be useful, for example, when a user wants to upload their resume:


if ($_FILES["resume"]["error"] == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["resume"]["tmp_name"];
$name = $_FILES["resume"]["name"];
move_uploaded_file($tmp_name, "uploads/$name");
} else {
echo "File upload error!";
}

Part 12: Handling AJAX Requests

AJAX allows us to refresh parts of a webpage without refreshing the entire page. Here's how you can handle an AJAX request in PHP:


if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
// This is an AJAX request, handle it accordingly
$title = $_POST['title'];

$pdo = connectDB();

$sql = "SELECT * FROM jobs WHERE title LIKE ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$title . '%']);

$jobs = $stmt->fetchAll();

echo json_encode($jobs);
}

Part 13: Front-end Integration with PHP

Your PHP back-end should seamlessly integrate with the front-end. Let's create a form to apply to a job:


<form action="apply.php" method="post">
<label for="jobId">Job ID:</label>
<input type="text" id="jobId" name="jobId">
<label for="userId">User ID:</label>
<input type="text" id="userId" name="userId">
<input type="submit" value="Apply">
</form>

And here's the `apply.php` file:


$jobId = $_POST['jobId'];
$userId = $_POST['userId'];

$jobController = new JobController(new JobModel());
$jobController->apply($jobId, $userId);

echo "Application submitted!";

We've now covered a wide array of PHP programming concepts, touching upon most of the aspects that you'd need to build a job portal website. However, remember that this guide serves as an overview, not a comprehensive guide, so there's still a lot more to explore in PHP and web development in general!

Part 14: Web Security with PHP

In building any web application, security should be a major concern. We've touched upon some aspects of security such as hashing passwords, but there are other considerations too.

Cross-Site Scripting (XSS)

Prevent XSS attacks by escaping output. PHP provides a built-in function for this:


echo htmlspecialchars($string, ENT_QUOTES, 'UTF-8');

Cross-Site Request Forgery (CSRF)

Protect against CSRF attacks by using tokens in your forms:


$_SESSION['token'] = bin2hex(random_bytes(32));

// In your form
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
```

Then, verify this token on form submission:


if ($_POST['token'] != $_SESSION['token']) {
// This could be a CSRF attack!
die("Invalid CSRF token");
}

SQL Injection

We've already seen how to use prepared statements to prevent SQL Injection.

Part 15: Performance Optimization

As your application grows, performance can start to become a concern. Let's look at some ways you can optimize your PHP application:

Use the Latest Version

Always try to use the latest version of PHP, as each version brings performance improvements.

Use a PHP Accelerator

PHP Accelerators such as OPcache can cache compiled PHP bytecode, reducing the need to read and parse scripts on each request.

Optimize Database Queries

Using indexes and writing efficient SQL queries can drastically reduce the load on your database.

Use Content Delivery Networks (CDNs)

CDNs can deliver your static assets such as images, CSS, and JavaScript files from servers close to your users, reducing latency.

Part 16: Automated Testing in PHP

Automated testing is crucial for ensuring the quality of your application. Let's see how you can write a simple unit test with PHPUnit:


use PHPUnit\Framework\TestCase;

class JobTest extends TestCase
{
public function testSetTitle()
{
$job = new Job();
$job->setTitle("Software Engineer");
$this->assertEquals("Software Engineer", $job->getTitle());
}
}

You would then run your tests with the `phpunit` command.

This concludes our deep dive into building a job portal website with PHP. We've covered a wide range of topics, from basic OOP principles to advanced topics like security and performance optimization. Always remember, building a web application is a continuous learning process. Happy coding!

 


Was this answer helpful?

« Back