简单的查询和循环,意外的结果

时间:2016-01-19 15:11:21

标签: php

这是我的一个文件中的一个小子功能。

假设我们有两个包含以下字段的表

表1)产品,包括sku& amp; rangeid

表2)价格表,其中包括sku& amp; onpricelist

我的代码基本上是一个rangeid,加载该范围内的所有产品,然后调用onList检查这些产品中是否有任何一个onpricelist,如果指定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)

3 个答案:

答案 0 :(得分:0)

这是你的问题:

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

此代码返回0甚至不通过结果中的所有记录。然后

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

0 == "on",php将“on”转换为0,因此结果始终为true。

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

答案 1 :(得分: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;
}

答案 2 :(得分:0)

正确答案来自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;