[英]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.