web-dev-qa-db-ja.com

dataType jsonのjQuery $ .ajaxリクエストは、PHP script

私は解決策を探していましたが、うまくいくものを見つけることができません。データベースから大量のデータを取得しようとしています。その後、フォームのAJAXオートコンプリート入力フィールドを使用します。これを行うには、jsonを使用することにしました。私は単に区切られた文字列を送り返し、それをトークン化することを考えていましたが、後から見るともっと簡単になり、頭痛がなくなりました... jsonを使用することに決めたので、頑張って何が悪かったのかを見つけてください!get_member_function()が実行されると、アラートダイアログにエラーが表示され、「[オブジェクトオブジェクト]」と表示されます。そしてcontentTypeを” application/json; charset = utf-8”に設定します。残念ながら、サイコロはありません。私が間違っていることを誰かが提案できますか?気をつけて、Piotr。

私の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 );

   }
16
Piotr

私はこれを知っていると思う...

PHPの header() 関数を使用してJSONをJSONとして送信してみてください。

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

有効なJSONを渡していますが、jQueryの$ .ajaxは、ヘッダーが欠落しているためそうは思いません。

jQueryは以前はヘッダーがなくても問題ありませんでしたが、いくつかのバージョンが変更されました。

[〜#〜] also [〜#〜]

スクリプトが有効なJSONを返していることを確認してください。 Firebug または Google Chromeのデベロッパーツール を使用して、コンソールでリクエストの応答を確認します。

[〜#〜] update [〜#〜]

また、SQLインジェクション攻撃を回避するために、コードを更新して$ _POSTをサニタイズする必要があります。いくつかのエラーキャッチも提供します。

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;

}
24
McHerbie

データを取り戻すときに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);
}
9
Peter

$.ajaxerror関数は、1つではなく3つの引数を取ります。

error: function(xhr, status, thrown)

2番目と3番目のパラメータをダンプして、最初の原因ではなく原因を見つける必要があります。

5
Alnitak

McHerbieのメモに加えて、PHP 5.3 ...を使用している場合はjson_encode( $json_arr, JSON_FORCE_OBJECT );を試してください。

2
  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 );

              }
                   });
1
nishant
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>

新しいバージョン(1.3.x以上)を使用している場合は、関数parseJSONについてさらに学習する必要があります。同じ問題が発生しました。古いバージョンを使用するか、コードを変更します

success=function(data){
  //something like this
  jQuery.parseJSON(data)
}

まあ、それは誰かを助けるかもしれません。 JSONを要求していた関数にvar_dump('testing');を入れて、要求が実際に受信されたことを確認するのに十分なほど愚かでした。これは当然、予想されるjson応答の一部としてエコーし、dataTypejsonに設定されていると、要求は失敗します。

0
Tim