PHP:运行if和else,如果在while循环中?

时间:2017-04-08 10:03:49

标签: php mysql

我正在尝试在PHP代码中的while循环中运行ifelse if

代码如下所示:

<?php

$sql = "SELECT * FROM table ORDER BY id";
$query = mysqli_query($db_conx, $sql);
$productCount = mysqli_num_rows($query);
if ($productCount > 0) {
    while($row = mysqli_fetch_array($query, MYSQLI_ASSOC)){ 
        $deviceType = $row["deviceType"];

        if($deviceType == 'iPhone' || $deviceType == 'iPad'){
            echo 'IOS';
        }else if($deviceType == 'Android'){
            echo 'Android'; 
        }
    }
} else {
}

?>

上面的代码工作(有点),但不像我期望的那样。

举个例子,假设我在MYSQL数据库中有2行。

像这样:

id     deviceType

1      Android
2      iPhone

当我运行上面的PHP代码时,我会在我的页面上回显:

IOS
IOS
Android
Android

但我在数据库中只有2行,所以结果应为:

IOS
Android

有人可以就此问题提出建议吗?

3 个答案:

答案 0 :(得分:1)

这个问题显然是在歪曲您的实际代码/数据。

如果您的数据库表有2行,但是您正在接收4行,那么onus不在fetch ing函数上,而是在您的查询或数据库表数据上。

如果您的实际查询是在您的问题中发布的,那么您的表数据包含两行以上。

如果您的实际查询与您发布的内容不同(例如,使用自己的副本加入表格),那么您的数据就可以了,您的查询就会失败。

无论您使用的是mysqli_fetch_array($result)mysqli_fetch_array($result,MYSQLI_ASSOC)还是mysqli_fetch_assoc($result),您的while()循环都只会为每行数据进行一次迭代。

结果集fetch函数的差异:

<强> mysqli_fetch_array($结果)

array(0=>'1', 'id'=>'1', 1=>'Android', 'deviceType'=>'Android')  // 1 row w/ 4 elements
array(0=>'2', 'id'=>'2', 1=>'iPhone', 'deviceType'=>'iPhone')  // 1 row w/ 4 elements

mysqli_fetch_array($ result,MYSQLI_ASSOC) mysqli_fetch_assoc($ result)

array('id'=>'1', 'deviceType'=>'Android')  // 1 row w/ 2 elements
array('id'=>'2', 'deviceType'=>'iPhone')  // 1 row w/ 2 elements

我将重写您的代码并实施一些好的做法:

if($result=mysqli_query($db_conx,"SELECT `deviceType` FROM `table` ORDER BY `id`;")){
    if(mysqli_num_rows($result)){
        while($row=mysqli_fetch_assoc($result)){
            echo ($row["deviceType"]=="Android"?"Android":"IOS");  // inline condition is a personal preference
        }
    }else{
        echo "No rows in `table`.";
    }
}
  • 如果您将多次使用其值,则只需要声明变量(*或者显着会提高可读性以将其与单次使用区分开来。)
  • 为了使您的变量名称直观,请将查询变量命名为$sql$query;并将查询命名为结果变量$result
  • 您打算使用的SELECT列;您的案件不需要*
  • 列名和表名不需要回滚`换行,但这样做可以避免与MySQL关键字的任何潜在冲突。
  • 执行条件检查,并在一步中将$result变量声明为false[resultset]
  • 在调用访问结果集的任何函数之前,请始终检查$result是否为真。 (例如mysqli_num_rows()mysqli_fetch_assoc())。
  • if(mysqli_num_rows($result)){会检查非假名值 - 我的意思是0等同于false,任何大于0的内容都是true。< / LI>

答案 1 :(得分:0)

您的代码似乎完全正常。但是,您获得的项目数量超过预期,而不是预期的输出。如果我没有弄错,这意味着您在数据库表中有重复的deviceType$productCount的值可能为4.如果您使用此查询,则可以获得两个值:

SELECT DISTINCT `deviceType` FROM `table` ORDER BY `id`

但是虽然这应该会修复你得到的输出,但你的数据仍然会有重复数据,所以你可能想要查看表格的数据以及它的创建方式,找出并解决问题。

答案 2 :(得分:-1)

答案非常简单,你使用while循环更改此行

获取结果两次
while($row = mysqli_fetch_array($query, MYSQLI_ASSOC)){ 

while($row = mysqli_fetch_assoc($query)){ 

然后它会正常工作,你可以看到购买iPhone iPhone安卓系统的命令,即两次而不是每次循环一次