Form Submission Quick Reference Cheatsheet
The Form Submission Process
Section titled “The Form Submission Process”- User fills form → Data in browser
- User clicks submit → Browser packages data
- Data travels to server → HTTP request
- PHP receives data → Via $_POST or $_GET
- PHP processes data → Validation, storage
- Server sends response → Back to browser
Quick Workflow Reference
Section titled “Quick Workflow Reference”Valid Data Flow:
Section titled “Valid Data Flow:”POST → Validate → Process → Redirect → GET → Success Page
Invalid Data Flow:
Section titled “Invalid Data Flow:”POST → Validate → Stay on Page → Show Errors → User Fixes → Resubmit
📊 HTTP Methods Quick Reference
Section titled “📊 HTTP Methods Quick Reference”| Method | Use Case | Data Location | Visible in URL | Size Limit |
|---|---|---|---|---|
| GET | Search, filters | URL parameters | ✅ Yes | ~2048 chars |
| POST | Forms, sensitive data | Request body | ❌ No | No limit |
Basic HTML Form Setup
Section titled “Basic HTML Form Setup”Standard PHP Forms
Section titled “Standard PHP Forms”<!-- POST for sensitive data (passwords, personal info) --><form method="POST" action="process.php"> <label for="username">Username:</label> <input type="text" name="username" id="username" required>
<label for="email">Email:</label> <input type="email" name="email" id="email" required>
<button type="submit">Submit</button></form>
<!-- GET for searches/filters --><form method="GET" action="search.php"> <input type="text" name="query" placeholder="Search..."> <button type="submit">Search</button></form>Form Action Examples for Slim Routes
Section titled “Form Action Examples for Slim Routes”This is a list of examples of how to use the form action attribute to point to a Slim route.
<!-- Basic routes --><form method="GET" action="shops">...</form><form method="POST" action="login">...</form>
<!-- With route parameters --><form method="POST" action="users/123/update">...</form><form method="POST" action="products/456/delete">...</form>
<!-- RESTful patterns --><form method="POST" action="users"><!-- Create user --></form><form method="POST" action="users/123"><!-- Update user (with method override) --></form>Slim Framework Forms (Using Routes)
Section titled “Slim Framework Forms (Using Routes)”<!-- POST to Slim route --><form method="POST" action="users/register"> <label for="username">Username:</label> <input type="text" name="username" id="username" required>
<label for="email">Email:</label> <input type="email" name="email" id="email" required>
<button type="submit">Register</button></form>
<!-- GET to Slim route --><form method="GET" action="search"> <input type="text" name="query" placeholder="Search..."> <input type="hidden" name="category" value="products"> <button type="submit">Search</button></form>
<!-- With route parameters --><form method="POST" action="products/123/update"> <input type="text" name="name" placeholder="Product Name"> <input type="number" name="price" placeholder="Price"> <button type="submit">Update Product</button></form>PHP Form Processing Template
Section titled “PHP Form Processing Template”Standard PHP Form Processing
Section titled “Standard PHP Form Processing”<?php// Step 1: Check if form was submittedif ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Step 2: Get form data safely $username = $_POST['username'] ?? ''; $email = $_POST['email'] ?? '';
// Step 3: Validate data $errors = []; if (empty($username)) { $errors[] = 'Username is required'; } if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors[] = 'Valid email is required'; }
// Step 4: Process if valid if (empty($errors)) { // Clean data $username = trim(htmlspecialchars($username, ENT_QUOTES, 'UTF-8')); $email = trim(filter_var($email, FILTER_SANITIZE_EMAIL));
// Process data (save to database, send email, etc.)
// Step 5: Redirect after success (PRG pattern) header('Location: success.php'); exit(); } // If errors exist, stay on page and display them}?>Slim Framework Form Processing
Section titled “Slim Framework Form Processing”// routes.php - Route definitions$app->post('/users/register', [UserController::class, 'register']);$app->get('/search', [SearchController::class, 'search']);
// UserController.phpclass UserController{ public function register(Request $request, Response $response): Response { // Step 1: Get parsed body data (handles POST automatically) $data = $request->getParsedBody();
// Step 2: Get form data safely $username = $data['username'] ?? ''; $email = $data['email'] ?? '';
// Step 3: Validate data $errors = []; if (empty($username)) { $errors[] = 'Username is required'; } if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors[] = 'Valid email is required'; }
// Step 4: Process if valid if (empty($errors)) { // Clean data $username = trim(htmlspecialchars($username, ENT_QUOTES, 'UTF-8')); $email = trim(filter_var($email, FILTER_SANITIZE_EMAIL));
// Process data (save to database, send email, etc.)
// Step 5: Redirect after success (PRG pattern) return $response->withHeader('Location', '/success')->withStatus(302); }
// If errors exist, render form with errors return $this->view->render($response, 'registerView.php', [ 'errors' => $errors, 'username' => $username, 'email' => $email ]); }}
// SearchController.phpclass SearchController{ public function search(Request $request, Response $response): Response { // Get query parameters $params = $request->getQueryParams(); $query = $params['query'] ?? ''; $category = $params['category'] ?? '';
// Process search logic here
return $this->view->render($response, 'searchResultsView.php', [ 'query' => $query, 'results' => $searchResults ]); }}Form Data Access
Section titled “Form Data Access”Standard PHP
Section titled “Standard PHP”POST Data (Secure)
Section titled “POST Data (Secure)”// Check if POST requestif ($_SERVER['REQUEST_METHOD'] === 'POST') { $username = $_POST['username'] ?? ''; $password = $_POST['password'] ?? '';}GET Data (For searches/filters)
Section titled “GET Data (For searches/filters)”// Check if GET requestif ($_SERVER['REQUEST_METHOD'] === 'GET') { $searchQuery = $_GET['query'] ?? ''; $category = $_GET['category'] ?? '';}Slim Framework
Section titled “Slim Framework”POST Data (in controller method)
Section titled “POST Data (in controller method)”// Route definition$app->post('/users', [UserController::class, 'create']);
// Controller methodclass UserController{ public function create(Request $request, Response $response): Response { $data = $request->getParsedBody(); $username = $data['username'] ?? ''; $password = $data['password'] ?? '';
// Process data... return $response; }}GET Data (query parameters)
Section titled “GET Data (query parameters)”// Route definition$app->get('/search', [SearchController::class, 'index']);
// Controller methodclass SearchController{ public function index(Request $request, Response $response): Response { $params = $request->getQueryParams(); $searchQuery = $params['query'] ?? ''; $category = $params['category'] ?? '';
// Process search... return $response; }}Route Parameters
Section titled “Route Parameters”// Route definition$app->post('/users/{id}/update', [UserController::class, 'update']);
// Controller methodclass UserController{ public function update(Request $request, Response $response, array $args): Response { $userId = $args['id']; // Route parameter $data = $request->getParsedBody(); // Form data $name = $data['name'] ?? '';
// Process update... return $response; }}Validation Patterns
Section titled “Validation Patterns”Required Fields
Section titled “Required Fields”$errors = [];
if (empty($username)) { $errors[] = 'Username is required';}
if (empty($password)) { $errors[] = 'Password is required';}Email Validation
Section titled “Email Validation”if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors[] = 'Valid email address is required';}Length Validation
Section titled “Length Validation”if (strlen($username) < 3) { $errors[] = 'Username must be at least 3 characters';}
if (strlen($password) < 8) { $errors[] = 'Password must be at least 8 characters';}Number Validation
Section titled “Number Validation”if (!is_numeric($age) || $age < 18) { $errors[] = 'Age must be a number and at least 18';}Data Sanitization
Section titled “Data Sanitization”// Clean string data$username = trim($_POST['username']);$username = htmlspecialchars($username, ENT_QUOTES, 'UTF-8');
// Clean email$email = trim($_POST['email']);$email = filter_var($email, FILTER_SANITIZE_EMAIL);
// Clean numbers$age = filter_var($_POST['age'], FILTER_SANITIZE_NUMBER_INT);Post/Redirect/Get (PRG) Pattern
Section titled “Post/Redirect/Get (PRG) Pattern”Standard PHP
Section titled “Standard PHP”Correct: Redirect After Success
Section titled “Correct: Redirect After Success”if ($_SERVER['REQUEST_METHOD'] === 'POST') { // Validate data if (empty($errors)) { // Process data successfully
// Redirect to prevent duplicate submissions header('Location: success.php'); exit(); } // Stay on page if errors exist}Wrong: No Redirect
Section titled “Wrong: No Redirect”// Don't do this - causes duplicate submissions on refreshif ($_SERVER['REQUEST_METHOD'] === 'POST') { echo "Form submitted!"; // User can resubmit by refreshing}Slim Framework
Section titled “Slim Framework”Correct: Redirect After Success
Section titled “Correct: Redirect After Success”// Route definition$app->post('/submit', [FormController::class, 'submit']);
// Controller methodclass FormController{ public function submit(Request $request, Response $response): Response { // Validate data if (empty($errors)) { // Process data successfully
// Redirect to prevent duplicate submissions return $response->withHeader('Location', '/success')->withStatus(302); }
// Stay on page if errors exist - render form with errors return $this->view->render($response, 'formView.php', ['errors' => $errors]); }}Wrong: No Redirect
Section titled “Wrong: No Redirect”// Route definition$app->post('/submit', [FormController::class, 'submitWrong']);
// Controller methodclass FormController{ public function submitWrong(Request $request, Response $response): Response { // Don't do this - causes duplicate submissions on refresh return $response->write("Form submitted!"); // User can resubmit by refreshing }}Security Essentials
Section titled “Security Essentials”Always Validate Server-Side
Section titled “Always Validate Server-Side”// ✅ Always validate on serverif (empty($username) || strlen($username) < 3) { $errors[] = 'Username must be at least 3 characters';}
// ❌ Never trust client-side validation alone// <input type="text" required minlength="3"> // Can be bypassedPrevent XSS Attacks
Section titled “Prevent XSS Attacks”// ✅ Escape output when displaying user dataecho htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
// ❌ Never output raw user dataecho $_POST['username']; // Dangerous!Debugging Tips
Section titled “Debugging Tips”Debug Form Data
Section titled “Debug Form Data”// See what data was submittedif ($_SERVER['REQUEST_METHOD'] === 'POST') { echo '<pre>'; var_dump($_POST); echo '</pre>';}Check Form Field Names
Section titled “Check Form Field Names”// Make sure field names match between HTML and PHP// HTML: <input name="username">// PHP: $_POST['username'] ← names must match exactlyCommon Issues Checklist
Section titled “Common Issues Checklist”- ✅ Form method matches PHP check (
POSTvsGET) - ✅ Field names match exactly between HTML and PHP
- ✅
actionattribute points to correct PHP file - ✅ No output before
header()redirects - ✅ Using correct superglobal (
$_POSTvs$_GET)
Slim Framework Route Patterns
Section titled “Slim Framework Route Patterns”Basic Routes
Section titled “Basic Routes”// Route definitions with controller methods$app->get('/path', [MyController::class, 'index']);$app->post('/path', [MyController::class, 'create']);$app->put('/path', [MyController::class, 'update']);$app->delete('/path', [MyController::class, 'delete']);
// Controller classclass MyController{ public function index(Request $request, Response $response): Response { } public function create(Request $request, Response $response): Response { } public function update(Request $request, Response $response): Response { } public function delete(Request $request, Response $response): Response { }}Route Parameters
Section titled “Route Parameters”// Single parameter$app->get('/users/{id}', [UserController::class, 'show']);
// Multiple parameters$app->get('/users/{id}/posts/{postId}', [PostController::class, 'show']);
// Optional parameters$app->get('/products[/{category}]', [ProductController::class, 'index']);
// Controller implementationsclass UserController{ public function show(Request $request, Response $response, array $args): Response { $userId = $args['id']; // Process... return $response; }}
class PostController{ public function show(Request $request, Response $response, array $args): Response { $userId = $args['id']; $postId = $args['postId']; // Process... return $response; }}
class ProductController{ public function index(Request $request, Response $response, array $args): Response { $category = $args['category'] ?? 'all'; // Process... return $response; }}