带有 AJAX 响应或 AJAX 响应的 IF 条件.响应.Text 不起作用

IF condition with AJAX response or AJAX response.response.Text is not working

本文关键字:响应 AJAX Text 条件 不起作用 带有 IF      更新时间:2023-09-26

我正在开发一个网页,一旦有人使用我在 AJAX 请求中发送的相同'mesa'列在数据库表中插入新元组,它就会显示警报,因此为此目的,我创建了一个 Javascript 计时器,在其中我不断发送 AJAX 请求以检查我的数据库表中是否有新的元组,到目前为止,定时 AJAX 请求正在工作, 但是当我想用if来调节响应以查看它的值是否等于某个值时,它只是完全跳过它,因此即使 AJAX 响应请求抛出的值是正确的,我也无法显示警报,所以我想知道我可能做错了什么, 我已经分析了 2 个多小时的代码,似乎没有发现错误,我什至显示警报以验证response等于 0 或 1,这表明它们确实显示正确,我也用了response.responseText,任何帮助他将不胜感激,非常感谢。

这是我的Javascript文件

var Solicitud_Comandas = [];

for (var k = 1; k <= 15; k++) {
      Solicitud_Comandas[k] = SolicitudComanda(k);
      if(!sessionStorage.getItem("rm"+k))
      {
            sessionStorage.setItem("rm"+k,false);
      }
}
function SolicitudComanda(k)
{
      return function() {
            $(document).ready(function()
            {
            $.ajax({
            type: "POST",
            url: "Consultar_Comandas_Pendientes.php",
            data: {mesa : k},
            complete: function (response, TextStatus)
            { 
                  MensajeAlerta(response,k);
      },
      fail: function (resultado,TextStatus)
      {
            alert("it didn't work because... " + resultado+ " " +TextStatus);
      }
});
});
}
}
function MensajeAlerta(response,m)
{

            if(response == 0 )
            {
                  sessionStorage.removeItem("rm"+m);
                  sessionStorage.setItem("rm"+m,false);
            }
            else if (response == 1)
            {
                  if(sessionStorage.getItem("rm"+m) == "false")
                  {
                        alert("Hay una comanda pendiente en la mesa "+m);
                        sessionStorage.removeItem("rm"+m);
                        sessionStorage.setItem("rm"+m, true);
                  } 
            }
}
Temporizador= setInterval(SolicitudDeComanda,2500);
function SolicitudDeComanda()
{ 
      $(document).ready(function(){
            for (var l =1; l<= 15; l++) {
                  Solicitud_Comandas[l]();   
            };
      });
}      

这就是Consultar_Comandas_Pendientes.php

    <?php 
    require "Conexion.php";
    $NumeroMesa = $_POST["mesa"];
    $Platillos = 0;
    $filas = false;
    $SelectionRows = "SELECT * FROM comandapendiente WHERE mesa = '$NumeroMesa'";
    $rows = mysqli_query($con,$SelectionRows);
    while($reg = mysqli_fetch_array($rows))
    {   
        if(isset($reg["id"]))
        {
            $filas = true;
            $Platillos++;
        }
    }

    if ($filas == true)
    {
        echo true;
    }
    else
    {
        echo false;
    }
    mysqli_close($con);
    ?>

如您所见,如果有一个新的元组,AJAX 响应将等于 truefalse这就是我对 Javascript 代码中 if 语句的质疑。

您遇到的第一个问题是由使用 $.ajax({ ... complete: 属性并假设回调的第一个参数是您的数据引起的。但它不是,它是请求对象(请参阅文档(。使用 success: 而不是 complete:,然后获取数据作为回调函数的第一个参数。

您遇到的第二个问题是由 PHP 行引起的:

echo false;

这不会回显任何东西,因为在 PHP 中,当false需要转换为字符串时,它变成了空字符串,不像在其他语言中,它变成了"0"或"false"。

所以你应该更好地回显 PHP 中的文字字符串,比如:

echo "1";

echo "0";

另外,请确保 PHP 除了 0 或 1 之外不会输出任何其他内容。具体检查是否有空格,制表符,空行...等,在<?php标签之前或?>标签之后。如果你有几个这样的开始和结束标签,试着把它们连接成一个PHP块。

出于同样的原因,请确保将PHP保存在没有BOM的UTF-8中。字节顺序标记是一个三字符序列,有时保存在文件的开头,以便将字符编码声明为 UTF-8。但这个序列也将成为响应的一部分。大多数编辑者都可以选择使用或不带 BOM 进行保存。

关于代码的一些注释

在其他函数中看到$(document).ready(...)有点奇怪。虽然这工作正常,但通常不会这样做。通常没有理由将其放在另一个函数中。一切正常,如果你使用它一次,只在这个位置:

$(document).ready(function(){
    Temporizador= setInterval(SolicitudDeComanda,2500);
});
写入

本地存储时,我会false写为字符串:

sessionStorage.setItem("rm"+k, "false");

没有引号就可以正常工作,但是您随后依赖于JavaScript将其转换为该字符串的事实。我相信您的代码在显式编写为字符串"false"后看起来更好。

此外,如果您正在立即进行setItem(),似乎没有必要致电removeItem()setItem()使用相同的键覆盖任何现有值。

在对响应数据的测试中,进行字符串比较更有意义,因为 PHP 返回的数据将是字符串。所以喜欢:

if(response == "0")

。并添加一个else来捕获任何意外值("0"或"1"除外(,以便您知道它(通过警报或其他方式(。

如果您在值 0 或 1 之前遇到一些意外字符的问题,并且您无法通过删除 BOM 和 PHP 文件中的任何空格来摆脱这些字符,那么可以通过像这样放松测试来解决此问题:

if (response.indexOf('0') !== -1) 

最好在 ajax 调用中指定 dataType: 'text' 选项,因此不要将其留给 jQuery 来猜测。