2016-01-04 2 views
0

Я пытаюсь отобразить только определенные строки массива PHP MySQL.PHP MySQL Array 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(); 

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"]; 
    } 
}; 
?> 

В приведенном выше примере будет показывать только первый, а /, если оператор (== 600), однако я не могу заставить его повторить второе время /, если оператор (== 705).

Я хотел бы иметь возможность эхо-массива несколько раз с использованием разных ограничений (я не хочу запускать SQL-запрос более одного раза).

+0

Schiem объясняет, почему происходит ваша «ошибка», а решение и Amit дает вам лучший способ решить проблему в целом. – Terminus

ответ

1

PHP отслеживает, где это находится в массиве результатов - каждый вызов FETCH_ASSOC() увеличивает значение указателя на 1, пока не дойдет до конца, но это не делает перезагрузите его для вас. Чтобы проверить это, повторите тестовое значение во втором цикле - вы не увидите никакого вывода.

Как говорит Амит, вы можете поместить оба вызова внутри первой во время цикла, или вы можете позвонить:

$result->data_seek(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(); 
$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;  
?> 
+0

Работало отлично! Спасибо! Мне особенно понравилось добавлять результат к переменной, которую я могу вызвать позже в скрипте. – Cascades

1

Вам не нужна вторая петля. Просто сделайте так ..

<?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"]; 
     } 
    }; 

    ?> 
0

Попробуйте это:

Пример объекта ориентированный стиль, используя поиск в строке:

Вам необходимо сбросить указатель результатов mysqli до 0, используя метод по умолчанию data_seek(0). Функция data_seek(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"]; 
    } 
}; 
?> 

ИЛИ объединить два в то время как петля с одной:

<?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"]; 
    } 
}; 

?> 

Надеется, что это помогут вам!

0

Вы можете управлять этим в SQL-запросе, вместо этого используя условие order by, без использования 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"]; 

}; 
?> 

Примечание: это решение будет работать только в том случае, если вам нужны результаты MEMBER_ALL по возрастанию или убыванию.