/* === PHP CODE === */ PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false ] ); if ($_SERVER['REQUEST_METHOD'] !== 'POST') { http_response_code(405); exit; } if ( empty($_POST['csrf_token']) || !hash_equals( $_SESSION['csrf_token'], $_POST['csrf_token'] ) ) { exit('Invalid request.'); } $name = trim($_POST['name'] ?? ''); $email = trim($_POST['email'] ?? ''); $mobile = trim($_POST['mobile'] ?? ''); $address = trim($_POST['address'] ?? ''); $errors = []; /* |-------------------------------------------------------------------------- | Name Validation |-------------------------------------------------------------------------- */ if ( empty($name) || mb_strlen($name) < 2 || mb_strlen($name) > 100 ) { $errors[] = 'Invalid name.'; } if ( !preg_match( "/^[a-zA-Z\s.'-]+$/u", $name ) ) { $errors[] = 'Name contains invalid characters.'; } /* |-------------------------------------------------------------------------- | Email Validation |-------------------------------------------------------------------------- */ if ( !filter_var( $email, FILTER_VALIDATE_EMAIL ) ) { $errors[] = 'Invalid email.'; } $email = strtolower($email); /* |-------------------------------------------------------------------------- | Mobile Validation |-------------------------------------------------------------------------- */ if ( !preg_match( '/^[6-9][0-9]{9}$/', $mobile ) ) { $errors[] = 'Invalid mobile number.'; } /* |-------------------------------------------------------------------------- | Address Validation |-------------------------------------------------------------------------- */ if (mb_strlen($address) > 500) { $errors[] = 'Address too long.'; } if (!empty($errors)) { foreach ($errors as $error) { echo htmlspecialchars($error) . '
'; } exit; } /* === HTML CODE === */
/* === DATABASE SCHEMA === */ CREATE TABLE users ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, mobile VARCHAR(20) NOT NULL UNIQUE, address TEXT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX(email), INDEX(mobile) );