2016-01-19 42 views
0

这是我的一个文件中的一个小子函数。简单的查询和循环,意外的结果

假设我们有两个表具有以下字段

表1)产品,领域SKU & rangeid

表2)价格表,与场SKU & onpricelist

我的代码基本上需要一个rangeid,加载该范围内的所有产品,然后调用onList来检查这些产品中是否有任何产品在onpricelist中有1,如果指定的rangeid中的任何产品的标志为1,checkHasProducts应返回1. onList函数按预期工作,但由于某种原因,checkHasProducts函数返回1,而不管从onList返回的是什么。 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) 
+0

数据库中的onpricelist字段的类型是什么? – Okneloper

+2

转储$ row($ row ['onpricelist']),所以至少我们可以看到一些数据。此外,必须有一个JOIN可以为您节省这个麻烦。 – Eric

+0

@Okneloper它被设置为int – user1372212

回答

0

例排转储这是你的问题:

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

此代码返回0,即使不会,虽然所有记录中的结果。然后

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

0 == "on",PHP蒙上 “上” 为0,这样的结果总是正确的。

您需要从while循环中删除else { return 0; }部分并添加 return 0在函数结束时,在循环之后即。

+0

我已经提出了建议的变化,不是它没有改变输出,也不明白它是如何可能的。在第二个函数中,查询将永远不会返回多个结果 – user1372212

+0

我会要求输入新的代码,但是没有地方可以粘贴它。代码中可能仍然存在错误。 – Okneloper

+0

此外,请参阅此返回运算符的工作方式: http://php.net/manual/en/function.return.php 您不能返回多个结果,true,但返回停止执行函数(和你的循环)。 – Okneloper

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; 
} 
+1

2个连接=打字错误? –

+0

谢谢,我更新了。 – FZE

+0

@FeyyazEsatoğlu这两个函数似乎没有从上面链接? – user1372212

0

正确答案就在从手帕웃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;