2012-03-12 26 views
57

Sigo recibiendo la alerta de error. No hay nada de malo en la parte MYSQL, la consulta se ejecuta y puedo ver las direcciones de correo electrónico en el archivo db.¿Cómo devuelvo un mensaje correcto de éxito/error para JQuery .ajax() usando PHP?

El lado del cliente:

<script type="text/javascript"> 
    $(function() { 
    $("form#subsribe_form").submit(function() { 
     var email = $("#email").val(); 

     $.ajax({ 
     url: "subscribe.php", 
     type: "POST", 
     data: {email: email}, 
     dataType: "json", 
     success: function() { 
      alert("Thank you for subscribing!"); 
     }, 
     error: function() { 
      alert("There was an error. Try again please!"); 
     } 
     }); 
     return false; 
    }); 
    }); 
</script> 

El lado del servidor:

<?php 
$user="username"; 
$password="password"; 
$database="database"; 

mysql_connect(localhost,$user,$password); 
mysql_select_db($database) or die("Unable to select database"); 

$senderEmail = isset($_POST['email']) ? preg_replace("/[^\.\-\_\@a-zA-Z0-9]/", "", $_POST['email']) : ""; 

if($senderEmail != "") 
    $query = "INSERT INTO participants VALUES (CURDATE(),'".$senderEmail."')"; 
mysql_query($query); 
mysql_close(); 

$response_array['status'] = 'success';  

echo json_encode($response_array); 
?> 
+6

Considere el uso de pdo, las funciones de mysql_ son obsoletas –

Respuesta

103

Es necesario proporcionar el tipo de contenido correcto si está usando JSON tipo de datos. Antes de repetir el json, coloque el encabezado correcto.

<?php  
    header('Content-type: application/json'); 
    echo json_encode($response_array); 
?> 

solución adicional, usted debe comprobar si la consulta tiene éxito o no.

if(mysql_query($query)){ 
    $response_array['status'] = 'success'; 
}else { 
    $response_array['status'] = 'error'; 
} 

En el lado del cliente:

success: function(data) { 
    if(data.status == 'success'){ 
     alert("Thank you for subscribing!"); 
    }else if(data.status == 'error'){ 
     alert("Error on query!"); 
    } 
}, 

espero que ayude.

+1

Ah, y debe diferenciar * error del servidor * y * error de transmisión *. Puse el cheque en la parte de 'éxito' de AJAX para verificar el valor enviado por el servidor (por lo que no es un error de transmisión). –

19

Algunas personas recomiendan el uso de códigos de estado HTTP, pero preferiría que desprecian la práctica. p.ej. Si está haciendo un motor de búsqueda y las palabras clave proporcionadas no tienen resultados, la sugerencia sería devolver un error 404.

Sin embargo, considero que es incorrecto. Los códigos de estado HTTP se aplican al navegador real < -> conexión de servidor. Todo sobre la conexión fue perfecto. El navegador hizo una solicitud, el servidor invocó el script del controlador. El script devolvió 'no filas'. Nada en eso significa que "404 página no encontrada" - se encontró la página WAS.

En cambio, estoy a favor de divorciar la capa HTTP del estado de las operaciones del lado del servidor. En lugar de simplemente devolver algo de texto en una cadena json, siempre devuelvo una estructura de datos JSON que encapsula el estado de la solicitud y solicita resultados.

p. Ej. en PHP tendrías

$results = array(
    'error' => false, 
    'error_msg' => 'Everything A-OK', 
    'data' => array(....results of request here ...) 
); 
echo json_encode($results); 

Luego, en el código del lado del cliente que tendríamos

if (!data.error) { 
    ... got data, do something with it ... 
} else { 
    ... invoke error handler ... 
} 
28

Para que lo sepas, puedes usar esto para la depuración.Me ayudó mucho, y todavía lo hace

