Live stream set for 2025-10-07 at 14:00:00 Eastern
Ask questions in the live chat about any programming or lifestyle topic.
This livestream will be on YouTube or you can watch below.
Build a Simple PHP To-Do List App: Learn CRUD with Best Practices
If you are just starting out with PHP and want a simple, hands-on project to learn server-side logic, forms, and basic database operations, this tutorial is for you. In this post, we will walk through creating a PHP To-Do List application that uses a web form to perform CRUD operations – Create, Read, Update, and Delete.
This beginner-friendly project will introduce you to the foundational elements of PHP and MySQL while demonstrating best practices in form handling, database security, and structuring your code.
What You Will Learn
- How to create a simple HTML form in PHP
- Handling form data using
$_POST
and$_GET
- Using MySQLi or PDO for database interactions
- Best practices for securing user input (e.g. prepared statements)
- Structuring your app with clean, readable code
- Optional: Using basic CSS to improve UI
Project Setup
You will need the following:
- PHP 8+ installed (XAMPP, MAMP, WAMP, or a live server)
- MySQL or MariaDB
- A code editor
- A browser to test your app
Application Features
Here is what our PHP To-Do List will be able to do:
- Add new tasks
- View all tasks
- Edit existing tasks
- Delete tasks
CREATE DATABASE todo_app; USE todo_app; CREATE TABLE tasks ( id INT AUTO_INCREMENT PRIMARY KEY, task VARCHAR(255) NOT NULL );
We will be using a single HTML/PHP form to create and update tasks, with GET parameters to trigger edit and delete actions.
<?php // Database connection $host = 'localhost'; $user = 'root'; $pass = ''; $dbname = 'todo_app'; $conn = new mysqli($host, $user, $pass, $dbname); if ($conn->connect_error) { die('Connection failed: ' . $conn->connect_error); } // Add task if (isset($_POST['add'])) { $task = trim($_POST['task']); if (!empty($task)) { $stmt = $conn->prepare("INSERT INTO tasks (task) VALUES (?)"); $stmt->bind_param("s", $task); $stmt->execute(); $stmt->close(); } header("Location: " . $_SERVER['PHP_SELF']); exit; } // Delete task if (isset($_GET['delete'])) { $id = (int)$_GET['delete']; $stmt = $conn->prepare("DELETE FROM tasks WHERE id = ?"); $stmt->bind_param("i", $id); $stmt->execute(); $stmt->close(); header("Location: " . $_SERVER['PHP_SELF']); exit; } // Get all tasks $result = $conn->query("SELECT * FROM tasks ORDER BY id DESC"); ?> <style> body { font-family: Arial, sans-serif; margin: 40px; } form { margin-bottom: 20px; } input[type="text"] { padding: 8px; width: 300px; } button { padding: 8px 12px; } ul { list-style-type: none; padding: 0; } li { margin: 8px 0; } .delete { color: red; text-decoration: none; margin-left: 10px; } </style> <h2>PHP To-Do List</h2> <form method="POST" action=""> <input type="text" name="task" placeholder="Enter new task" required> <button type="submit" name="add">Add Task</button> </form> <ul> <?php while ($row = $result->fetch_assoc()): ?> <li> <?php echo htmlspecialchars($row['task']); ?> <a href="?delete=<?php echo $row['id']; ?>" class="delete" onclick="return confirm('Delete this task?');">Delete</a> </li> <?php endwhile; ?> </ul>
Best Practices Used
- Prepared Statements with MySQLi to prevent SQL injection
- Input validation and sanitization
- Separation of logic and presentation
- Reusable functions for database operations
- Single file structure
Screenshots And Screencast






Want to Go Deeper?
If you enjoyed this tutorial and want a more structured, in-depth journey into PHP, check out the following resources:
Learning PHP – The Book
A beginner-friendly PHP book covering foundational programming concepts, real-world examples, and challenges to test your understanding.
Learning PHP – The Online Course
This video course complements the book and includes code walkthroughs, exercises, and bonus resources.
Need Help with Your PHP Project?
I am available for:
- One-on-one programming tutorials
- Updating or migrating PHP applications
- Debugging and optimization sessions
Contact Me to schedule a session or ask about custom services.
Final Thoughts
Creating a simple To-Do List app is a great way to get comfortable with PHP and MySQL. It reinforces the key concepts you will use in every real-world project: form handling, data management, and code organization.
Whether you are a student, a self-taught coder, or someone looking to rebuild their old PHP skills, this project is a great place to start.
Let me know in the comments if you have any questions or run into any issues.
Disclosure: Some of the links above are referral (affiliate) links. I may earn a commission if you purchase through them - at no extra cost to you.