点击.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)); }
错误分析
PHP逻辑完全倒置:
你的SQL语句是查询end_time is NULL的记录,如果$res->fetch()能拿到数据,说明确实存在NULL值,但代码里却返回"true"(注释还写着“没有NULL记录”),逻辑完全反了。PHP变量未定义:
判断里用了$row['end_time'],但实际拿到的查询结果是$user,应该改成$user['end_time'],而且这个判断本身多余——SQL已经筛选了end_time is NULL的记录,不需要再判断空字符串。JS语法错误:
- 选择器写法错误:
$(".sdate[data-tid="+tid+"].val(...)和$(".btnFinish[data-tid="+tid+"].show()都少了闭合的],应该是$(".sdate[data-tid="+tid+"]")和$(".btnFinish[data-tid="+tid+"]")。 - 嵌套回调中
this指向错误:内层$.get的回调里$(this)不再指向原按钮,需要提前保存按钮引用。
- 选择器写法错误:
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
相关产品推荐
相关产品推荐

