PHP中MySQL查询确认有值但返回空集问题求助
问题分析与修复方案
代码里的关键问题
- 硬编码查询未替换:你写死了查询
name="Test-01",导致所有行都用这个固定名称的max net,而不是当前循环的$row["name"],这是核心问题之一。 - 聚合函数列名未处理:
SELECT MAX(net)返回的列名是MAX(net),不是net,用fetch_object()->net根本取不到值,必须给列起别名。 - SQL注入风险:直接把
$row["name"]拼进SQL,一旦name包含特殊字符会报错甚至被注入,必须用预处理语句。 - HTML语法错误:生成单选按钮的echo语句没闭合字符串,最后少了双引号,导致输出失效。
修正后的代码
$sqltankonly = "SELECT * FROM HoldingUnit WHERE tankfacility = 'test' AND net = '0' ORDER BY name"; $resulttankonly = $conn->query($sqltankonly); if ($resulttankonly->num_rows > 0) { echo '<table><tr><th>Destination Tank</th><th>Net</th></tr>'; while($row = $resulttankonly->fetch_assoc()) { echo '<tr><td><input type="radio" name="dtank" value="' . htmlspecialchars($row["name"]) . '" required>' . htmlspecialchars($row["name"]) . '</td>'; echo '<td>'; // 修正后的max net查询:用预处理语句+列别名 $sqlnetcapacity = 'SELECT MAX(net) AS max_net FROM HoldingUnit WHERE name = ?'; $stmt = $conn->prepare($sqlnetcapacity); $stmt->bind_param("s", $row["name"]); $stmt->execute(); $resultnetcapacity = $stmt->get_result(); $row_net = $resultnetcapacity->fetch_object(); $netcapacity = $row_net->max_net; // 用别名取值 // 循环生成单选按钮,修复语法错误 while($netcapacity > 0) { $net_val = htmlspecialchars($netcapacity); echo '<input type="radio" name="net" value="' . $net_val . '" />' . $net_val . '<br>'; $netcapacity--; } echo '</td></tr>'; } echo '</table>'; }
额外说明
- 加入
htmlspecialchars()是为了防止XSS攻击,避免name或net值里的特殊字符破坏HTML结构。 - 预处理语句既解决了SQL注入问题,也能避免因name包含引号导致的SQL语法错误。
- 如果
MAX(net)可能为0,你需要根据业务需求调整循环条件(比如改成$netcapacity >= 0)。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

