簡體   English   中英

簡單的查詢和循環,意外結果

[英]Simple query and loop, unexpected result

這是我的一個文件中的一個小子功能。

假設我們有兩個帶有以下字段的表

表1)產品,其字段為sku和rangeid

表2)價格表,其中包含sku和onpricelist字段

我的代碼基本上會獲取一個rangeid,加載該范圍內的所有產品,然后調用onList來檢查onpricelist中這些產品中是否有1,如果指定的rangeid中的任何產品的標記為1,checkHasProducts應該返回1。 onList函數按預期工作,但是由於某種原因,無論從onList返回什么,checkHasProducts函數都將返回1。 onList可以從字面上返回一個隨機字符串,而checkHasProducts仍將返回1。

這是代碼

function checkHasProducts($rid) {


    $db = new mysqli(DB_HOST,DB_USERNAME, DB_PASSWORD, DB_NAME);

        $sql = "SELECT * from products WHERE rangeid = '$rid'";
        $result = $db->query($sql);
        $exists = 0;
        if($result === false) { return 0; } else { 
            while($row = $result->fetch_assoc()){
                if(onList($row['sku']) == "on") {
                    $exists = 1;
                }
            }
                return $exists;
        }
}

function onList($sku) {

    $db = new mysqli(DB_HOST,DB_USERNAME, DB_PASSWORD, DB_NAME);

        $sql = "SELECT * from pricelist WHERE sku = '$sku'";
        $result = $db->query($sql);

        if($result === false) { return 0; } else { 
            while($row = $result->fetch_assoc()){
                    if($row['onpricelist'] == "1") {
                        return "on";
                    } else { return 0; }
                }
        }
}

我敢肯定這很簡單,但是我已經開始這樣做了幾個小時,我們將不勝感激。

這兩個函數的示例行轉儲

array (size=xx)
  'prodid' => string '139' (length=3)
  'rangeid' => string '14' (length=2)
  'sku' => string 'ABC123456' (length=10)

array (size=x)
  'priceid' => string '129' (length=3)
  'sku' => string 'ABC123456' (length=10)
  'onpricelist' => string '0' (length=1)

這是您的問題:

if($row['onpricelist'] == "1") {
   return "on";
} else { return 0; }

該代碼即使返回結果中的所有記錄也不會返回0。 然后

onList($row['sku']) == "on"

0 == "on" ,php將“ on”強制轉換為0,因此結果始終為true。

您需要刪除else { return 0; } else { return 0; }從while循環中刪除,並在函數末尾(即循環之后)添加return 0

您沒有直接詢問,但是您可以通過更高的性能獲得相同的結果,它也可以解決您的問題,就像@Okneloper所說的那樣。 編輯答案:

    <?php
function checkHasProductsOnLisByRid($rid) {  
    $db = new mysqli(DB_HOST,DB_USERNAME, DB_PASSWORD, DB_NAME);
    $result = $db->query(sprintf("SELECT COUNT(pr.*) from products pr INNER JOIN pricelist pl ON pl.sku = pr.sku WHERE pr.rangeid = '%d' and pl.onpricelist = 1", $rid));
     if (!empty($result)) {
        $result = (bool) $result->fetch_row();
    }

    return $result;
}

正確答案來自Hanky웃Panky的評論,以進行更改

if(onList($row['sku']) == "on") {

if(onList($row['sku']) === "on") {

作為更好的方法,FeyyazEsatoğlu幫助我得出以下結論

 $sql = "SELECT * from products pr INNER JOIN pricelist pl ON pl.sku = pr.sku WHERE pr.rangeid = '$rid' and pl.onpricelist = '1'";

    $db = new mysqli(DB_HOST,DB_USERNAME, DB_PASSWORD, DB_NAME);
    $result = $db->query($sql);
    $row_cnt = mysqli_num_rows($result);
    if($row_cnt != "0") { $row_cnt = "1"; }
    return $row_cnt;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM