PHP MySQL数组==

PHP MySQL数组==,php,mysql,arrays,Php,Mysql,Arrays,我试图只回显PHP MySQL数组的某些行 我经历了多次迭代,但似乎无法理解 <?php $conn = new mysqli("SERVER", "user", "password", "dbname"); $sql = " SELECT POSTDATE, MEMBERS_ALL, MEMBERS_ACTIVE, FROM daily_numbers "; $result = $conn->query($sql); $conn-&g

我试图只回显PHP MySQL数组的某些行

我经历了多次迭代,但似乎无法理解

<?php
$conn = new mysqli("SERVER", "user", "password", "dbname");
$sql = "
    SELECT
    POSTDATE,
    MEMBERS_ALL,
    MEMBERS_ACTIVE,
    FROM
    daily_numbers
";
$result = $conn->query($sql);
$conn->close();

while($row = $result->fetch_assoc()) {
    if ($row["MEMBERS_ALL"] == 600) {
        echo "Date: " . $row["POSTDATE"] . ", Members All: " . $row["MEMBERS_ALL"] . ", Members Active: " .$row["MEMBERS_ACTIVE"];
    }
};

while($row = $result->fetch_assoc()) {
    if ($row["MEMBERS_ALL"] == 705) {
        echo "Date: " . $row["POSTDATE"] . ", Members All: " . $row["MEMBERS_ALL"] . ", Members Active: " .$row["MEMBERS_ACTIVE"];
    }
};
?>

上面的示例将只显示第一个while/if语句(=600),但是我无法让它回显第二个while/if语句(=705)


我希望能够使用不同的约束多次回显数组(我不想多次运行SQL语句)。

您不需要第二个循环。就这样做吧

    <?php
    $conn = new mysqli("SERVER", "user", "password", "dbname");
    $sql = "
        SELECT
        POSTDATE,
        MEMBERS_ALL,
        MEMBERS_ACTIVE,
        FROM
        daily_numbers
    ";
    $result = $conn->query($sql);
    $conn->close();

    while($row = $result->fetch_assoc()) {
        if ($row["MEMBERS_ALL"] == 600) {
            //do something
            echo "Date: " . $row["POSTDATE"] . ", Members All: " . $row["MEMBERS_ALL"] . ", Members Active: " .$row["MEMBERS_ACTIVE"];
        }
        if ($row["MEMBERS_ALL"] == 705) {
            //do something
            echo "Date: " . $row["POSTDATE"] . ", Members All: " . $row["MEMBERS_ALL"] . ", Members Active: " .$row["MEMBERS_ACTIVE"];
        }
    };

    ?>

PHP跟踪它在结果数组中的位置——每次调用fetch_assoc()都会将指针递增1,直到指针到达末尾,但不会为您重置指针。为了检查这一点,在第二个循环中回显一个测试值——您将看不到任何输出

正如Amit所说,您可以将两个调用都放在第一个while循环中,也可以调用:

$result->data_seek(0);
将指针重置回$result循环的开头。将它放在两个while循环之间,它应该可以工作

迭代整个数组不是特别有效,因此最好避免这种情况。如果希望保持现在的顺序,但避免在数组上多次迭代,可以将值存储为字符串,如下所示:

<?php
$conn = new mysqli("SERVER", "user", "password", "dbname");
$sql = "
    SELECT
    POSTDATE,
    MEMBERS_ALL,
    MEMBERS_ACTIVE,
    FROM
    daily_numbers
";
$result = $conn->query($sql);
$conn->close();
$first = '';
$second = '';

while($row = $result->fetch_assoc()) {
    if ($row["MEMBERS_ALL"] == 600) {
        $first .= "Date: " . $row["POSTDATE"] . ", Members All: " . $row["MEMBERS_ALL"] . ", Members Active: " .$row["MEMBERS_ACTIVE"];
    } else if ($row["MEMBERS_ALL"] == 705) {
        $second .= "Date: " . $row["POSTDATE"] . ", Members All: " . $row["MEMBERS_ALL"] . ", Members Active: " .$row["MEMBERS_ACTIVE"];
    }
};   
echo $first;
echo $second;     
?>

试试这个:

