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

时间:2017-05-23 15:22:26

标签: php jquery ajax

好吧,这可能非常简单,但我整天都在为此而烦恼,我无法让它发挥作用。

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

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

我怎样才能做到这一点?

P.S。我意识到这是一个糟糕的代码,我应该使用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>");
                }
            }
        });
});

的functions.php

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

function addUser($email, $password)
{
    global $db;
    $result = mysqli_query($db, "INSERT INTO users ... ");
        return $result
}

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)
        }
}

4 个答案:

答案 0 :(得分:2)

你的getUsers()函数正在打印而不是将数据返回给json connstructor

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

它必须是这样的

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

以下行中存在语法错误

 if (addUser($email, $password)

用“)”

关闭它

答案 1 :(得分:1)

您可以捕获getUsers函数的输出,而不会更改当前行为,如果这是您所追求的。在成功输出变化

$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)

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

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

有关php的输出缓冲区here

的更多信息

答案 2 :(得分:0)

您是否尝试获取ajax返回的错误,或者您想要自定义错误? (例如,php脚本返回的字符串)。如果你指的是ajax错误,你应该这样:

编辑:因为您提到过您需要process.php返回的自定义错误

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)
        }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);
                }
             });
     });

顺便说一下,您在发布的代码)

中遗漏了if (addUser($email, $password))

答案 3 :(得分:-1)

我就是这样做的:

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