2011-02-28 62 views
12

我一直在寻找解决方案,但我找不到任何可行的方法。 我想从数据库中获取一堆数据,然后通过表单中的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); 

     } 

    }); 

} 

和 “内容/ 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); 

    } 
+1

尝试提醒(JSON.stringify(错误)),因为它应该在警报对话框中显示有关错误的更多信息 – 2011-02-28 21:06:20

+0

我猜在JSON被回显之前有一个PHP错误。检查你的获取函数,你正在寻找数据$ row ['key'],所以你应该使用mysql_fetch_assoc来代替,我相信。 更改'$ row = mysql_fetch_array($ result);'到 '$ row = mysql_fetch_assoc($ result);' ,看看它是否有效。 – 2011-02-28 21:06:38

+0

注意:如果以前没有过滤,您很容易受到SQL注入的攻击。 – Andrea 2011-02-28 21:11:13

回答

24

我想我知道这一个...

尝试使用PHP的header()功能发送您的JSON作为JSON:

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

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

jQuery过去没有标题就没问题,但它被改回了几个版本。

ALSO

确保您的脚本返回有效JSON。使用FirebugGoogle Chrome's Developer Tools在控制台中检查请求的响应。

UPDATE

您还需要更新您的代码以消毒$ _ 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; 

} 
+0

嗨麦克黑比,感谢您的迅速回复!不幸的是,这也没有工作... – Piotr 2011-02-28 21:13:10

+0

我已经更新了上面的答案,包括代码更新。检查以确保您的查询返回结果并且错误不会破坏JSON响应。 – McHerbie 2011-02-28 21:19:28

+0

此外,尝试将$ replace参数传递给header:header(“Content-Type:application/json”,true); – McHerbie 2011-02-28 21:20:38

9

尝试使用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); 
} 
+0

成功函数返回空数据,如果我设置'dataType:'json'',否则将完整的json元素打印到html中,就像这样'[{“id”:“1001”,“full_name”:“raju”}]''。 – 151291 2015-11-03 10:27:38

2

除了McHerbie的笔记,尝试json_encode($json_arr, JSON_FORCE_OBJECT);如果你在PHP 5.3 ...

+0

谢谢Shehi,那恐怕没有做到。 – Piotr 2011-02-28 21:15:19

5

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

error: function(xhr, status, thrown) 

你需要倾倒第二和第三个参数找到你的原因,而不是第一个。

+1

嗨Alnitak谢谢,这是什么状态和抛出:'parsererror - jQuery150010872808285057545_1298928988511不叫'你有什么建议吗? – Piotr 2011-02-28 21:37:55

+0

是的,Alnitak,我也很好奇。有类似的问题.. – 2011-12-16 21:01:28

0

如果您使用的是更新的版本(超过1.3.x),您应该了解更多关于parseJSON功能的信息!我遇到了同样的问题。使用旧版本或修改代码

success=function(data){ 
    //something like this 
    jQuery.parseJSON(data) 
} 
0
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
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); 

       } 
        }); 
0

那么,它可能会帮助别人。我很愚蠢地把var_dump('testing');放在我请求JSON的函数中,以确保实际上收到了请求。这显然也是回声,作为预期的json响应的一部分,并且dataType设置为json定义,请求失败。