error:function(x,e) { 
    if (x.status==0) { 
     alert('You are offline!!\n Please Check Your Network.'); 
    } else if(x.status==404) { 
     alert('Requested URL not found.'); 
    } else if(x.status==500) { 
     alert('Internel Server Error.'); 
    } else if(e=='parsererror') { 
     alert('Error.\nParsing JSON Request failed.'); 
    } else if(e=='timeout'){ 
     alert('Request Time out.'); 
    } else { 
     alert('Unknow Error.\n'+x.responseText); 
    } 
} 
+0

¡Genial! Acabo de enterarme que mi servidor no es compatible con json_encode – Pieter

+0

@Pieter: luego implemente su propio js_encode :) Pruebe este: http://snippets.dzone.com/posts/show/7487 –

+0

Entendido, thx Muhammad. – Pieter

0

añadiendo al principio Respuesta: aquí algunos ejemplos de código de PHP y jQuery:

$("#button").click(function() { 
$.ajax({ 
      type: "POST", 
      url: "handler.php", 
      data: dataString, 

       success: function(data) { 

        if(data.status == "success"){ 

       /* alert("Thank you for subscribing!");*/ 

        $(".title").html(""); 
        $(".message").html(data.message) 
        .hide().fadeIn(1000, function() { 
         $(".message").append(""); 
         }).delay(1000).fadeOut("fast"); 

       /* setTimeout(function() { 
         window.location.href = "myhome.php"; 
        }, 2500);*/ 


        } 
        else if(data.status == "error"){ 
         alert("Error on query!"); 
        } 




        } 


     }); 

     return false; 
    } 
}); 

PHP - enviar mensaje personalizado/estado:

$response_array['status'] = 'success'; /* match error string in jquery if/else */ 
    $response_array['message'] = 'RFQ Sent!'; /* add custom message */ 
    header('Content-type: application/json'); 
    echo json_encode($response_array); 
1

con el fin de construir un servicio web AJAX, se necesitan dos archivos:

  • Un Javascript llamada que envía datos como POST (podría ser tan GET) usando jQuery AJAX
  • Un PHP servicio web que devuelve un objeto JSON (esto es conveniente para volver arrays o gran cantidad de datos)

Así , primero llama a su servicio web usando esta sintaxis JQuery, en el archivo JavaScript:

$.ajax({ 
    url : 'mywebservice.php', 
    type : 'POST', 
    data : 'records_to_export=' + selected_ids, // On fait passer nos variables, exactement comme en GET, au script more_com.php 
    dataType : 'json', 
    success: function (data) { 
      alert("The file is "+data.fichierZIP); 
    }, 
    error: function(data) { 
      //console.log(data); 
      var responseText=JSON.parse(data.responseText); 
      alert("Error(s) while building the ZIP file:\n"+responseText.messages); 
    } 
}); 

su archivo PHP (mywebservice.php, como está escrito en la llamada AJAX) debe incluir algo como esto en su extremo, para devolver una corregir el estado de éxito o error:

<?php 
    //... 
    //I am processing the data that the calling Javascript just ordered (it is in the $_POST). In this example (details not shown), I built a ZIP file and have its filename in variable "$filename" 
    //$errors is a string that may contain an error message while preparing the ZIP file 
    //In the end, I check if there has been an error, and if so, I return an error object 
    //... 

    if ($errors==''){ 
     //if there is no error, the header is normal, and you return your JSON object to the calling JavaScript 
     header('Content-Type: application/json; charset=UTF-8'); 
     $result=array(); 
     $result['ZIPFILENAME'] = basename($filename); 
     print json_encode($result); 
    } else { 
     //if there is an error, you should return a special header, followed by another JSON object 
     header('HTTP/1.1 500 Internal Server Booboo'); 
     header('Content-Type: application/json; charset=UTF-8'); 
     $result=array(); 
     $result['messages'] = $errors; 
     //feel free to add other information like $result['errorcode'] 
     die(json_encode($result)); 
    } 
?> 
Cuestiones relacionadas