'error', 'message' => 'Không thể kết nối CSDL MySQL: ' . $e->getMessage() ], JSON_UNESCAPED_UNICODE); exit; } // Nếu gọi GET -> Trả về danh sách tài khoản đã đăng ký if ($_SERVER['REQUEST_METHOD'] === 'GET') { $stmt = $pdo->query("SELECT id, fullname, username, email, created_at FROM users ORDER BY id DESC LIMIT 20"); $users = $stmt->fetchAll(); echo json_encode([ 'status' => 'success', 'users' => $users ], JSON_UNESCAPED_UNICODE); exit; } // Nếu gọi POST -> Xử lý đăng ký tài khoản mới $raw = file_get_contents('php://input'); $body = json_decode($raw, true); $fullname = trim($_POST['fullname'] ?? ($body['fullname'] ?? '')); $username = trim($_POST['username'] ?? ($body['username'] ?? '')); $email = trim($_POST['email'] ?? ($body['email'] ?? '')); $password = $_POST['password'] ?? ($body['password'] ?? ''); if ($fullname === '' || $username === '' || $email === '' || $password === '') { echo json_encode([ 'status' => 'error', 'message' => 'Vui lòng điền đầy đủ tất cả các trường bắt buộc!' ], JSON_UNESCAPED_UNICODE); exit; } if (!preg_match('/^[a-zA-Z0-9_]{3,30}$/', $username)) { echo json_encode([ 'status' => 'error', 'message' => 'Tên đăng nhập chỉ được chứa chữ cái, số, dấu gạch dưới (3 - 30 ký tự)!' ], JSON_UNESCAPED_UNICODE); exit; } if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { echo json_encode([ 'status' => 'error', 'message' => 'Địa chỉ Email không hợp lệ!' ], JSON_UNESCAPED_UNICODE); exit; } if (mb_strlen($password, 'UTF-8') < 6) { echo json_encode([ 'status' => 'error', 'message' => 'Mật khẩu phải có ít nhất 6 ký tự!' ], JSON_UNESCAPED_UNICODE); exit; } try { // Kiểm tra trùng username hoặc email $checkStmt = $pdo->prepare("SELECT username, email FROM users WHERE username = :username OR email = :email LIMIT 1"); $checkStmt->execute([ ':username' => $username, ':email' => $email ]); $existing = $checkStmt->fetch(); if ($existing) { if (strcasecmp($existing['username'], $username) === 0) { echo json_encode([ 'status' => 'error', 'message' => "Tên đăng nhập '{$username}' đã tồn tại trong hệ thống!" ], JSON_UNESCAPED_UNICODE); exit; } echo json_encode([ 'status' => 'error', 'message' => "Email '{$email}' đã được sử dụng để đăng ký!" ], JSON_UNESCAPED_UNICODE); exit; } // Mã hóa mật khẩu an toàn và lưu vào MySQL $passwordHash = password_hash($password, PASSWORD_DEFAULT); $insertStmt = $pdo->prepare(" INSERT INTO users (fullname, username, email, password_hash) VALUES (:fullname, :username, :email, :password_hash) "); $insertStmt->execute([ ':fullname' => $fullname, ':username' => $username, ':email' => $email, ':password_hash' => $passwordHash ]); $newId = (int)$pdo->lastInsertId(); $listStmt = $pdo->query("SELECT id, fullname, username, email, created_at FROM users ORDER BY id DESC LIMIT 20"); $users = $listStmt->fetchAll(); echo json_encode([ 'status' => 'success', 'message' => "Đăng ký thành công tài khoản '{$username}' (ID #{$newId})!", 'users' => $users ], JSON_UNESCAPED_UNICODE); } catch (Throwable $e) { echo json_encode([ 'status' => 'error', 'message' => 'Lỗi lưu dữ liệu MySQL: ' . $e->getMessage() ], JSON_UNESCAPED_UNICODE); }