SELECT执行报错仅显示SQL无详情,INSERT同逻辑代码却正常运行
问题分析与解决方案
嘿,我一眼就瞅出你代码里的问题啦——SELECT语句的成功判断逻辑写错了!
核心原因
mysqli的query()方法执行不同SQL语句时返回值不一样:
- 对于
INSERT/UPDATE/DELETE这类不返回结果集的语句,执行成功会返回布尔值TRUE,失败返回FALSE,所以你原来的判断逻辑对这些语句是有效的。 - 但对于
SELECT这类需要返回结果的语句,执行成功时会返回一个**mysqli_result对象**,而不是TRUE!所以你写的if ($conn->query($sql) === TRUE)永远不会成立,直接跳进了else分支,让你误以为查询报错了,但其实查询很可能是成功的。
修正后的代码
把判断逻辑改成检查返回值是否为FALSE(只有报错时才会返回FALSE),成功的话就处理结果集:
<?php $servername = "localhost"; $username = "root"; $password = ""; $dbname = "nny_gamerrum"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "SELECT email FROM booking;"; $result = $conn->query($sql); // 检查是否查询失败 if ($result === FALSE) { echo "Error: " . $sql . "<br>" . $conn->error; } else { // 查询成功,处理结果集 echo 'Successfull<br>'; // 比如遍历输出所有email while($row = $result->fetch_assoc()) { echo "Email: " . $row["email"] . "<br>"; } // 释放结果集 $result->free(); } $conn->close(); ?>
额外调试小技巧
如果不确定返回值是什么,可以在query()之后加一行var_dump($result);,看看实际返回的是结果集对象还是FALSE,这样能快速定位问题。
内容的提问来源于stack exchange,提问作者Chutney
相关产品推荐
相关产品推荐