使用seek to row的面向对象样式示例

<?php
$conn = new mysqli("SERVER", "user", "password", "dbname");
$sql = "
    SELECT
    POSTDATE,
    MEMBERS_ALL,
    MEMBERS_ACTIVE,
    FROM
    daily_numbers
";

$result = $conn->query($sql);
$conn->close();

//Combine while loop as single...
while($row = $result->fetch_assoc()) {
    //if MEMBERS_ALL == 600... 
    if ($row["MEMBERS_ALL"] == 600) {
        //do something
        echo "Date: " . $row["POSTDATE"] . ", Members All: " . $row["MEMBERS_ALL"] . ", Members Active: " .$row["MEMBERS_ACTIVE"];
    }

    //if MEMBERS_ALL == 705...
    if ($row["MEMBERS_ALL"] == 705) {
        //do something
        echo "Date: " . $row["POSTDATE"] . ", Members All: " . $row["MEMBERS_ALL"] . ", Members Active: " .$row["MEMBERS_ACTIVE"];
    }
};

?>
您需要使用默认方法将mysqli resultset指针重置为0。函数将结果指针调整到结果集中的任意行

<?php
$conn = new mysqli("SERVER", "user", "password", "dbname");
$sql = "
    SELECT
    POSTDATE,
    MEMBERS_ALL,
    MEMBERS_ACTIVE,
    FROM
    daily_numbers
";
$result = $conn->query($sql);
$conn->close();

while($row = $result->fetch_assoc()) {
    if ($row["MEMBERS_ALL"] == 600) {
        echo "Date: " . $row["POSTDATE"] . ", Members All: " . $row["MEMBERS_ALL"] . ", Members Active: " .$row["MEMBERS_ACTIVE"];
    }
};

 /* seek to row no. 0 */
$result->data_seek(0);

while($row = $result->fetch_assoc()) {
    if ($row["MEMBERS_ALL"] == 705) {
        echo "Date: " . $row["POSTDATE"] . ", Members All: " . $row["MEMBERS_ALL"] . ", Members Active: " .$row["MEMBERS_ACTIVE"];
    }
};
?>

或将两个while循环与单个while循环相结合

<?php
$conn = new mysqli("SERVER", "user", "password", "dbname");
$sql = "
    SELECT
    POSTDATE,
    MEMBERS_ALL,
    MEMBERS_ACTIVE,
    FROM
    daily_numbers
";

$result = $conn->query($sql);
$conn->close();

//Combine while loop as single...
while($row = $result->fetch_assoc()) {
    //if MEMBERS_ALL == 600... 
    if ($row["MEMBERS_ALL"] == 600) {
        //do something
        echo "Date: " . $row["POSTDATE"] . ", Members All: " . $row["MEMBERS_ALL"] . ", Members Active: " .$row["MEMBERS_ACTIVE"];
    }

    //if MEMBERS_ALL == 705...
    if ($row["MEMBERS_ALL"] == 705) {
        //do something
        echo "Date: " . $row["POSTDATE"] . ", Members All: " . $row["MEMBERS_ALL"] . ", Members Active: " .$row["MEMBERS_ACTIVE"];
    }
};

?>


希望这对你有帮助

您可以在SQL查询中使用ORDERBY子句来管理它,如果需要条件,则不使用php

<?php
$conn = new mysqli("SERVER", "user", "password", "dbname");
$sql = "
    SELECT
    POSTDATE,
    MEMBERS_ALL,
    MEMBERS_ACTIVE,
    FROM
    daily_numbers
        ORDER BY MEMBERS_ALL ASC
";
$result = $conn->query($sql);
$conn->close();

while($row = $result->fetch_assoc()) {
  echo "Date: " . $row["POSTDATE"] . ", Members All: " . $row["MEMBERS_ALL"] . ", Members Active: " .$row["MEMBERS_ACTIVE"];

};
?>


注意:此解决方案仅适用于需要按升序或降序排列的结果的情况。

Schiem解释了出现“错误”的原因,解决方案和Amit为您提供了更好的解决问题的方法,但两者都很有效!非常感谢。我特别喜欢将结果添加到一个变量中,稍后我可以在脚本中调用该变量。