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>";
            }
        }
    ?>