当字段为空时,PHP返回无行

时间:2015-04-30 14:35:06

标签: php mysql

我有一个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所以我认为它失败了,因为检查“空”是否是错误的方法? 任何帮助表示赞赏。

2 个答案:

答案 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代表什么,也许你应该删除它。