使用Json从$ .ajax发送的PHP文件数据

时间:2014-04-11 13:48:58

标签: javascript php jquery ajax json

因为我需要从php文件中提取单独的数据,并创建一个用jQuery注入的HTML片段,所以我选择了Json。

我从PHP主文件(脚本标记之间)发送它,如下所示:

$.ajax({dataType: "json", url:'course_generator.php', data:{co_subj_co:editedCourseId}}).done(function(newCourse){
    var newCourseStructure = '<div class="tableRow dynamicRow noHeight injectedRow" data-isMultisubjectValue="'+isMultisubjectValue+'" data-subjectsNum="'+subjectsNum+'" data-id="'+courseId+'" id="'+courseId+'" data-abbrev="'+newCourseAbbrev+'" data-courseTypeId="'+newCourseTypeId+'" title="'+newCourseName+'"><div class="contentColumn40"><span class="tableContentText">'+newCourseName+' ('+newCourseTypeName+')</span></div><div class="contentColumn40">'+subjectList+'</div><div class="contentColumn10"><div class="tableIconLink"><a href="#"><div class="editIcon" data-id="'+courseId+'" title="Editar '+newCourseName+'"></div></a></div></div><div class="contentColumn10"><div class="tableIconLink"><a href="#"><div data-id="'+courseId+'" class="discontinueIcon" title="Discontinuar '+newCourseName+'"></div></a></div></div></div>';}

这会正确发送editedCourseId值。 course_generator.php内的内容是:

$courseId = $_POST['co_subj_co'];

$select_co = mysql_query("SELECT * FROM course_conf JOIN course_type ON co_fk_ct_id=ct_id JOIN co_rel_subj ON co_subj_co='$courseId' JOIN subject_conf ON su_id=co_subj_subj WHERE co_id='$courseId'");
$result_co = mysql_fetch_array($select_co);

$newCourseId = $result_co['co_id'];
$newCourseName = $result_co['co_name'];
$newCourseAbbrev = $result_co['co_abbrev'];
$newCourseTypeId = $result_co['co_fk_ct_id'];
$newCourseTypeName = $result_co['ct_name'];
$isMultisubjectValue = $result_co['co_multisubject'];

$newCourseValues = '{"newCourseId":'.$newCourseId.',"newCourseName":'.$newCourseName.',"newCourseAbbrev":'.$newCourseAbbrev.',"newCourseTypeId":'.$newCourseTypeId.',"newCourseTypeName":'.$newCourseTypeName.',"isMultisubjectValue":'.$isMultisubjectValue.'}';

我担心我没有通过$courseId = $_POST['co_subj_co'];正确接收它,并且我的主要PHP文件上没有正确接收$newCourseValues,因为newCourseStructure没有生成任何内容。请问你能确定我确定的几个错误吗?谢谢。


更新:

将我的PHP主文件更改为:

$.ajax({type : 'POST', dataType: "json", url:'config/forms/course_conf/course_generator.php', data:{co_subj_co:editedCourseId}}).done(function(newCourse){
var courseId = newCourse.newCourseId;
var newcourseName = newCourse.newCourseName;
var isMultisubjectValue = newCourse.isMultisubjectValue;
var subjectsNum = newCourse.subjectsNum;
var newCourseAbbrev = newCourse.newCourseAbbrev;
var newCourseTypeId = newCourse.newCourseTypeId;
var newCourseTypeName = newCourse.newCourseTypeName;
var newCourseStructure = '<div class="tableRow dynamicRow noHeight injectedRow" data-isMultisubjectValue="'+isMultisubjectValue+'" data-subjectsNum="'+subjectsNum+'" data-id="'+courseId+'" id="'+courseId+'" data-abbrev="'+newCourseAbbrev+'" data-courseTypeId="'+newCourseTypeId+'" title="'+newCourseName+'"><div class="contentColumn40"><span class="tableContentText">'+newCourseName+' ('+newCourseTypeName+')</span></div><div class="contentColumn40">'+subjectList+'</div><div class="contentColumn10"><div class="tableIconLink"><a href="#"><div class="editIcon" data-id="'+courseId+'" title="Editar '+newCourseName+'"></div></a></div></div><div class="contentColumn10"><div class="tableIconLink"><a href="#"><div data-id="'+courseId+'" class="discontinueIcon" title="Discontinuar '+newCourseName+'"></div></a></div></div></div>';}

我的course_generator.php文件:

$courseId = intval($_POST['co_subj_co']);
$subjectList = "";
$data ="";

$select_co = mysql_query("SELECT * FROM course_conf JOIN course_type ON co_fk_ct_id=ct_id JOIN co_rel_subj ON co_subj_co='$courseId' JOIN subject_conf ON su_id=co_subj_subj WHERE co_id='$courseId'");
$result_co = mysql_fetch_array($select_co);

$outArr['newCourseId'] = $result_co['co_id'];
$outArr['newCourseName'] = $result_co['co_name'];
$outArr['newCourseAbbrev'] = $result_co['co_abbrev'];
$outArr['newCourseTypeId'] = $result_co['co_fk_ct_id'];
$outArr['newCourseTypeName'] = $result_co['ct_name'];
$outArr['isMultisubjectValue'] = $result_co['co_multisubject'];

$subjectsNum=mysql_num_rows(mysql_query("SELECT * FROM co_rel_subj WHERE co_subj_co = '$courseId'"));

$outArr['subjectsNum'] = $subjectsNum;
echo json_encode($outArr);

这不是显示HTML结构的结构,而是$newCourseStructure结果:

{"newCourseId":"243","newCourseName":"a","newCourseAbbrev":"ae","newCourseTypeId":"1","newCourseTypeName":"M\u00e1ster","isMultisubjectValue":"1","subjectList":"
Edici\u00f3n y Acabado de Imagen Digital<\/div>
","subjectsNum":1}

5 个答案:

答案 0 :(得分:2)

您的JSON字符串无效JSON,因为您不会在字符串值周围使用引号。而不是手动创建JSON,创建一个数组或对象,然后json_encode()它。

您不必输出JSON字符串。使用echoprint

dataType : 'json'添加到您的ajax请求中,以便jQuery解析JSON,返回本机JavaScript对象。您在成功函数中使用的所有变量都是undefined。解析JSON后,您应该使用

var courseId = newCourse.newCourseId; // and so on

您的ajax请求没有类型,因此默认为GET。如果您想使用POST,请添加type : 'POST'

答案 1 :(得分:2)

尝试使用$_GET['co_subj_co'];代替POST

只要您没有为jQuery的ajax调用指定方法,它就是由GET制作的,而不是POST。

答案 2 :(得分:1)

您实际上是在使用POST,还是在发出GET请求(您的浏览器的开发人员工具应该很容易告诉您)。您还应确保$courseId$courseId = intval($_POST['co_cubj_co']);的整数。此外,您应该为未找到请求的ID的事件添加条件。

答案 3 :(得分:1)

正如MueR建议的那样,确保courseID为整数的原因是为了防止SQL注入(除非你希望人们做任何事情,比如随意删除你的整个数据库)。当然,这假设courseID类似于autoincrement int。

但是,您还遇到了许多其他问题。你的JSON无效,因为你表面上写出了不带引号的字符串......你应该只使用json_encode:

$outArr = array();
$outArr['newCourseId'] = $result_co['co_id'];
$outArr['newCourseName'] = $result_co['co_name'];
...
echo json_encode($outArr);

就个人而言,我更喜欢使用$ _REQUEST,它连接$ _POST和$ _GET。使其更容易。

答案 4 :(得分:1)

我在代码中注释了两件事:

$.ajax({
    type : 'POST', 
    dataType: "json", 
    url:'config/forms/course_conf/course_generator.php',
    data:{
        co_subj_co:editedCourseId
    }})
    .done(function(newCourse){
        var courseId = newCourse.newCourseId;
        var newcourseName = newCourse.newCourseName;
        var isMultisubjectValue = newCourse.isMultisubjectValue;
        var subjectsNum = newCourse.subjectsNum;
        var newCourseAbbrev = newCourse.newCourseAbbrev;
        var newCourseTypeId = newCourse.newCourseTypeId;
        var newCourseTypeName = newCourse.newCourseTypeName;
        var newCourseStructure = '<div class="tableRow dynamicRow noHeight injectedRow"'
        + ' data-isMultisubjectValue="' + isMultisubjectValue + '"'
        + ' data-subjectsNum="' + subjectsNum + '"'
        + ' data-id="' + courseId + '"'
        + ' id="' + courseId + '"'
        + ' data-abbrev="' + newCourseAbbrev + '"'
        + ' data-courseTypeId="' + newCourseTypeId + '"'
        + ' title="' + newCourseName + '">'
        + '<div class="contentColumn40"><span class="tableContentText">'
        + newCourseName + ' (' + newCourseTypeName + ')</span></div>'
        // WHERE IS subjectList DEFINED?
        + '<div class="contentColumn40">' + subjectList 
        + '</div>'
        + '<div class="contentColumn10"><div class="tableIconLink">'
        + '<a href="#"><div class="editIcon" data-id="' + courseId + '"'
        + ' title="Editar ' + newCourseName + '"></div>'
        + '</a></div></div><div class="contentColumn10"><div class="tableIconLink">'
        + '<a href="#"><div data-id="'+courseId+'" class="discontinueIcon" '
        + 'title="Discontinuar '+newCourseName+'"></div></a></div></div></div>';
    /*
     * your HTML is generated, but you never put it in the DOM
     */
    $('#idOutputWrapper').empty().html(newCourseStructure);
}

当你使用json响应中的subjectList时,请注意它出于某种原因附带一个结束</div>标记,也许你应该改变它。

顺便说一下:你的代码格式很糟糕,很抱歉这么说。您可以在将js上传到服务器之前对其进行压缩,但在处理它时,它需要具有可读性。我只是编辑它以更好地适应这里的代码块。