Возвращать ошибки с PHP через. AJAX?
Есть ли способ заставить PHP возвращать код ошибки AJAX, если PHP скрипт не удается?
Я следил за учебником и набрал это для своего PHP:
$return['error'] = true;
$return['msg'] = "Could not connect to DB";
И все было хорошо, пока я не понял, что это данные JSON. Есть ли способ вернуть ошибки с использованием стандартных $_POST и возвращенных данных HTML (как в случае запуска события jQuery AJAX error:
?
Ответы
Ответ 1
Я не знаю о jQuery, но если он различает успешные и неудачные (HTTP 200 OK vs. HTTP!= 200) запросы Ajax, вы можете захотеть, чтобы ваш PHP script ответил HTTP-кодом, не равным 200
if ($everything_is_ok)
{
header('Content-Type: application/json');
print json_encode($result);
}
else
{
header('HTTP/1.1 500 Internal Server Booboo');
header('Content-Type: application/json; charset=UTF-8');
die(json_encode(array('message' => 'ERROR', 'code' => 1337)));
}
Ответ 2
$return = array();
$return['msg'] = "Could not connect to DB";
if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')
{
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Content-type: application/json');
die(json_encode($return));
}
Ответ 3
попробуйте это. Надеюсь, поможет.
<!-- This is index.php --->
<html>
<head>
<script src="js/jquery.js" type="text/javascript"></script><!-- link to jQuery -->
<script language="javascript">
$(document).ready(function () {
$('input#send').click(function(){
/* Empty div#error and div#result incase they contain info from the last submission */
$('#error').empty('');
$('#result').empty('');
/* Client-side validation */
var name = $("input#name").val();
var age = $("input#age").val();
if (name==''){
alert('Insert your name.');
}
else if (age==''){
alert('Insert your age.');
} else {
var params = 'name=' + name + '&age=' + age;
$.ajax({
url:'b.php',
type:'post',
dataType:'html',
data:params,
cache: false,
success:data
});
function data (html) {
var $html = $( html ); // create DOM elements in a jQuery object
/* Return errors from 'b.php' */
$html.filter('#err').appendTo("#error");
/* Return valid Post */
$html.filter('#res').appendTo("#result");
/* Clear name input */
$('input#name').val('');
/* Clear age input */
$('input#age').val('');
}
}
});
});
</script>
<style type='text/css'>
#error{
color:maroon;
font-weight:bold;
}
#result{
color:green;
font-weight:bold;
}
</style>
</head>
<body>
<div id="error"></div><!-- View Errors -->
<div id="result"></div><!-- View valid Post -->
<input type='text' name='name' id="name" value='' /><br/ >
<input type='text' name='age' id="age" value='' /><br/ >
<input type='submit' name='send' id="send" value='Send' />
</body>
<?php
/* This is b.php */
if(($_POST['name']=='')||($_POST['age']=='')){
$error = '<div id="err">Error: Fill in ALL fields.</div>';
} elseif(is_numeric($_POST['name'])){
$error = '<div id="err">Error: Name should NOT contain numbers.</div>';
} elseif(!is_numeric($_POST['age'])){
$error = '<div id="err">Error: Age should ONLY contain numbers.</div>';
} else{
$result = '<div id="res">Hi '.$_POST['name'].', you are '.$_POST['age'].' years old.</div>';
}
echo $error;
echo $result;
?>
Ответ 4
Для простой передачи данных с PHP на AJAX не всегда нужны коды кодирования Json или пары ключей. Его можно просто выполнить с помощью обработки строк.
Ниже приведен пример кода, объясняющего эту функциональность.
$query = "SELECT email FROM login WHERE email = '". mysqli_real_escape_string($conn,$email) ."' AND password = '". mysqli_real_escape_string($conn,$pass) ."'" ;
$result = mysqli_query($conn,$query);
$row=mysqli_fetch_row($result);
$row_cnt = mysqli_num_rows($result);
$s_email = $row[0];
if ($row_cnt == 1) {
$response="success";
} else {
$response = "Invalid Credentials";
}
$conn->close();
$_SESSION["email"]= $s_email;
echo $response;
Этот код показывает, как ответ "успех" отправляется обратно в ajax, вызывающий php-код. Далее в ajax можно было бы сделать следующее, чтобы получить ответ.
$.ajax({ type : 'POST',
data : {email: $('#email').val(), password: $('#pass').val()},
url : 'login.php',
success: function (data) {
if(data == 'success'){ //the value echoed from php can be stored in the data variable of ajax
window.location.assign('upload.php');
}
else{
alert(data);
}
},
error: function ( xhr ) {
alert("error");
}
});
Вышеупомянутая концепция может быть расширена, чтобы вернуть МНОГОЯЗЫЧНЫЕ ЦЕННОСТИ. Этот метод позволяет простой перенос данных с PHP на AJAX в строковый формат.
Мы должны следовать простому шагу, чтобы повторить все, что нам нужно отправить в ответ от php на ajax, разделенный уникальным разделителем.
echo $response.#;
echo $email.#;
echo $password.#;
echo "Hello".#;
echo "World";
Затем переменные данные в ajax могут быть просто извлечены, как в приведенном выше примере, и простую функцию типа
var res = data.split("#");
являясь переменной внутри ajax.
Затем массив res может использоваться в js для любой цели.