我有一个while循环遍历从DB查询返回的行。
查询
$sql = "SELECT t.barcode AS barcode, t.code, t.brand, t.name, t.cost, t.price, t.vat, SUM(n.stock) AS stock
FROM t
INNER JOIN c.am ON t.code=am.code
INNER JOIN n ON t.code=n.code WHERE (n.name='X' OR n.name='Y')
AND t.code IN ($in)
GROUP BY t.code, t.name, t.cost, t.salesprice, t.vat";
$result = $mysqli->query($sql);
echo "<table id='maintable'><tr><th>Barcode</th><th>Name</th><th>Brand</th></tr>";
while($row = $result->fetch_array()) {
if(empty($row['barcode'])){
$barcode = "none";
}
$barcode = $row['barcode'];
$name = $row['name'];
$brand = $row['brand'];
echo "<td>" . $barcode . "</td>";
echo "<td>" . $name . "</td>";
echo "<td>" . $brand . "</td>";
}
echo "</table>";
问题是如果条形码为空(不在数据库表中),则不会显示任何行。但是,如果有条形码,则显示行。在我的例子中,我试图检查$ row ['barcode']是否为空以分配字符串,以便该行仍然显示但不成功。
在数据库中的表本身中,条形码的Null字段设置为YES,Default Field设置为NULL,所以我也尝试过:
if(is_null($row['barcode'])) { ..... };
但不成功。
在某处我读到空可以等于:'',0和NULL所以我认为它失败了,因为检查“空”是否是错误的方法? 任何帮助表示赞赏。
答案 0 :(得分:3)
您的条件逻辑遵循此行:
$barcode = $row['barcode'];
以前分配给$barcode
的任何内容都被覆盖。
看起来您希望它是else
,或者您希望在条件测试之前行。
作为替代方案,您可以修改查询以返回字符串&#34; none&#34;假设条形码是字符类型,用IFNNAL函数代替NULL。
SELECT IFNULL(t.barcode,'none') AS barcode
, ...
FROM t
修改强>
问题已被编辑(在我发布我的答案之后),为问题添加SQL查询。
我认为问题在于将一个空(零长度)字符串分配给变量,目的是用文字替换空字符串。
答案 1 :(得分:3)
if(empty($row['barcode'])){
$barcode = "none";
} else {
$barcode = $row['barcode'];
}
甚至更好:
$barcode = empty($row['barcode'])?"none":$row['barcode'];
所以你的代码是:
while($row = $result->fetch_array()) {
$barcode = empty($row['barcode'])?"none":$row['barcode'];
$name = $row['name'];
$brand = $row['brand'];
echo "<td>" . $barcode . "</td>";
echo "<td>" . $name . "</td>";
echo "<td>" . $brand . "</td>";
}
更新不确定您的数据库结构,但如果您需要一些空的t.barcode
值,则查询可能如下:
$sql = "SELECT
t.barcode AS barcode,
n.code,
t.brand, t.name, t.cost, t.price, t.vat,
SUM(n.stock) AS stock
FROM n
LEFT JOIN t
ON t.code=n.code
AND t.code IN ($in)
WHERE (n.name='X' OR n.name='Y')
GROUP BY n.code, t.name, t.cost, t.salesprice, t.vat";
我不明白INNER JOIN c.am ON t.code=am.code
代表什么,也许你应该删除它。