PHP中if语句导致值为0的数据无法显示的问题咨询
问题分析与解决方案
嘿,我一眼就看出问题所在了!这是PHP松散类型系统带来的典型“坑”——你写的内层if判断条件,用了$row['datum'] AND $row['v'] AND ...这种方式,而PHP会把数值0、空字符串""、null这些值自动转换为布尔值false。所以哪怕数据库里确实存着0这个有效值,也会被这个条件直接过滤掉,导致对应的表格行根本不会输出到页面上;而var_dump()能看到是因为它会如实输出变量的原始值,不会做布尔转换。
具体修正方案
根据你的需求,有两种常见的修正方式:
1. 直接移除多余的内层判断(推荐,如果你不需要过滤任何行)
外层已经通过$resultCheck > 0确认了有数据,while循环也会遍历每一条查询结果。如果你的需求是显示所有查询到的行,不管字段值是0还是其他,那内层的if判断完全是多余的,直接去掉就行:
<?php include_once 'dbh.inc.php'; $sqli = "SELECT datum, v, vo, nav FROM months;"; $result = mysqli_query($conn, $sqli); $resultCheck = mysqli_num_rows($result); echo "<table>"; echo "<tr>"; echo "<th>Datum</th>"; echo "<th> Vakantie uren</th>"; echo "<th> Vakantie uren opgennomen </th>"; echo "<th> Nieuw aantal vakantie uren</th>"; echo "</tr>"; if ($resultCheck > 0) { while ($row = mysqli_fetch_assoc($result)) { // 去掉原来的if条件,直接输出每一行 echo "<tr>"; echo "<td>" . $row['datum'] . "</td>"; echo "<td>" . $row['v'] . "</td>"; echo "<td>" . $row['vo'] . "</td>"; echo "<td>" . $row['nav'] . "</td>"; echo "</tr>"; } } echo "</table>"; ?>
2. 精确判断字段有效性(如果需要过滤null/空字符串但保留0)
如果你的需求是过滤掉字段为null或空字符串的行,但保留0这种有效值,就需要用严格的比较来区分:
<?php include_once 'dbh.inc.php'; $sqli = "SELECT datum, v, vo, nav FROM months;"; $result = mysqli_query($conn, $sqli); $resultCheck = mysqli_num_rows($result); echo "<table>"; echo "<tr>"; echo "<th>Datum</th>"; echo "<th> Vakantie uren</th>"; echo "<th> Vakantie uren opgennomen </th>"; echo "<th> Nieuw aantal vakantie uren</th>"; echo "</tr>"; if ($resultCheck > 0) { while ($row = mysqli_fetch_assoc($result)) { // 用严格比较确保字段不是null也不是空字符串,但允许0 if( ($row['datum'] !== null && $row['datum'] !== '') && ($row['v'] !== null && $row['v'] !== '') && ($row['vo'] !== null && $row['vo'] !== '') && ($row['nav'] !== null && $row['nav'] !== '') ) { echo "<tr>"; echo "<td>" . $row['datum'] . "</td>"; echo "<td>" . $row['v'] . "</td>"; echo "<td>" . $row['vo'] . "</td>"; echo "<td>" . $row['nav'] . "</td>"; echo "</tr>"; } } } echo "</table>"; ?>
补充说明
PHP的松散类型转换虽然灵活,但很容易在判断数值时踩坑。记住这几个关键点:
0、""、null、false、array()在布尔判断中都会被视为false- 用
===/!==进行严格比较可以避免类型转换带来的意外 empty(0)会返回true,所以如果要保留0,不要用empty()来判断
内容的提问来源于stack exchange,提问作者user8938318
相关产品推荐
相关产品推荐

