Link 在循环中生成特定表单实例的表单验证错误消息 - PHP
Link Form Validations Error Message To Specific Form Instance When Generated In A Loop - PHP
我在页面上有一系列与图片上传相关的表格。我进行了一些 PHP 验证,我希望在验证失败的单个表单实例的顶部输出错误消息。
我注意到这里有其他关于此问题的问题,但它们是隐藏表单元素的名称基本上是硬编码的实例。
以下代码中的网站用户最多可以上传 10 张图片,因此页面上将有多达 10 个表单实例,这些实例通过 while
循环输出。
在下面的代码中,我在 hidden
输入元素中有一个文件名变量(这个文件名是在图像最初通过 Imagick PHP 库上传时分配的)。在每个表单的顶部,我都有一个 foreach
循环来回显失败的验证消息(在下面的代码中,我只包含一个验证),因此希望将错误消息应用于特定的表单实例有错误。
以下是提交的部分信息示例,包括示例 PHP 验证:
<?php
if(isset($_POST['upload-submit'])) {
$image_title = $_POST['image-title'];
$image_tags = $_POST['image-tags'];
$form_filename = $_POST['image-filename']; // hidden form element
$image_title = filter_var($image_title, FILTER_SANITIZE_STRING);
$image_tags = filter_var($image_tags, FILTER_SANITIZE_STRING);
$form_filename = filter_var($form_filename, FILTER_SANITIZE_STRING);
// example of form validation
if(empty(trim($image_title))){
$error[] = "Image Title cannot be blank";
}
if (!isset($error)) {
try {
$sql = "UPDATE imageposts SET
image_title = :image_title,
image_tags = :image_tags
WHERE filename = :filename";
$stmt = $connection->prepare($sql);
$stmt->execute([
':image_title' => $image_title,
':image_tags' => $image_tags,
':filename' => $form_filename
]);
} catch (PDOException $e) {
echo "Error: " . $e->getMessage(); // this is for PDO errors not validation errors
}
} else {
// give values an empty string to avoid an error being thrown before form submission if empty
$image_title = $image_tags = "";
}
}
?>
表单实例如何输出到页面的简化版本:
<?php
// $user_id is assigned via a $_SESSION when user logs in
$stmt = $connection->prepare("SELECT * FROM imageposts WHERE user_id = :user_id");
$stmt->execute([
':user_id' => $user_id
]);
while ($row = $stmt->fetch()) {
$db_image_filename = escape($row['filename']); // outputted into the value attribute of the hidden input element
?>
<form method="post" enctype="multipart/form-data">
<?php
// -- echo error messages at top of the form
if(isset($error)) {
foreach($error as $msg) {
echo "<p>* ERROR: {$msg}</p>";
}
}
?>
<div>
<div class="form-row">
<label for="upload-details-title">Image Title</label>
<input id="upload-details-title" type="text" name="image-title">
</div>
<div class="form-row">
<label for="upload-details-tags">Comma Separated Image Tags</label>
<textarea id="upload-details-tags" type="text" name="image-tags"></textarea>
</div>
<div class="form-row">
<button name="upload-submit">COMPLETE UPLOAD</button>
</div>
<div class="form-row">
<!-- hidden form input -->
<input type="hidden" name="image-filename" value="<?php echo $db_image_filename; ?>">
</div>
</div>
</form>
<?php } ?>
如何才能使出现错误的表单实例成为唯一显示错误消息的实例?
您首先需要能够识别您的表单实例的内容,并且您需要将其与其余字段一起提交,以便您了解提交来自哪个表单的信息,可用在您进行验证的那一点。
由于图像文件名本身显然可以用来识别它在此处的格式,因此您不需要创建和发送任何额外的内容。在 while 循环内的表单内输出错误消息之前,只需检查 $form_filename === $db_image_filename
。
你可以把它和检查 $errors 是否被设置到同一个 if:
<form method="post" enctype="multipart/form-data">
<?php
// -- echo error messages at top of the form
if($form_filename === $db_image_filename && isset($error)) {
foreach($error as $msg) {
echo "<p>* ERROR: {$msg}</p>";
}
}
?>
我在页面上有一系列与图片上传相关的表格。我进行了一些 PHP 验证,我希望在验证失败的单个表单实例的顶部输出错误消息。
我注意到这里有其他关于此问题的问题,但它们是隐藏表单元素的名称基本上是硬编码的实例。
以下代码中的网站用户最多可以上传 10 张图片,因此页面上将有多达 10 个表单实例,这些实例通过 while
循环输出。
在下面的代码中,我在 hidden
输入元素中有一个文件名变量(这个文件名是在图像最初通过 Imagick PHP 库上传时分配的)。在每个表单的顶部,我都有一个 foreach
循环来回显失败的验证消息(在下面的代码中,我只包含一个验证),因此希望将错误消息应用于特定的表单实例有错误。
以下是提交的部分信息示例,包括示例 PHP 验证:
<?php
if(isset($_POST['upload-submit'])) {
$image_title = $_POST['image-title'];
$image_tags = $_POST['image-tags'];
$form_filename = $_POST['image-filename']; // hidden form element
$image_title = filter_var($image_title, FILTER_SANITIZE_STRING);
$image_tags = filter_var($image_tags, FILTER_SANITIZE_STRING);
$form_filename = filter_var($form_filename, FILTER_SANITIZE_STRING);
// example of form validation
if(empty(trim($image_title))){
$error[] = "Image Title cannot be blank";
}
if (!isset($error)) {
try {
$sql = "UPDATE imageposts SET
image_title = :image_title,
image_tags = :image_tags
WHERE filename = :filename";
$stmt = $connection->prepare($sql);
$stmt->execute([
':image_title' => $image_title,
':image_tags' => $image_tags,
':filename' => $form_filename
]);
} catch (PDOException $e) {
echo "Error: " . $e->getMessage(); // this is for PDO errors not validation errors
}
} else {
// give values an empty string to avoid an error being thrown before form submission if empty
$image_title = $image_tags = "";
}
}
?>
表单实例如何输出到页面的简化版本:
<?php
// $user_id is assigned via a $_SESSION when user logs in
$stmt = $connection->prepare("SELECT * FROM imageposts WHERE user_id = :user_id");
$stmt->execute([
':user_id' => $user_id
]);
while ($row = $stmt->fetch()) {
$db_image_filename = escape($row['filename']); // outputted into the value attribute of the hidden input element
?>
<form method="post" enctype="multipart/form-data">
<?php
// -- echo error messages at top of the form
if(isset($error)) {
foreach($error as $msg) {
echo "<p>* ERROR: {$msg}</p>";
}
}
?>
<div>
<div class="form-row">
<label for="upload-details-title">Image Title</label>
<input id="upload-details-title" type="text" name="image-title">
</div>
<div class="form-row">
<label for="upload-details-tags">Comma Separated Image Tags</label>
<textarea id="upload-details-tags" type="text" name="image-tags"></textarea>
</div>
<div class="form-row">
<button name="upload-submit">COMPLETE UPLOAD</button>
</div>
<div class="form-row">
<!-- hidden form input -->
<input type="hidden" name="image-filename" value="<?php echo $db_image_filename; ?>">
</div>
</div>
</form>
<?php } ?>
如何才能使出现错误的表单实例成为唯一显示错误消息的实例?
您首先需要能够识别您的表单实例的内容,并且您需要将其与其余字段一起提交,以便您了解提交来自哪个表单的信息,可用在您进行验证的那一点。
由于图像文件名本身显然可以用来识别它在此处的格式,因此您不需要创建和发送任何额外的内容。在 while 循环内的表单内输出错误消息之前,只需检查 $form_filename === $db_image_filename
。
你可以把它和检查 $errors 是否被设置到同一个 if:
<form method="post" enctype="multipart/form-data">
<?php
// -- echo error messages at top of the form
if($form_filename === $db_image_filename && isset($error)) {
foreach($error as $msg) {
echo "<p>* ERROR: {$msg}</p>";
}
}
?>