本文目录导读:

在 PHP 中验证失败后返回视图并显示错误信息,通常有以下几种常见方法:
使用原生 PHP + Session 闪存数据
<?php
session_start();
// 验证逻辑
$errors = [];
if (empty($_POST['username'])) {
$errors['username'] = '用户名不能为空';
}
if (empty($_POST['email'])) {
$errors['email'] = '邮箱不能为空';
}
if (!empty($errors)) {
// 存储错误信息和旧数据到 Session
$_SESSION['errors'] = $errors;
$_SESSION['old'] = $_POST;
// 重定向回表单页面
header('Location: form.php');
exit;
}
视图文件 (form.php):
<?php session_start(); ?>
<!DOCTYPE html>
<html>
<body>
<form method="POST" action="submit.php">
<input type="text" name="username"
value="<?= $_SESSION['old']['username'] ?? '' ?>">
<?php if (isset($_SESSION['errors']['username'])): ?>
<span class="error"><?= $_SESSION['errors']['username'] ?></span>
<?php endif; ?>
<input type="email" name="email"
value="<?= $_SESSION['old']['email'] ?? '' ?>">
<?php if (isset($_SESSION['errors']['email'])): ?>
<span class="error"><?= $_SESSION['errors']['email'] ?></span>
<?php endif; ?>
<button type="submit">提交</button>
</form>
<?php
// 清除 Session 数据
unset($_SESSION['errors']);
unset($_SESSION['old']);
?>
</body>
</html>
使用 Laravel 框架
// 控制器
public function store(Request $request)
{
$validated = $request->validate([
'username' => 'required',
'email' => 'required|email',
]);
// 验证通过后的逻辑
}
// 或者自定义验证
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'username' => 'required',
'email' => 'required|email',
]);
if ($validator->fails()) {
return redirect('form')
->withErrors($validator)
->withInput();
}
}
Laravel 视图 (Blade):
<form method="POST" action="/submit">
@csrf
<input type="text" name="username" value="{{ old('username') }}">
@error('username')
<span class="error">{{ $message }}</span>
@enderror
<input type="email" name="email" value="{{ old('email') }}">
@error('email')
<span class="error">{{ $message }}</span>
@enderror
<button type="submit">提交</button>
</form>
使用 ThinkPHP 框架
// 控制器
public function save(Request $request)
{
$validate = Validate::make([
'username' => 'require',
'email' => 'require|email'
]);
if (!$validate->check($request->post())) {
return redirect('form')->with([
'errors' => $validate->getError(),
'old' => $request->post()
]);
}
}
ThinkPHP 视图:
<form method="POST" action="/save">
<input type="text" name="username" value="{$Think.session.old.username ?? ''}">
{if isset($Think.session.errors.username)}
<span class="error">{$Think.session.errors.username}</span>
{/if}
<input type="email" name="email" value="{$Think.session.old.email ?? ''}">
{if isset($Think.session.errors.email)}
<span class="error">{$Think.session.errors.email}</span>
{/if}
<button type="submit">提交</button>
</form>
AJAX 请求的错误处理
// PHP 端
if (!empty($errors)) {
if ($request->isAjax()) {
return json_encode([
'success' => false,
'errors' => $errors,
'message' => '验证失败'
]);
}
// 非 AJAX 请求的处理...
}
JavaScript 端:
fetch('/submit', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
if (!data.success) {
// 显示错误信息
Object.keys(data.errors).forEach(field => {
document.querySelector(`[name="${field}"]`).nextElementSibling
.textContent = data.errors[field];
});
}
});
建议
- 使用框架:框架通常提供完善的验证和错误处理机制
- 保持用户输入:验证失败时保留用户已填写的内容
- 显示友好错误:错误信息要清晰易懂
- 考虑安全性:对错误信息进行适当的转义处理
选择哪种方法取决于你的项目使用的技术栈,如果你能提供更多关于你的项目环境的信息,我可以给出更具体的建议。