从 PHP 运行返回错误。阿贾克斯?
Posted
技术标签:
【中文标题】从 PHP 运行返回错误。阿贾克斯?【英文标题】:Return errors from PHP run via. AJAX? 【发布时间】:2011-05-23 23:50:27 【问题描述】:如果 php 脚本在某处失败,有没有办法让 PHP 返回 AJAX 错误代码? 我正在学习一个教程并将其输入到我的 PHP 中:
$return['error'] = true; $return['msg'] = "无法连接到数据库";一切都很好,直到我意识到这是 JSON 数据。有没有办法使用标准 $_POST 返回错误并返回 html 数据(如触发 jQuery 的 AJAX error:
事件?
【问题讨论】:
【参考方案1】:我不了解 jQuery,但如果它区分成功和不成功(HTTP 200 OK 与 HTTP != 200)Ajax 请求,您可能希望您的 PHP 脚本以不等于 200 的 HTTP 代码响应:
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)));
【讨论】:
谢谢 :-) 看起来很简单!另外,Booboo
是官方的吗,或者可以是什么?
呵呵。它可以是任何东西。不过,“官方”术语是“内部服务器错误”。
@Bojangles 世纪评论哈哈 ^_^ 无法阻止自己发表评论。 :p
@LinusKleen 不,我认为Booboo
应该是标准。或者Foofd
请注意,这可能会导致标准 IIS 安装/配置出现问题,因为 IIS 提供了一个 htm 站点并覆盖了您的 json 响应,以及您可能会覆盖的客户端 JSON.parse()已经实现,抛出异常。使用以下行更改 web.config 对我有帮助,但我不确定所有 IIS 配置组合是否都是这种情况:<httpErrors errorMode="Custom" existingResponse="PassThrough"/>
【参考方案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));
【讨论】:
您需要使用 $_SERVER['HTTP_X_REQUESTED_WITH'] 强制您的请求。当 Accept 标头不匹配时,Firefox 等浏览器不会评估响应。【参考方案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;
?>
【讨论】:
这不会触发 OP 请求的 $.ajax 错误事件。【参考方案4】:对于从 PHP 到 AJAX 的简单数据传输,Json 编码或键值对并不总是必要的。它可以简单地使用字符串处理来完成。
解释此功能的示例代码如下。
$query = "从登录中选择电子邮件,其中电子邮件 = '"。 mysqli_real_escape_string($conn,$email) ."' AND 密码 = '"。 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]; 如果($row_cnt == 1) $response="成功"; 别的 $response = "无效凭证"; $conn->关闭(); $_SESSION["email"]= $s_email; 回声$响应;此代码显示了如何将“成功”响应发送回调用 php 代码的 ajax。进一步在 ajax 中,可以执行以下操作来检索响应。
$.ajax( type : 'POST', 数据:电子邮件:$('#email').val(),密码:$('#pass').val(), 网址:'login.php', 成功:函数(数据) if(data == 'success') //php回显的值可以存放在ajax的data变量中 window.location.assign('upload.php'); 别的 警报(数据); , 错误:函数(xhr) 警报(“错误”); );上述概念也可以扩展为返回 MULTIPLE VALUES。此方法允许以字符串格式将数据从 PHP 简单传输到 AJAX。
我们必须遵循一个简单的步骤,将我们需要发送的所有内容作为响应从 php 发送到 ajax,并由唯一的分隔符分隔。
回声 $response.#; 回声$电子邮件。#; 回声$密码。#; 回声“你好”。#; 回声“世界”;然后可以像上面的例子一样简单地检索ajax中的变量数据和一个简单的函数,
var res = data.split("#");data,作为ajax中的变量。 然后可以在 js 中将 res 数组用于我们需要的任何目的。
【讨论】:
这没有回答我原来的问题。我不想滚动自己的数据格式(这是一个非常糟糕的主意),我实际上想在状态标题中发送 500。顺便说一句,JSON 有什么问题?Seeing such complicated answers pains me.
;通过创建自己的数据格式,您的答案可能是最不必要的复杂。您还应该使用 PDO(或更好的替代方案;我没有跟上 PHP 生态系统的步伐)而不是 mysqli_*
以获得更好的安全性。
对不起,如果该声明似乎冒犯了其他答案。我只是提出了一个简单的想法,即返回数据而不是 json 编码。有时控制数据比依赖内置功能有很大帮助。我使用 mysqli 作为示例 PDO 是迄今为止最好的方法之一。以上是关于从 PHP 运行返回错误。阿贾克斯?的主要内容,如果未能解决你的问题,请参考以下文章
Ajax 请求 500 错误 - 在 null 上调用成员函数
脚本 @php artisan package:discover 处理返回的 post-autoload-dump 事件,错误代码为 255