用AJAX显示PHP错误。如果没有错误,则显示PHP函数的输出

用AJAX显示PHP错误。如果没有错误,则显示PHP函数的输出,php,jquery,ajax,Php,Jquery,Ajax,好吧,这可能是超级简单,但我已经打破了我的头在这一整天,我不能让它工作 我有一个页面,显示mysql查询中的用户列表。在此页面上,还可以添加用户。为此,我将向process.php发送一个AJAX调用,该调用执行一些验证,如果有错误,则发送一个错误。如果没有错误,我希望AJAX更新页面 问题是,如果没有错误(已添加用户),我希望返回更新的userlist。这意味着存储my getUsers()的输出;数组中的函数,这是不可能的 我怎样才能做到这一点 p、 我意识到这是蹩脚的代码,我应该使用OOP

好吧,这可能是超级简单,但我已经打破了我的头在这一整天,我不能让它工作

我有一个页面,显示mysql查询中的用户列表。在此页面上,还可以添加用户。为此,我将向process.php发送一个AJAX调用,该调用执行一些验证,如果有错误,则发送一个错误。如果没有错误,我希望AJAX更新页面


问题是,如果没有错误(已添加用户),我希望返回更新的userlist。这意味着存储my getUsers()的输出;数组中的函数,这是不可能的

我怎样才能做到这一点

p、 我意识到这是蹩脚的代码,我应该使用OOP/PDO,但这不适用于生产环境,它可以工作。所以我暂时就这样不谈了

users.php

<article>
    <ul>
        <?php getUsers(); ?>
    </ul>
</article>

<form id="addUserForm">
    ...
    <input type="hidden" name="addUser">
</form>

$("#addUserForm").on("submit",function() {
    event.preventDefault();
    var data = $("#addUserForm").serialize();
        $.ajax({
            type: "POST",
            url: "process.php",
            data: data,
            dataType: "json",
            success: function(response) {
                if (response.success) {
                    $("article ul).html(response.data);
                } else {
                    $(".errorMessage).html("<p>" + response.error + </p>");
                }
            }
        });
});
我就是这样做的:

try{dataObj = eval("("+response+")");}
catch(e){return;}
alert(dataObj->example_key);

您是想获取ajax返回的错误,还是想要自定义错误?(例如,php脚本返回的字符串)。如果您指的是ajax错误,您应该有以下信息:

编辑:因为您提到,您希望process.php返回一个自定义错误

if (isset($_POST["addUser"]))
{

    ... // Serialize data

        if (empty ...)
        {
            $responseArray = ["success" => false, "error" => "Fields cannot be empty"];
            echo json_encode($responseArray);
        }

        // If user is successfully added to database, send updated userlist to AJAX
        if (addUser($email, $password))
        {
            $responseArray = ["success" => true, "data" => getUsers();];
            echo json_encode($responseArray)
        }
}
if (isset($_POST["addUser"]))
{

    ... // Serialize data

        if (empty ...)
        {
            $responseArray = ["success" => false, "error" => "Fields cannot be empty"];
            echo json_encode($responseArray);
        }

        // If user is successfully added to database, send updated userlist to AJAX
        if (addUser($email, $password))
        {
            $responseArray = ["success" => true, "data" => getUsers();];
            echo json_encode($responseArray)
        }else{
            echo 1;
        }

        //I added else echo 1;
}
Process.php

if (isset($_POST["addUser"]))
{

    ... // Serialize data

        if (empty ...)
        {
            $responseArray = ["success" => false, "error" => "Fields cannot be empty"];
            echo json_encode($responseArray);
        }

        // If user is successfully added to database, send updated userlist to AJAX
        if (addUser($email, $password))
        {
            $responseArray = ["success" => true, "data" => getUsers();];
            echo json_encode($responseArray)
        }
}
if (isset($_POST["addUser"]))
{

    ... // Serialize data

        if (empty ...)
        {
            $responseArray = ["success" => false, "error" => "Fields cannot be empty"];
            echo json_encode($responseArray);
        }

        // If user is successfully added to database, send updated userlist to AJAX
        if (addUser($email, $password))
        {
            $responseArray = ["success" => true, "data" => getUsers();];
            echo json_encode($responseArray)
        }else{
            echo 1;
        }

        //I added else echo 1;
}
您的ajax将是:

  $("#addUserForm").on("submit",function() {
        event.preventDefault();
        var data = $("#addUserForm").serialize();
            $.ajax({
                type: "POST",
                url: "process.php",
                data: data,
                dataType: "json",
                success: function(response) {
                    if(response != 1){
                        $("article ul").html(response.data);
                    }else{
                        alert('Custom error!');
                    }
                },
                error: function(jqXhr, textStatus, errorThrown){
                   console.log(errorThrown);
                }
             });
     });
顺便说一句,如果(addUser($email,$password))

您的getUsers()函数正在打印数据,并且没有将数据返回到json connstuctor,那么您发布的代码中缺少

function getUsers()
    {
        global $db;
        $query = mysqli_query($db, "SELECT * FROM users");
            while($row = mysqli_fetch_assoc($query))
            {
                echo "<li>" . $row["user_firstname"] . "</li>";
            }
    }

用“)”

关闭它。如果您想要捕获
getUsers
函数的输出,则无需更改当前行为。在成功的输出变化

$responseArray = ["success" => true, "data" => getUsers();];
echo json_encode($responseArray)

这样做的目的是捕获输出并将其存储到可变的
$usersList
中,然后可以将其作为字符串返回

最好将用户作为数组返回,并在客户端IMO上生成标记,但这取决于您。这只是另一种让你的东西发挥作用的方式


有关php输出缓冲区的更多信息

您可以使用try/catch块捕获错误,并在出现php错误时对其进行处理。这将适用于除致命PHP错误以外的所有错误。“这意味着将my getUsers()函数的输出存储在数组中,这是不可能的。”。为什么不可能呢?您似乎已经在您的process.php示例中完成了这项工作。我将它作为我尝试完成的一个示例。代码不起作用,我没有真正理解这个问题。只需从getUsers返回一个html字符串,而不是直接在函数中打印它。或者返回一个数组以将其包含在结构化变量中。“不工作”的确切含义是什么?PHP错误?JS错误?另外,如果您只添加了一个用户,为什么不直接返回已添加用户的完成数据呢?然后,您可以将其添加到页面上现有的用户列表中,而不是刷新整个页面。根据惯例,这基本上就是大多数这类CRUDAPI所做的。我试图返回一个由process.php返回的自定义错误。目前,我实际上是通过echo'ing header(“HTTP/1.0 500”)使用$.ajax error:函数,但这似乎是一个比我尝试的更糟糕的解决方案。语法错误是由于将其粘贴到StackOverflow编辑器中引起的。问题是,这只显示了一个自定义错误,而不是PHP返回的内容,对吗?我回家后会查看您的答案。谢谢。语法错误是由于粘贴到StackOverflow编辑器中引起的。我回家后会看看你的答案。谢谢
$responseArray = ["success" => true, "data" => getUsers();];
echo json_encode($responseArray)
ob_start();
getUsers();
$usersList = ob_get_clean();
$responseArray = ["success" => true, "data" => $usersList];
echo json_encode($responseArray)