1

Tengo un script de ajax el cual va y consulta en un php una BD mysql, si hay un registro devuelvo un echo "si"; y si no "no";

aqui el archivo eliminar_radio_por_serial.php

<?php
//Configuracion de la conexion a base de datos
$link = mysql_connect('localhost', 'wiilson', 'Wilson.456*') or die('No se pudo conectar: ' . mysql_error());
//echo 'Connected successfully';
mysql_select_db('sqlcomunicaciones') or die('No se pudo seleccionar la base de datos');

//variables POST  
  $serial=$_POST['serial'];   

$total = mysql_num_rows(mysql_query("SELECT * FROM dispositivos WHERE serie ='$serial'"));
if($total==0)
{
    echo "no";
}
else
{
  $sql=mysql_query("DELETE FROM dispositivos WHERE serie ='$serial'");
  echo "si"; 
}
// Liberar resultados
mysql_free_result($sql);
// Cerrar la conexión
mysql_close($link);
?>

este si o no lo guardo en una variable resp donde quiero evaluar si es un si para hacer unas cosas mas adelante o si es un no tambien, el problema es quue no entra al if, si imprimo la resp en un alert antes de entrar al if, si la imprime bien, me sale si o no, pero los alert (que uso de prueba) adentro del if, no los ejecuta

aqui el script ajax

function objetoAjax(){
  var xmlhttp=false;
      try 
      {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
      } 
      catch (e) 
      { 
        try 
        {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }  
        catch (E) 
        {
        xmlhttp = false;
        }
      }
      if(!xmlhttp && typeof XMLHttpRequest!='undefined') 
      {
      xmlhttp = new XMLHttpRequest();
      }
      return xmlhttp;
}

//Función para recoger los datos del formulario y enviarlos por post  
function continuar_eliminar()
{
  var serial_digitado=document.getElementById('input_serial').value;  
  if(serial_digitado=="")
  {
          alert('Debe digitar el serial del radio a eliminar');
          location.reload(true);
  }
  else
  {
    var desicion = confirm("¿Esta seguro?");
    if (desicion == true)
    {
      var serial=document.getElementById("input_serial").value;
    }
    else
    {
      location.reload(true);
    }
  }

  //div donde se mostrará lo resultados
  divResultado = document.getElementById('resultado');

  //instanciamos el objetoAjax
  ajax=objetoAjax(); 
  //uso del medotod POST
  //archivo que realizará la operacion
  //eliminar_radio_por_serial.php
  ajax.open("POST", "eliminar_radio_por_serial.php",true);
  //cuando el objeto XMLHttpRequest cambia de estado, la función se inicia
  ajax.onreadystatechange=function() 
  {
    if (ajax.readyState==4) {
      //mostrar resultados en esta capa
    divResultado.innerHTML = ajax.responseText

    //guardo si o no aqui en la variable resp
    var resp=ajax.responseText;

    // como prueba, imprimo el resultado y si funciona efectivamente
    alert(resp);

    if(resp=="si")  //aqui ya probé con ===
      {
        //aqui al if donde no entra
        alert('si hay registros');
      }
    if(resp=="no")
      {
        //a este tampoco
        alert('no hay registros');
      }
    }
  }
    //LimpiarCampos(); 
  ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  //enviando los valores a registro.php para que inserte los datos
  ajax.send("serial="+serial)
}
A. Cedano
  • 86,578
  • 19
  • 122
  • 221
Gabriel Uribe Gomez
  • 579
  • 2
  • 7
  • 24
  • ¿Si haces `alert(typeof resp)` qué imprime? ¿Podrías probar tu petición adaptándola a [este método](https://es.stackoverflow.com/a/87002/29967)? – A. Cedano Sep 19 '17 at 21:53
  • acabé de hacerlo y me dice que es String, obviamente por fuera del if por que dentro como he dicho, no entra como tal – Gabriel Uribe Gomez Sep 19 '17 at 21:56
  • Al parecer el responseText de Ajax viene a veces con saltos de línea. Si guardas la variable así: `var resp=ajax.responseText.trim();` debería funcionar. – A. Cedano Sep 20 '17 at 00:02
  • @A.Cedano efectivamente eso era!! muchas gracias!! pero quede sin saber, que efecto hace el agregar .trim() a que te refieres con saltos de linea – Gabriel Uribe Gomez Sep 21 '17 at 01:38
  • Me alegra de que se haya solucionado. He redactado una respuesta documentada y con más detalles. De paso la puedes marcar como solución para que la pregunta no aparezca como sin resolver. Saludos. – A. Cedano Sep 21 '17 at 14:12

2 Answers2

2

En ocasiones el responseText de Ajax viene con un salto de línea adicional. ¿A qué se puede deber eso? Los motivos son diversos y pueden incluso variar según el servidor o la versión de PHP.

Para tratar de evitarlo, conviene no dejar saltos de línea o espacios en blanco antes de la etiqueta de cierre (?>) del script PHP que envía la respuesta a Ajax.

De todos modos, no está de más sanear la respuesta del responseText usando trim() el cual:

Elimina los espacios en blanco en ambos extremos del string. Los espacios en blanco en este contexto, son todos los caracteres sin contenido (espacio, tabulación, etc.) y todos los caracteres de nuevas lineas (LF,CR,etc.).

Todos los detalles los puedes ver en la documentación de MDN.

Entonces, haciendo esto:

var resp=ajax.responseText.trim();

Tu variable resp se guardará libre de estos espacios o caracteres en blanco sobrantes y la comparación no fallará.

De paso, revisa el código PHP, de forma que no haya líneas en blanco antes de la etiqueta de cierre.

A. Cedano
  • 86,578
  • 19
  • 122
  • 221
1

Buenas tardes, yo tenia el mismo problema que tu, realizaba la petición al servidor este regresaba un string, luego lo comparaba en javascript y no funcionaba jaja.

Lo solucioné cambiando en mi archivo PHP,donde realizo la petición al servidor, que me devuelva un array con json_encode en lugar del string solo. En tu código PHP quedaría de la siguiente manera.

$total = mysql_num_rows(mysql_query("SELECT * FROM dispositivos WHERE serie ='$serial'"));
if($total==0)
{
        $error = ['No'];
 $arrayJson = json_encode($error);
 print_r($arrayJson);
}
else
{
 $sql=mysql_query("DELETE FROM dispositivos WHERE serie ='$serial'");
 $error = ['Si'];
 $arrayJson = json_encode($error);
 print_r($arrayJson);
}

Ahora en tu código javascript solo te quedaría "recorrer" el array que te regresa la petición AJAX y entonces si, compararla.

Yo utilicé JQuery un each para recorrerla. Espero te sirva mi respuesta.

antonio291093
  • 395
  • 1
  • 6
  • 17
  • podrias decirme como es el codigo del jquery con each para "recorrer" el json como tu dices – Gabriel Uribe Gomez Sep 21 '17 at 01:32
  • Claro, mira mi pregunta aqui mismo.. dejé la respuesta completa en el comentario. https://es.stackoverflow.com/questions/101036/obtener-valor-que-regresa-una-petici%C3%B3n-ajax – antonio291093 Sep 21 '17 at 03:01