You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击.btnStart后Ajax判断异常:checkNULL返回true却进入false分支求助

问题排查:点击按钮始终进入false分支的原因及修复方案

问题描述

我不太懂JavaScript,需求是点击.btnStart按钮时,先调用checkNULL接口,若接口返回true(表示end_time字段无NULL值),则执行startBooking接口。但目前JS代码始终进入false分支,判定存在NULL值,相关代码如下:

原JS代码

$(".btnStart").click( function() {
var tid = $(this).data("tid")
$.get(
"",
{"ajax":"checkNULL", "tid":tid},
function(value){
    if (value === "true"){
        console.log('good'); //output
        $.get(
            "",
            {"ajax":"startBooking", "tid":tid},
            function(resp) {
                $(".sdate[data-tid="+tid+"].val(resp.sdate).show().attr('disabled','disabled')                    
            },
            "JSON"
        )
        $(this).hide()
        $(".btnFinish[data-tid="+tid+"].show()
    }else{
    console.log('bad'); //output
    }
},
"JSON")

原PHP代码

if (isset($_GET['ajax'])) {
if ($_GET['ajax'] == 'checkNULL') {
    $res = $pdo->prepare("SELECT * FROM tt where table_id=? AND end_time is NULL");
    $res->execute( [$_GET['tid']] );
    if ($user = $res->fetch()){
        if(trim($user['table_id']) == '' || trim($row['end_time']) == ''){
            return $value = "true"; // Don't have NULL entry
        }
            return $value = "false"; // have NULL entry
    }
    exit( json_encode($value));
}
elseif ($_GET['ajax'] == 'startBooking') {
    $dt = new DateTime('now');
    $start = $dt->format('Y-m-d H:i:s');
    $st = $dt->format('H:i');
    $sd = $dt->format('Y-m-d');
    $stmt = $pdo->prepare("INSERT INTO table_booking (table_id, start_time) VALUES (?, ?)");
    $stmt->execute( [ $_GET['tid'], $start ] );
    $bid = $pdo->lastInsertId();
    $resp = [ "bid" => $bid,
              "start" => $st,
              "sdate" => $sd
            ];
    exit( json_encode($resp));
}

错误分析

  1. PHP逻辑完全倒置:
    你的SQL语句是查询end_time is NULL的记录,如果$res->fetch()能拿到数据,说明确实存在NULL值,但代码里却返回"true"(注释还写着“没有NULL记录”),逻辑完全反了。

  2. PHP变量未定义:
    判断里用了$row['end_time'],但实际拿到的查询结果是$user,应该改成$user['end_time'],而且这个判断本身多余——SQL已经筛选了end_time is NULL的记录,不需要再判断空字符串。

  3. JS语法错误:

    • 选择器写法错误:$(".sdate[data-tid="+tid+"].val(...)和$(".btnFinish[data-tid="+tid+"].show()都少了闭合的],应该是$(".sdate[data-tid="+tid+"]")和$(".btnFinish[data-tid="+tid+"]")。
    • 嵌套回调中this指向错误:内层$.get的回调里$(this)不再指向原按钮,需要提前保存按钮引用。
  4. JS类型判断错误:
    因为指定了"JSON"类型,jQuery会自动把PHP返回的JSON解析成布尔值,所以应该判断value === true,而不是字符串"true"。

修复后的代码

修复后的PHP代码

if (isset($_GET['ajax'])) {
    if ($_GET['ajax'] == 'checkNULL') {
        $res = $pdo->prepare("SELECT * FROM tt where table_id=? AND end_time is NULL");
        $res->execute( [$_GET['tid']] );
        // 查到数据=存在NULL的end_time,返回false;反之返回true
        $value = $res->fetch() ? false : true;
        exit(json_encode($value));
    }
    elseif ($_GET['ajax'] == 'startBooking') {
        $dt = new DateTime('now');
        $start = $dt->format('Y-m-d H:i:s');
        $st = $dt->format('H:i');
        $sd = $dt->format('Y-m-d');
        $stmt = $pdo->prepare("INSERT INTO table_booking (table_id, start_time) VALUES (?, ?)");
        $stmt->execute( [ $_GET['tid'], $start ] );
        $bid = $pdo->lastInsertId();
        $resp = [ 
            "bid" => $bid,
            "start" => $st,
            "sdate" => $sd
        ];
        exit(json_encode($resp));
    }
}

修复后的JS代码

$(".btnStart").click(function() {
    var tid = $(this).data("tid");
    var $currentBtn = $(this); // 保存当前按钮引用,避免嵌套回调中this指向错误

    $.get(
        "",
        {"ajax":"checkNULL", "tid":tid},
        function(value){
            // JSON解析后value是布尔值,直接判断true/false
            if (value === true){
                console.log('good');
                $.get(
                    "",
                    {"ajax":"startBooking", "tid":tid},
                    function(resp) {
                        // 修正选择器语法错误
                        $(".sdate[data-tid="+tid+"]").val(resp.sdate).show().attr('disabled','disabled');                    
                    },
                    "JSON"
                );
                $currentBtn.hide();
                // 修正选择器语法错误
                $(".btnFinish[data-tid="+tid+"]").show();
            } else {
                console.log('bad');
            }
        },
        "JSON"
    );
});

内容的提问来源于stack exchange,提问作者kit38912739

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 06:27:55