【问题标题】:jQuery $.ajax request of dataType json will not retrieve data from PHP scriptdataType json 的 jQuery $.ajax 请求不会从 PHP 脚本中检索数据
【发布时间】: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":"解析器错误"}

标签: php jquery ajax json


【解决方案1】:

我想我认识这个……

尝试使用 PHP 的 header() 函数将 JSON 作为 JSON 发送:

/**
 * Send as JSON
 */
header("Content-Type: application/json", true);

虽然您传递的是有效的 JSON,但 jQuery 的 $.ajax 并不这么认为,因为它缺少标头。

jQuery 过去没有标头也可以,但后来改了几个版本。

确保您的脚本返回有效的 JSON。使用FirebugGoogle 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】:

$.ajaxerror 函数接受三个参数,而不是一个:

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 定义,请求失败。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-09-15
            • 1970-01-01
            • 2012-05-17
            • 2021-08-02
            • 1970-01-01
            • 2018-06-09
            • 2023-04-11
            • 2015-07-10
            相关资源
            最近更新 更多