使用JavaScript Fetch API时输出PHP表单验证错误消息

2022-05-28 00:00:00 validation php javascript fetch-api

我有一个带有多个表单的页面,其中每个表单都是在后端使用PHP处理的,该后端将数据发送到MySQL数据库,但在前端,它使用Java脚本的fetchAPI来防止在表单的一个实例完成并将数据发送到数据库时刷新页面。

我有一些正在进行的PHP服务器端验证,这些验证仍然适用于不将数据发送到数据库,尽管在提交时,完成的表单实例确实会从页面中消失(由于下面显示的Java脚本),但如果验证失败,则在刷新时重新出现。

下面的主代码示例包括通常输出错误消息的代码块:

<?php 
    // echo form validation error messages
    if(isset($error)) {
        foreach($error as $msg) {
            echo "<p>** {$msg}</p>";
        }
    }
?>
在输出这些错误消息方面,是否仍然可以使用此PHP代码(目前无法工作),或者我现在将javascript fetchAPI与PHP结合使用,除了安全地防止表单未能通过验证的PHP验证之外,我还需要用JavaScript编写验证以在前端输出错误吗?应该注意的是,页面上有多个表单实例,它们是通过While循环输出的,每个实例都与特定的POST相关。

<?php
if(isset($_POST['upload-submit'])) {
    // note $imageTitle is a variable given to the title of a post submitted via an HTML form

    if(!preg_match('/^[a-zA-Z0-9s]+$/', $imageTitle)) {
        $error[] = "Post Title can be letters and numbers only";
    }

    if(empty(trim($imageTitle))){
        $error[] = "Image Title cannot be blank";
    }

    // if no errors process submission
    if (!isset($error)) {

        try {

        // PDO prepared statements that update the database
    
        } catch (PDOException $e) {
            echo "There is an error: " . $e->getMessage();
        }

    }
}
?>

这里还有在页面上工作的javascript fetchAPI代码。

var forms = document.querySelectorAll('.image-upload-details-form'),

forms.forEach(item => {
    
        item.querySelectorAll('[type="submit"], button').forEach(button => {
            button.addEventListener("click", e => item._button = button); //store this button in the form element
        })

        item.addEventListener("submit", function(evt, btn) {

            evt.preventDefault();

            const formData = new FormData(this);
            if (this._button) //submitted by a button?
            {
            formData.set(this._button.name, this._button.value);
        }

        fetch("upload-details.php", {
            method: 'post',
            body: formData
        }).then(function(response){
            return response.text();
        }).then(function(text){
            console.log(text);
        }).catch(function (error){
            console.error(error);
        })

        // removes form when submitted
        item.remove();

    })

})

非常感谢您的帮助/建议。


解决方案

您需要一次性回显所有错误,否则只会得到第一个回音...;

<?php 
        // echo form validation error messages
        $echo = [];
        if(isset($error)) {
            foreach($error as $msg) {
                $echo[] = "<p>** {$msg}</p>";
            }
        echo implode(PHP_EOL, $echo);
        }
    ?>

和您的其他区块:

<?php
if(isset($_POST['upload-submit'])) {
    // note $imageTitle is a variable given to the title of a post submitted via an HTML form

    if(!preg_match('/^[a-zA-Z0-9s]+$/', $imageTitle)) {
        $error[] = "Post Title can be letters and numbers only";
    }

    if(empty(trim($imageTitle))){
        $error[] = "Image Title cannot be blank";
    }

    // if no errors process submission
    if (!isset($error)) {

        try {
        $success = false;
        // PDO prepared statements that update the database => success = true ?
        echo $success;
        } catch (PDOException $e) {
            echo "There is an error: " . $e->getMessage();
        }

    }
    echo $errors; // form 'user' errors
}
?>

或类似的smthg

相关文章