dataType json 的 jQuery $.ajax 请求不会从 PHP 脚本中检索数据
Posted
技术标签:
【中文标题】dataType json 的 jQuery $.ajax 请求不会从 PHP 脚本中检索数据【英文标题】:jQuery $.ajax request of dataType json will not retrieve data from PHP script 【发布时间】:2011-07-06 01:46:10 【问题描述】:我一直在寻找解决方案,但找不到任何可行的方法。 我试图从数据库中获取一堆数据,然后通过表单中的 AJAX 自动完成输入字段。为此,我决定使用 json,因为为什么不呢,对吧?或者,我一直在考虑只发回一个分隔字符串,然后对其进行标记,事后看来,这会容易得多,而且不会让我头疼……因为我决定使用 json,但我想我应该坚持下去,找出问题所在! 发生的情况是,当执行 get_member_function() 时,会在警报对话框中弹出错误并读取“[object Object]”。我也尝试过使用 GET 请求,并将 contentType 设置为“application/json;字符集=utf-8"。唉,没有骰子。谁能建议我做错了什么?保重,彼得。
我的javascript/jQuery函数如下:
function get_member_info()
var url = "contents/php_scripts/admin_scripts.php";
var id = $( "select[ name = member ] option:selected" ).val();
$.ajax(
type: "POST",
dataType: "json",
url: url,
data: get_member: id ,
success: function( response )
$( "input[ name = type ]:eq( " + response.type + " )" ).attr( "checked", "checked" );
$( "input[ name = name ]" ).val( response.name );
$( "input[ name = fname ]" ).val( response.fname );
$( "input[ name = lname ]" ).val( response.lname );
$( "input[ name = email ]" ).val( response.email );
$( "input[ name = phone ]" ).val( response.phone );
$( "input[ name = website ]" ).val( response.website );
$( "#admin_member_img" ).attr( "src", "images/member_images/" + response.image );
,
error: function( error )
alert( error );
);
“contents/php_scripts/admin_scripts.php”中的相关代码如下:
if( isset( $_POST[ "get_member" ] ) )
$member_id = $_POST[ "get_member" ];
$query = "select * from members where id = '$member_id'";
$result = mysql_query( $query );
$row = mysql_fetch_array( $result );
$type = $row[ "type" ];
$name = $row[ "name" ];
$fname = $row[ "fname" ];
$lname = $row[ "lname" ];
$email = $row[ "email" ];
$phone = $row[ "phone" ];
$website = $row[ "website" ];
$image = $row[ "image" ];
$json_arr = array( "type" => $type, "name" => $name, "fname" => $fname, "lname" => $lname, "email" => $email, "phone" => $phone, "website" => $website, "image" => $image );
echo json_encode( $json_arr );
【问题讨论】:
尝试 alert(JSON.stringify(error)) 因为它应该在警报对话框中显示有关错误的更多信息 我猜在回显 JSON 之前有一个 PHP 错误。检查你的 fetch 函数,你将数据寻址为 $row['key'],所以你应该使用 mysql_fetch_assoc 代替,我相信。改变'$row = mysql_fetch_array($result);'到'$row = mysql_fetch_assoc($result);'看看它是否有效。 注意:如果没有之前的清理,你很容易被SQL注入。 您好,谢谢,没有 PHP 错误,在没有 js 调用的情况下运行脚本,它很好...... @Jack Duluoz,是的,我得到了更多信息......这是它吐出的内容:"readyState":4,"responseText":"\"type\":\"Person \",\"name\":\"\",\"fname\":\"Adriana\",\"lname\":\"Pitea\",\"email\":\"piotr.zywien@ gmail.com\",\"电话\":\"1234567\",\"网站\":\"\",\"图片\":null","status":200,"statusText":"解析器错误" 【参考方案1】:我想我认识这个……
尝试使用 PHP 的 header() 函数将 JSON 作为 JSON 发送:
/**
* Send as JSON
*/
header("Content-Type: application/json", true);
虽然您传递的是有效的 JSON,但 jQuery 的 $.ajax 并不这么认为,因为它缺少标头。
jQuery 过去没有标头也可以,但后来改了几个版本。
也
确保您的脚本返回有效的 JSON。使用Firebug 或Google Chrome's Developer Tools 在控制台中检查请求的响应。
更新
您还需要更新代码以清理 $_POST 以避免 sql 注入攻击。以及提供一些错误捕获。
if (isset($_POST['get_member']))
$member_id = mysql_real_escape_string ($_POST["get_member"]);
$query = "SELECT * FROM `members` WHERE `id` = '" . $member_id . "';";
if ($result = mysql_query( $query ))
$row = mysql_fetch_array($result);
$type = $row['type'];
$name = $row['name'];
$fname = $row['fname'];
$lname = $row['lname'];
$email = $row['email'];
$phone = $row['phone'];
$website = $row['website'];
$image = $row['image'];
/* JSON Row */
$json = array( "type" => $type, "name" => $name, "fname" => $fname, "lname" => $lname, "email" => $email, "phone" => $phone, "website" => $website, "image" => $image );
else
/* Your Query Failed, use mysql_error to report why */
$json = array('error' => 'MySQL Query Error');
/* Send as JSON */
header("Content-Type: application/json", true);
/* Return JSON */
echo json_encode($json);
/* Stop Execution */
exit;
【讨论】:
我已经更新了上面的答案以包含代码更新。检查以确保您的查询正在返回结果,并且错误没有破坏 JSON 响应。 另外,尝试将 $replace 参数传递给 header: header("Content-Type: application/json", true); @Piotr,您是否从服务器获得正确的 JSON 响应? @McHerbie,是的,我是......虽然它似乎出现了解析错误,我不知道如何解决它。 这里是错误顺便说一句:"readyState":4,"responseText":"\"type\":\"Person\",\"name\":\"\", \"fname\":\"Adriana\",\"lname\":\"Pitea\",\"email\":\"piotr.zywien@gmail.com\",\"电话\":\" 1234567\",\"website\":\"\",\"image\":null","status":200,"statusText":"parsererror"【参考方案2】:当你取回数据时尝试使用 jQuery.parseJSON。
type: "POST",
dataType: "json",
url: url,
data: get_member: id ,
success: function(data)
response = jQuery.parseJSON(data);
$("input[ name = type ]:eq(" + response.type + " )")
.attr("checked", "checked");
$("input[ name = name ]").val( response.name);
$("input[ name = fname ]").val( response.fname);
$("input[ name = lname ]").val( response.lname);
$("input[ name = email ]").val( response.email);
$("input[ name = phone ]").val( response.phone);
$("input[ name = website ]").val( response.website);
$("#admin_member_img")
.attr("src", "images/member_images/" + response.image);
,
error: function(error)
alert(error);
【讨论】:
如果我设置dataType : 'json'
,成功函数返回空数据,否则将完整的json元素打印到html中,像这样["id":"1001","full_name":"raju "]
。【参考方案3】:
$.ajax
error
函数接受三个参数,而不是一个:
error: function(xhr, status, thrown)
你需要转储第二个和第三个参数来找到你的原因,而不是第一个。
【讨论】:
嗨,Alnitak,谢谢,这是什么状态并抛出了:'parsererror - jQuery150010872808285057545_1298928988511 没有被调用'你对此有什么建议吗?【参考方案4】:除了 McHerbie 的注释,如果您使用的是 PHP 5.3,请尝试 json_encode( $json_arr, JSON_FORCE_OBJECT );
...
【讨论】:
【参考方案5】:Try this...
<script type="text/javascript">
$(document).ready(function()
$("#find").click(function()
var username = $("#username").val();
$.ajax(
type: 'POST',
dataType: 'json',
url: 'includes/find.php',
data: 'username='+username,
success: function( data )
//in data you result will be available...
response = jQuery.parseJSON(data);
//further code..
,
error: function(xhr, status, error)
alert(status);
,
dataType: 'text'
);
);
);
</script>
<form name="Find User" id="userform" class="invoform" method="post" />
<div id ="userdiv">
<p>Name (Lastname, firstname):</p>
</label>
<input type="text" name="username" id="username" class="inputfield" />
<input type="button" name="find" id="find" class="passwordsubmit" value="find" />
</div>
</form>
<div id="userinfo"><b>info will be listed here.</b></div>
【讨论】:
【参考方案6】: session_start();
include('connection.php');
/* function msg($subjectname,$coursename,$sem)
return '"subjectname":'.$subjectname.'"coursename":'.$coursename.'"sem":'.$sem.'';
*/
$title_id=$_POST['title_id'];
$result=mysql_query("SELECT * FROM `video` WHERE id='$title_id'") or die(mysql_error());
$qr=mysql_fetch_array($result);
$subject=$qr['subject'];
$course=$qr['course'];
$resultes=mysql_query("SELECT * FROM course JOIN subject ON course.id='$course' AND subject.id='$subject'");
$qqr=mysql_fetch_array($resultes);
$subjectname=$qqr['subjectname'];
$coursename=$qqr['coursename'];
$sem=$qqr['sem'];
$json = array("subjectname" => $subjectname, "coursename" => $coursename, "sem" => $sem,);
header("Content-Type: application/json", true);
echo json_encode( $json_arr );
$.ajax(type:"POST",
dataType: "json",
url:'select-title.php',
data:$('#studey-form').serialize(),
contentType: "application/json; charset=utf-8",
beforeSend: function(x)
if(x && x.overrideMimeType)
x.overrideMimeType("application/j-son;charset=UTF-8");
,
success:function(response)
var response=$.parseJSON(response)
alert(response.subjectname);
$('#course').html("<option>"+response.coursename+"</option>");
$('#subject').html("<option>"+response.subjectname+"</option>");
,
error: function( error,x,y)
alert( x,y );
);
【讨论】:
【参考方案7】:如果您使用的是较新的版本(超过 1.3.x),您应该了解有关函数 parseJSON 的更多信息!我遇到了同样的问题。使用旧版本或更改代码
success=function(data)
//something like this
jQuery.parseJSON(data)
【讨论】:
【参考方案8】:嗯,它可能对某人有所帮助。我愚蠢到将var_dump('testing');
放在我请求JSON 的函数中,以确保实际收到了请求。这显然也是预期的json
响应的一部分,并且将dataType
设置为json
定义,请求失败。
【讨论】:
以上是关于dataType json 的 jQuery $.ajax 请求不会从 PHP 脚本中检索数据的主要内容,如果未能解决你的问题,请参考以下文章
Jquery的Ajax中contentType和dataType的区别
Jquery的Ajax中contentType和dataType的区别
Jquery ajax json 不执行success的原因 坑爹