在mysql_fetch_array()上运行循环时使用PHP的奇怪结果

时间:2011-11-16 18:04:22

标签: php mysql sql

我有一组数据库结果,其中一些列有空字段。我正在运行此查询:

SELECT * FROM `data` WHERE category = '$category' ORDER BY name

输出结果的PHP就是这个(简化版本):

while ($qValues = mysql_fetch_array($result)) {
    if ($qValues["licence"] != "") {
        $lice = 'Licence: ' . $qValues["licence"];
    }
    if ($qValues["publisher"] != "") {
       $pub = 'Publisher: ' . $qValues["publisher"];
    }
}

发生的事情是,如果前一行有发布者,但当前行没有发布者(非空,空字符串),则输出前一行的数据。

我不知道这是怎么回事,因为在我看来,mysql_fetch_array将数据放在网格中,而while循环将其内部计数器逐行推进。如果该行包含空字符串,我不明白一行的数据如何渗入下一行。

这里发生了什么?

4 个答案:

答案 0 :(得分:2)

每次循环时将$pub重置为$pub = "" ...

while ($qValues = mysql_fetch_array($result)) {
    $lice = "";
    $pub = "";

    if ($qValues["licence"] != "") {
        $lice = 'Licence: ' . $qValues["licence"];
    }
    if ($qValues["publisher"] != "") {
        $pub = 'Publisher: ' . $qValues["publisher"];
    }
}

答案 1 :(得分:2)

由于您只在列具有值时设置变量,因此当列为空时,变量不会重置。这会导致您看到上一条记录中的值的问题。

每次都应设置变量,即使列为空白也是如此。您可以使用else语句:

while ($qValues = mysql_fetch_array($result)) {
if ($qValues["licence"] != "") {
    $lice = 'Licence: ' . $qValues["licence"];
} else {
    // Set to blank so as not to keep value from last iteration
    $lice = "";
}
if ($qValues["publisher"] != "") {
    $pub = 'Publisher: ' . $qValues["publisher"];
} else {
    // Set to blank so as not to keep value from last iteration
    $pub = "";
}

答案 2 :(得分:1)

您没有在每次迭代中重置变量,因此您会看到旧值。要修复它,你可以这样做:

if ($qValues["licence"] != "") {
    $lice = 'Licence: ' . $qValues["licence"];
} else {
    $lice = '';
}

答案 3 :(得分:1)

您要将发布者和许可证的值分配给php变量。如果mysql结果包含空字符串,它仍将保留前一行的内容 每次循环结果时取消设置2个变量:

while ($qValues = mysql_fetch_array($result)) {
$lice = $pub = "";
if ($qValues["licence"] != "") {
    $lice = 'Licence: ' . $qValues["licence"];
}
if ($qValues["publisher"] != "") {
   $pub = 'Publisher: ' . $qValues["publisher"];
}
}