MySQL AND OR语句语法错误求助:排查SQL查询问题
问题分析与修正
咱们一步步来排查你代码里的问题,你遇到的语法错误和逻辑偏差主要有这几个关键点:
1. COUNT (*) 的语法错误
MySQL 里COUNT函数和括号之间不能有空格,正确写法是COUNT(*)。你写的COUNT (*)会被 MySQL 判定为非法语法,这也是错误提示里最先指出的问题。
2. 字符串类型字段值未加引号
你的Time字段值(比如11PM、11:30PM)属于字符串,直接拼进 SQL 语句会被 MySQL 当成无效标识符;另外如果Date字段是字符串类型,哪怕是2018-03-15这种日期格式,也必须用单引号包裹——否则 MySQL 会把2018-03-15解析成2018减3减15的算术表达式,完全偏离你的预期。
3. AND/OR 的优先级逻辑错误
SQL 里AND的优先级高于OR,你原语句的 WHERE 子句会被 MySQL 自动重新分组,变成:
Date= $SearchDate AND Time= $PlusHourORTime= $Plus30 AND JobStatus= '1'ORJobStatus= '3'
这和你想实现的「日期匹配,且时间是指定的两个值之一,且状态为1或3」的逻辑完全不符,必须用括号把OR的条件分组,明确逻辑关系。
修正后的代码
先给你修正了语法和逻辑的基础版本:
$PlusHour = date('gA', strtotime("+1 hours")); $Plus30 = date('g:30A', strtotime("+1 hours")); // 如果Date字段是DATE类型,直接用CURDATE()函数无需引号;如果是字符串类型,改用带引号的日期字符串 $SearchDate = "CURDATE()"; // 修正COUNT语法、给字符串字段值加引号、用括号分组OR条件 $sqlCount = "SELECT COUNT(*) FROM ServiceTickets WHERE Date = $SearchDate AND (Time = '$PlusHour' OR Time = '$Plus30') AND (JobStatus = '1' OR JobStatus = '3')"; $CountQuery = mysqli_query($db_conx, $sqlCount) or die("Error: ".mysqli_error($db_conx)); $rowCount = mysqli_fetch_row($CountQuery);
如果你的Date字段是 VARCHAR 等字符串类型,$SearchDate要改成带引号的格式:
$SearchDate = "'" . date('Y-m-d') . "'";
另外更安全的做法是使用参数化查询(避免 SQL 注入风险),示例如下:
$PlusHour = date('gA', strtotime("+1 hours")); $Plus30 = date('g:30A', strtotime("+1 hours")); $today = date('Y-m-d'); $sqlCount = "SELECT COUNT(*) FROM ServiceTickets WHERE Date = ? AND (Time = ? OR Time = ?) AND (JobStatus IN ('1', '3'))"; $stmt = mysqli_prepare($db_conx, $sqlCount); mysqli_stmt_bind_param($stmt, "sss", $today, $PlusHour, $Plus30); mysqli_stmt_execute($stmt); mysqli_stmt_bind_result($stmt, $count); mysqli_stmt_fetch($stmt); $rowCount = [$count];
内容的提问来源于stack exchange,提问作者Micha
相关产品推荐
相关产品推荐

