2015-04-30 38 views
1

我有一個while循環遍歷從數據庫查詢返回的行。當字段爲空時PHP返回無行

查詢

$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']是否爲空來分配一個字符串,以便該行仍然顯示,但不成功。

在表本身在數據庫中,條形碼具有空字段設置爲YES和默認字段設置爲NULL,所以我也嘗試:

if(is_null($row['barcode'])) { ..... }; 

但不成功。

某處,我讀了空可以等同於:「」,0和NULL,所以我想這是失敗,因爲檢查是否「空」是錯誤的做法? 任何幫助表示讚賞。

+1

你正在執行的實際查詢是什麼? –

+0

向我們展示完整的代碼片段與mysql查詢字符串請 – Alex

回答

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>"; 
} 

UPDATE不知道你的數據庫結構,但如果你需要一些空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代表什麼,也許你應該刪除它。

+0

亞歷克斯這對我有意義,我試過你的例子,但「沒有」沒有被分配到條碼字段和當dB中沒有存儲條形碼時仍然不顯示任何行。 – Hexana

+0

向我們顯示您的查詢! – Alex

+0

完整查詢已添加。所以我的while循環等只是一個例子 – Hexana

3

你的條件邏輯被隨後這一行:

$barcode = $row['barcode']; 

無論被分配到先前$barcode正被重寫

看起來像是你想成爲else,或者你想要之前的那條線的條件測試。


作爲替代方案,你可以只修改您的查詢到位NULL的與IFNULL函數返回字符串「無」,假設條碼字符類型。

SELECT IFNULL(t.barcode,'none') AS barcode 
    , ... 
    FROM t 

編輯

的問題已被編輯(之後我張貼我的答案),在SQL查詢添加到的問題。

我認爲問題是,一個空(零長度)串被分配給一個變量,並且意圖是,以取代空字符串文字。

+0

我認爲他/她應該管理PHP端的邏輯。你不同意嗎? –

+0

@EmilioGort在哪裏可以處理 – Alex

+0

@Alex與其他系統的兼容性,或者如果您在其他地方使用該查詢/ SP,並且您不想看到「無」,那麼在那裏幾乎沒有區別......更多的是邏輯或演示文稿不應該在數據庫...一個想法,但你總是可以做你想做的...這是一個想法 –