在网上苦苦挣扎和阅读之后,我仍然找不到这个问题的答案。在我的应用程序中,表单通过AJAX发送,然后在PHP中进行验证并添加到数据库中。然而,我可以发送成功消息,但我不知道如何向用户发送友好的错误消息。
下面是我的JS:
$(document).ready(function(){
var form = $('form');
var submit = $('#submit');
form.on('submit', function(e) {
e.preventDefault();
$.ajax({
url: 'ajax_comment.php',
type: 'POST',
cache: false,
data: form.serialize(),
beforeSend: function(){
submit.val('Posting...').attr('disabled', 'disabled');
},
success: function(data){
var item = $(data).hide().fadeIn(800);
$('.new-comment').append(item);
form.trigger('reset');
submit.val('Submit Comment').removeAttr('disabled');
},
error: function(e){
alert(e);
}
});
});
});
我在AJAX方面没有什么经验,所以请对我简单一点!错误消息将显示为"用户名不存在"等,所以我认为我无法通过客户端验证来完成此操作。提前感谢!
编辑:下面是我正在使用的PHP代码。
<?php
// Include files
include 'config.php';
// Variables
$order_id = $_POST['order_id'];
$comment = $_POST['comment'];
$reviewed = 1;
$date = date('dS F Y');
// Find order ID match
$stmt = $con->prepare("SELECT order_id FROM transactions WHERE order_id = ?");
$stmt->bind_param('i', $order_id);
$stmt->execute();
$stmt->store_result();
$no_id_match = $stmt->num_rows;
$stmt->close();
// Check if review has already been submitted
$stmt = $con->prepare("SELECT order_id FROM transactions WHERE order_id = ? AND review = 1");
$stmt->bind_param('i', $order_id);
$stmt->execute();
$stmt->store_result();
$num_rows_reviewed = $stmt->num_rows;
$stmt->close();
if(empty($order_id) === true || empty($comment) === true) {
exit();
} else if($num_rows_reviewed> 0) {
exit();
} elseif($no_id_match == 0) {
exit();
} elseif(strlen($comment) > 499) {
exit();
} else {
//Insert review into DB
$stmt = $con->prepare("INSERT INTO reviews (order_id, comment, date) VALUES (?, ?, ?)");
$stmt->bind_param('iss', $order_id, $comment, $date);
$stmt->execute();
$stmt->close();
// Update transactions to show review added
$stmt = $con->prepare("UPDATE transactions SET review = ? WHERE order_id = ?");
$stmt->bind_param('ii', $reviewed, $order_id);
$stmt->execute();
$stmt->close();
// Get name from order ID
$stmt = $con->prepare("SELECT first_name, last_name FROM transactions WHERE order_id = ?");
$stmt->bind_param('i', $order_id);
$stmt->execute();
$stmt->bind_result($first_name, $last_name);
$stmt->fetch();
$stmt->close();
$name = $first_name. ' '. mb_substr($last_name, 0, 1);
// Output review live to page ?>
<div class="comment-item">
<div class="comment-post">
<h3><?php echo $name; ?>: <span><?php echo $date; ?></span></h3>
<p><?php echo $comment; ?></p>
</div>
</div><?php
}?>
目前,exit()
变量是我想要验证脚本的地方。然而,由于我现在不知道如何做到这一点,我只是退出脚本。
您可以通过HTTP方式从后端发送错误。
如果一切正常,请发送一个用json编码的PHP数组。
$result = [];
$result['error'] = false;
$result['code'] = "OK"; //better with constant
$result['msg'] = "";
echo json_encode($result);
如果有什么不起作用,就这样。
header('HTTP/1.1 500 Internal Server Error');
$result = [];
$result['error'] = false;
$result['code'] = "DB_UPDATE_ERROR"; //better with constant
$result['msg'] = "Impossible save bla, bla, bla";
echo json_encode($result);
我认为解决方案是在PHP返回的一开始就添加一个成功/错误代码。
例如,如果data(在ajax的success子句中(函数看起来像"Incorrect Login Credentials"(当然是来自PHP(,那么您应该从PHP发送"200Incorrect Login Information"或"100Success Login"。
正如你在200中看到的那样,我的意思是PHP说有一个错误/身份验证或验证失败,而在100中,我的目的是告诉AJAX,一切都是从PHP端接受的。
然后你可以在jquery中这样做:
var data_code = data.substring(0,3);
var return_message = data.substring(3); // this is return message without code
if(data_code == 100) {
//its a success
document.location.replace("success.html");
} else if(data_code == 200) {
//its a fail
alert("Error: " + return_message);
}
编辑:
if(empty($order_id) === true || empty($comment) === true) {
echo "200comment or order id is empty";
exit();
} else if($num_rows_reviewed> 0) {
echo "200";
exit();
} elseif($no_id_match == 0) {
echo "200";
exit();
} elseif(strlen($comment) > 499) {
echo "200 comment cannot be bigger then 499";
exit();
} else {
echo"100"; // all is good
请注意,这个方法和预期的一样工作,但有点棘手,我在不想使用json的地方也使用它(正如其他用户所回答的那样(。
编辑
success: function(data){
var data_code = data.substring(0,3);
var return_message = data.substring(3); // this is return message without code
if(data_code == 100) {
var item = $(return_message).hide().fadeIn(800);
$('.new-comment').append(item);
form.trigger('reset');
submit.val('Submit Comment').removeAttr('disabled');
} else if(data_code == 200) {
//its a fail
alert("Error: " + return_message);
}
},
我建议使用JSON作为响应格式。因此,您可以在一个额外的响应密钥中发送一条错误消息。示例
{
data: "<div>...</div>",
error: "username does not exist"
}
在响应函数中,您可以使用返回的密钥访问不同的数据。
success: function(returnedData){
$('.new-comment').append(returnedData.data);
if (returnedData.error) $('.error').append(returnedData.error);
},
请确保将ajax请求的dataType设置为"json"。
$(document).ready(function(){
var form = $('form');
var submit = $('#submit');
form.on('submit', function(e) {
e.preventDefault();
$.ajax({
url: 'ajax_comment.php',
type: 'POST',
cache: false,
data: form.serialize(),
dataType:'json',
beforeSend: function(){
submit.val('Posting...').attr('disabled', 'disabled');
},
success: function(data){
if(data.status) {
var item = $(data).hide().fadeIn(800);
$('.new-comment').append(item);
form.trigger('reset');
submit.val('Submit Comment').removeAttr('disabled');
} else {
alert(data.message);
for(var value in data.fields) {
alert(data.fields[value]); // can do error placement as well
}
}
},
error: function(e){
alert(e);
}
});
});
});
在ajax_comment.php文件只需编写代码作为示例你的其余代码如果错误
$response['status'] = false;
$response['fields']['username'] = 'Not valid'; // fields name should be same like your
$response['message'] = 'There are some error with given input, please correct';
表单字段名称,因此错误位置将很容易
如果没有任何错误
$response['status'] = true;
$response['message'] = 'Successfully Submitted';
echo json_encode($response);