Sling Academy
Home/PHP/PHP & MySQL: How to filter data by date range

PHP & MySQL: How to filter data by date range

Last updated: January 13, 2024

Introduction

Working with databases is an essential skill for any web developer, and being able to filter data effectively is critical for creating interactive, data-driven applications. In this tutorial, we’ll go through the process of filtering data by date range using PHP and MySQL. This can be especially useful for generating reports, showing time-specific records, or creating dashboards with historical data.

Prerequisites

  • A working PHP environment (XAMPP, MAMP, etc.)
  • A MySQL database and understanding of basic SQL queries
  • A text editor or PHP IDE

Setting Up the Database

Let’s assume you have a table named ‘events’ with the following columns: ‘id’, ‘title’, ‘description’, ‘start_date’, and ‘end_date’. The ‘start_date’ and ‘end_date’ columns are of the type DATE or DATETIME, depending on your specific needs.

CREATE TABLE events (
  id INT PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(255) NOT NULL,
  description TEXT,
  start_date DATE,
  end_date DATE
);

Preparing the PHP Script

To query the database, the PHP script will use two input parameters corresponding to the beginning and end of the date range.

$startDate = $_GET['start_date'];
$endDate = $_GET['end_date'];

Note: In a real application, you should validate and sanitize user input to prevent SQL injection and other security issues.

Connecting to MySQL

Using PHP’s PDO extension, we’ll create a connection to the MySQL database:

$dsn = 'mysql:host=localhost;dbname=your_database_name';
$username = 'your_database_username';
$password = 'your_database_password';

try {
  $pdo = new PDO($dsn, $username, $password);
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
  echo 'Connection failed: ' . $e->getMessage();
}

Building the Query

With the connection established, we build an SQL query to select events where the start or end date falls within the specified range:

$sql = 'SELECT * FROM events WHERE (start_date >= :start_date AND start_date <= :end_date) OR (end_date >= :start_date AND end_date <= :end_date)';
$statement = $pdo->prepare($sql);
$statement->bindValue(':start_date', $startDate);
$statement->bindValue(':end_date', $endDate);
$statement->execute();
$events = $statement->fetchAll(PDO::FETCH_ASSOC);

This code uses named placeholders (‘:start_date’ and ‘:end_date’) for parameter binding, which is a secure way to pass values into a prepared statement.

Displaying the Results

The resulting array of events can then be looped through and displayed:

foreach ($events as $event) {
  echo '<h3>' . htmlspecialchars($event['title']) . '</h3>';
  echo '<p>' . htmlspecialchars($event['description']) . '</p>';
  echo '<p>Start: ' . $event['start_date'] . '</p>';
  echo '<p>End: ' . $event['end_date'] . '</p>';
}

Front-End Form

If integrating this into a user interface, create a simple HTML form to allow the selection of start and end dates:

<form action="your_php_script.php" method="get">
  <label for="start_date">Start Date:</label>
  <input type="date" id="start_date" name="start_date" required>
  <label for="end_date">End Date:</label>
  <input type="date" id="end_date" name="end_date" required>
  <button type="submit">Filter</button>
</form>

Handling Timezones

Be aware of the timezone settings of your PHP environment and MySQL server. Use the date_default_timezone_set() function in PHP to set the desired timezone and ensure that dates are stored correctly in the database.

Security Considerations

SQL injection is a serious risk. Always use prepared statements to avoid these types of attacks. Avoid concatenating or interpolating user-provided data directly into SQL queries.

Conclusion

Filtering data by date range can greatly increase the functionality of your web applications. With PHP and MySQL, fetching this data security is straightforward, as long as you follow best practices for input validation and secure database connections.

Practice implementing the given examples and experiment with more complex filtering criteria to further your understanding of PHP and MySQL database interactions.

Next Article: PHP & MySQL: How to get the latest record from a table

Previous Article: PHP & MySQL: Count number of rows in a table (with & without conditions)

Series: Building Dynamic Web Pages with PHP

PHP

You May Also Like

  • Pandas DataFrame.value_counts() method: Explained with examples
  • Constructor Property Promotion in PHP: Tutorial & Examples
  • Understanding mixed types in PHP (5 examples)
  • Union Types in PHP: A practical guide (5 examples)
  • PHP: How to implement type checking in a function (PHP 8+)
  • Symfony + Doctrine: Implementing cursor-based pagination
  • Laravel + Eloquent: How to Group Data by Multiple Columns
  • PHP: How to convert CSV data to HTML tables
  • Using ‘never’ return type in PHP (PHP 8.1+)
  • Nullable (Optional) Types in PHP: A practical guide (5 examples)
  • Explore Attributes (Annotations) in Modern PHP (5 examples)
  • An introduction to WeakMap in PHP (6 examples)
  • Type Declarations for Class Properties in PHP (5 examples)
  • Static Return Type in PHP: Explained with examples
  • PHP: Using DocBlock comments to annotate variables
  • PHP: How to ping a server/website and get the response time
  • PHP: 3 Ways to Get City/Country from IP Address
  • PHP: How to find the mode(s) of an array (4 examples)
  • PHP: Calculate standard deviation & variance of an array