簡體   English   中英

使用Json從$ .ajax發送的PHP文件中獲取數據

[英]Bring from a PHP file data sent by $.ajax using 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'];正確接收它$courseId = $_POST['co_subj_co']; ,並且$newCourseValues都沒有在我的主PHP文件中正確接收,因為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}

您的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'

嘗試$_GET['co_subj_co']; 而不是POST

只要您不為jQuery的ajax調用指定方法,它都是由GET而不是POST進行的。

您實際上是在使用POST,還是正在觸發GET請求(您的瀏覽器開發人員工具應該可以輕松地告訴您)。 您還應該通過$courseId = intval($_POST['co_cubj_co']);確保$courseId為整數$courseId = intval($_POST['co_cubj_co']); 此外,您應該為找不到請求的ID的事件添加條件。

正如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串聯在一起。 使其更容易。

我在代碼中注釋了兩件事:

$.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上載到服務器之前對其進行壓縮,但是在對其進行處理時,它需要可讀性。 我只是對其進行了編輯,以使其更適合此處的代碼塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM