好吧,这可能非常简单,但我整天都在为此而烦恼,我无法让它发挥作用。
我有一个页面,显示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)
}
}
答案 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);