在 PHP 类中接收表单提交的数据有多种方法,下面介绍几种常见的实现方式:
class FormHandler {
private $formData;
public function __construct($postData) {
$this->formData = $postData;
}
public function processForm() {
// 处理表单数据
$name = $this->formData['name'] ?? '';
$email = $this->formData['email'] ?? '';
echo "姓名: $name, 邮箱: $email";
}
}
// 使用方式
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$formHandler = new FormHandler($_POST);
$formHandler->processForm();
}
class FormProcessor {
public function handleSubmission($formData) {
// 过滤和验证数据
$name = filter_var($formData['name'] ?? '', FILTER_SANITIZE_STRING);
$email = filter_var($formData['email'] ?? '', FILTER_SANITIZE_EMAIL);
// 处理数据...
return [
'name' => $name,
'email' => $email
];
}
}
// 使用方式
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$processor = new FormProcessor();
$result = $processor->handleSubmission($_POST);
print_r($result);
}
class UserRegistration {
private $username;
private $password;
private $email;
public function setUsername($username) {
$this->username = trim($username);
}
public function setPassword($password) {
$this->password = password_hash($password, PASSWORD_DEFAULT);
}
public function setEmail($email) {
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$this->email = $email;
}
}
public function register() {
// 执行注册逻辑
// ...
echo "用户 {$this->username} 注册成功!";
}
}
// 使用方式
if ($_POST) {
$registration = new UserRegistration();
$registration->setUsername($_POST['username']);
$registration->setPassword($_POST['password']);
$registration->setEmail($_POST['email']);
$registration->register();
}
class ContactForm {
public function submit(array $data) {
['name' => $name, 'email' => $email, 'message' => $message] = $data;
// 验证和处理数据
// ...
echo "感谢 $name 的留言!";
}
}
// 使用方式
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$contact = new ContactForm();
$contact->submit($_POST);
}
更高级的做法是创建一个专门的请求类:
class Request {
private $data;
public function __construct() {
$this->data = array_merge($_GET, $_POST);
}
public function get($key, $default = null) {
return $this->data[$key] ?? $default;
}
public function all() {
return $this->data;
}
}
class FormController {
public function handle(Request $request) {
$name = $request->get('name');
$email = $request->get('email');
// 处理表单...
}
}
// 使用方式
$request = new Request();
$controller = new FormController();
$controller->handle($request);
永远不要信任用户输入:始终验证和过滤输入数据
使用过滤函数:如 filter_var()
, htmlspecialchars()
密码处理:使用 password_hash()
存储密码
防止 SQL 注入:使用预处理语句(PDO 或 mysqli)
CSRF 防护:使用令牌防止跨站请求伪造
class UserForm {
private $data = [];
private $errors = [];
public function __construct(array $postData) {
$this->data = $postData;
$this->validate();
}
private function validate() {
// 验证姓名
if (empty($this->data['name'])) {
$this->errors['name'] = '姓名不能为空';
}
// 验证邮箱
if (empty($this->data['email']) || !filter_var($this->data['email'], FILTER_VALIDATE_EMAIL)) {
$this->errors['email'] = '请输入有效的邮箱地址';
}
}
public function isValid() {
return empty($this->errors);
}
public function getErrors() {
return $this->errors;
}
public function getData() {
return [
'name' => htmlspecialchars($this->data['name']),
'email' => filter_var($this->data['email'], FILTER_SANITIZE_EMAIL)
];
}
public function save() {
if (!$this->isValid()) {
return false;
}
$cleanData = $this->getData();
// 这里应该是数据库保存逻辑
// 例如使用 PDO 预处理语句
return true;
}
}
// 使用示例
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$form = new UserForm($_POST);
if ($form->isValid()) {
if ($form->save()) {
echo "表单提交成功!";
} else {
echo "保存数据时出错";
}
} else {
echo "表单验证失败: ";
print_r($form->getErrors());
}
}
以上方法都可以在类中接收表单数据,选择哪种方式取决于你的项目结构和需求。对于简单的表单,直接传递 $_POST
到类方法即可;对于复杂的应用,建议创建专门的请求类来处理输入数据。