beginTransaction(); // Skip header row fgetcsv($handle, 1000, ","); $created_count = 0; $error_count = 0; $errors = []; while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { $username = trim($data[0]); $email = trim($data[1]); $password = $data[2]; $role = trim($data[3]); if (empty($username) || empty($email) || empty($password) || empty($role)) { $errors[] = "Skipping row: required field is empty."; $error_count++; continue; } if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors[] = "Skipping row for email {$email}: invalid email format."; $error_count++; continue; } $stmt = $pdo->prepare('SELECT id FROM users WHERE username = :username OR email = :email'); $stmt->execute(['username' => $username, 'email' => $email]); if ($stmt->fetch()) { $errors[] = "Skipping row for user {$username}: username or email already exists."; $error_count++; continue; } $hashed_password = password_hash($password, PASSWORD_DEFAULT); $stmt = $pdo->prepare('INSERT INTO users (username, email, password, role) VALUES (:username, :email, :password, :role)'); if ($stmt->execute(['username' => $username, 'email' => $email, 'password' => $hashed_password, 'role' => $role])) { $created_count++; } else { $errors[] = "Failed to create user {$username}."; $error_count++; } } fclose($handle); if ($error_count === 0) { $pdo->commit(); $success = "{$created_count} users created successfully."; } else { $pdo->rollBack(); $error = "There were {$error_count} errors creating users. No users were created. Errors:
" . implode("
", $errors); } $_SESSION['upload_success'] = $success; $_SESSION['upload_error'] = $error; } else { $_SESSION['upload_error'] = 'Failed to open CSV file.'; } header("Location: manage_users.php"); exit; } else { header('Location: manage_users.php'); exit; }