基于MySQL单行数据的IF-ELSE逻辑代码错误排查求助
你的PHP代码问题分析及修复
别着急,咱们一步步拆解你代码里的问题,这些都是新手常踩的小坑,改完就能正常运行啦:
核心错误点
die()位置完全错了:你把or die(mysql_error())写在了$sql变量赋值后面,这根本没用——$sql只是个字符串,不会触发错误判断!应该把它放在mysql_query()调用后面,只有执行查询时才会产生数据库错误,这时die()才能捕获并输出错误信息。- 混淆了「行数」和「行数据」:
$row=mysql_num_rows($result)得到的是查询结果的行数(一个数字),不是数据表的行数据!要拿到entryScans字段的值,得用mysql_fetch_assoc($result)取出一行数据,这样$row才是包含字段的关联数组。 - 条件判断用了赋值符号
=:if($row['entryScans'] = 0)这是把0赋值给entryScans,而不是比较是否等于0,永远会返回true,逻辑直接跑偏了,应该用==(松散比较)或者===(严格比较)。 - 语法错误:大括号没闭合:你的
else if块后面少了一个},导致代码结构断裂,PHP解析肯定会报错。 - 废弃函数+SQL注入风险:
mysql_*系列函数早在PHP7就被移除了,强烈建议换成mysqli_*或者PDO;另外直接把$_POST参数拼进SQL语句,很容易被SQL注入攻击,这个必须修正。
修复后的代码(基于原逻辑优化)
我把代码改成了当前PHP支持的mysqli方式,同时修复了所有错误,还加了安全防护:
<?php include ('config.php'); // 先检查POST参数是否存在,避免未定义索引警告 $TicketNo = isset($_POST["TicketNo"]) ? $_POST["TicketNo"] : ''; $hash = isset($_POST["hash"]) ? $_POST["hash"] : ''; // 使用mysqli预处理语句,彻底避免SQL注入 $sql = "SELECT TicketNo, hash, entryScans FROM `Tickets` WHERE `TicketNo` = ? AND `hash` = ?"; $stmt = mysqli_prepare($conn, $sql); // 假设config.php里的数据库连接变量是$conn mysqli_stmt_bind_param($stmt, "ss", $TicketNo, $hash); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $output = "error"; // 默认值设为error,逻辑更清晰 if ($row = mysqli_fetch_assoc($result)) { // 成功获取到数据,再判断entryScans的值 if ($row['entryScans'] === 0) { $output = "ok"; } elseif ($row['entryScans'] > 0) { $output = "maybe"; } } print(json_encode($output)); mysqli_close($conn); ?>
额外提醒
- 如果你之前的
config.php用的是mysql_connect(),记得改成mysqli_connect(),保持函数系列统一; - 预处理语句是现在操作数据库的标准写法,能有效防止SQL注入,一定要养成习惯哦。
内容的提问来源于stack exchange,提问作者Sima
相关产品推荐
相关产品推荐

