2011-02-28 27 views
12

He estado buscando la solución pero no encuentro nada que funcione. Estoy tratando de obtener un montón de datos de la base de datos y luego a través de los campos de entrada de autocompletar AJAX en un formulario. Para hacer esto, he decidido usar json, porque ¿por qué no? O bien, he estado pensando en devolver una cadena delimitada y luego en tokenizarla, lo que a primera vista hubiera sido mucho más fácil y me hubiera ahorrado el dolor de cabeza ... Sin embargo, como he decidido usar JSON, supongo que debería quedarse con eso y descubrir lo que salió mal! Lo que sucede es que cuando se ejecuta la función get_member_function(), aparece un error en un diálogo de alerta y se lee "[object Object]". Lo he intentado también con la solicitud GET y estableciendo contentType en "application/json; charset = utf-8 ". Por desgracia, no hay dados. ¿Alguien puede sugerir lo que estoy haciendo mal? Cuídate, Piotr.

Mi función javascript/jQuery es la siguiente:

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

     } 

    }); 

} 

y el código correspondiente en el "contenido/php_scripts/admin_scripts.php" es el siguiente:

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

Probar alerta (JSON.stringify (error)) ya que debería mostrar más información sobre el error en el cuadro de diálogo de alerta –

+0

Supongo que hay un error de PHP antes de que se haga eco de JSON. Compruebe su función de búsqueda, está abordando los datos como $ row ['clave'], por lo que debería haber usado mysql_fetch_assoc en su lugar, creo. Cambiar '$ row = mysql_fetch_array ($ result);' a '$ row = mysql_fetch_assoc ($ result);' y ver si funciona. –

+0

Preste atención: si no hay desinfección previa, es vulnerable a la inyección de SQL. – Andrea

Respuesta

24

Creo que sé esta uno ...

Pruebe a enviar su JSON como JSON utilizando header() función de PHP:

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

Aunque está pasando un JSON válido, $ .ajax de jQuery no lo cree porque le falta el encabezado.

jQuery solía estar bien sin el encabezado, pero se cambió algunas versiones atrás.

TAMBIÉN

Asegúrese de que el script está volviendo JSON válida. Use Firebug o Google Chrome's Developer Tools para verificar la respuesta de la solicitud en la consola.

ACTUALIZACIÓN

También tendrá que actualizar el código para desinfectar el $ _POST para evitar ataques de inyección SQL. Además de proporcionar algunos errores de captura.

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

Hola McHerbie, ¡gracias por tu rápida respuesta! Lamentablemente, esto tampoco funcionó ... – Piotr

+0

He actualizado la respuesta anterior para incluir una actualización del código. Verifique para asegurarse de que su consulta está devolviendo resultados y un error no está rompiendo la respuesta JSON. – McHerbie

+0

Además, intente pasar el parámetro $ replace al encabezado: header ("Content-Type: application/json", true); – McHerbie

9

Pruebe a utilizar jQuery.parseJSON cuando recupere los datos.

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

devuelve datos vacíos si configuro 'dataType: 'json'', de lo contrario imprime el elemento json completo en html como este' [{"id": "1001", "full_name": "raju"}] '. – 151291

2

Además de la nota de McHerbie, tratar json_encode($json_arr, JSON_FORCE_OBJECT); si está en PHP 5.3 ...

+0

Gracias Shehi, eso tampoco lo hizo, me temo. – Piotr

5

La función $.ajaxerror toma tres argumentos, no uno:

error: function(xhr, status, thrown) 

Es necesario volcar el segundo y tercer parámetros para encontrar su causa, no la primera.

+1

Hola gracias Alnitak, aquí está lo que el estado y arrojó: 'parsererror - jQuery150010872808285057545_1298928988511 no se llamó' ¿Tiene alguna sugerencia sobre esto? – Piotr

+0

Sí, Alnitak, tengo curiosidad también. Tener problemas similares .. –

0

Si está utilizando una versión más nueva (más de 1.3.x) debería aprender más acerca de la función parseJSON! Experimenté el mismo problema.Utilizar una versión antigua o cambiar su código

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

Bueno, podría ayudar a alguien. Fui lo suficientemente estúpido como para poner var_dump('testing'); en la función de la que estaba solicitando JSON para asegurarme de que realmente se recibió la solicitud. Obviamente, este eco también forma parte de la respuesta esperada json, y con dataType definido como json definido, la solicitud falla.

Cuestiones relacionadas