2015-05-22 4 views
0

Как использовать цикл PHP через запрос вместо того, чтобы все результат в массив, то зацикливание через массивКак с помощью PHP-кода и MySQL?

Как я использовать массив и цикл выглядит так:

<?php $userInfos = $qry->querySelect(SQL CODE HERE); 

    foreach($userInfos as $uInfo) 
     { 
     $fName = $uInfo['fName']; 
     $lName = $uInfo['lName']; 
     $gender = $uInfo['gender']; 
?> 

First name is: <? echo $fName; ?> and Last name is <? echo $lName; ?>. 

<?php } ?> 

Я хотел чтобы лучше понять, как цикл PHP через запрос лучше, чем массив. Переадресуйте меня на какой-то пример или, возможно, с включенным кодом MySQL.

Как я могу преобразовать вышеуказанный PHP-код, чтобы быть более эффективным, если я потянул миллионы записей?

Большое спасибо !.

+0

просто убедитесь, что не строят запрос с * (все столбцы), а только те, которые вам нужны. Кроме этого, вам нужно запустить запрос к базе данных и позволить mysql возвращать массив php, а затем цикл через этот массив, как вы уже делаете с querySelect, я думаю. – smozgur

+0

Я просто хотел знать, есть ли какая-либо польза, перейдя через запрос вместо массива, который содержит все значения? – danidee

+0

@ danidee: Да, есть преимущество. Преимущество цикла выборки состоит в том, что она требует * меньше * памяти. С помощью цикла выборки мы можем обрабатывать каждую строку по мере ее извлечения, а затем отбрасывать ее и повторно использовать эту память для следующей строки. Одновременно мы должны хранить только «одну строку». С помощью fetchAll в массив, который потенциально будет требовать распределения нагрузки на память, будет выделен массив hugh jass, содержащий * каждую * перевернутую строку, прежде чем мы обработаем первую строку. (Таким образом, нет никакой разницы, если у вас есть неограниченное количество доступной памяти, и она не может использоваться ни для чего другого). – spencer7593

ответ

1

Похоже, что вам нужно использовать что-то другое, чем функция querySelect (который, кажется, возвращая массив).

Возможно, у объекта $qry есть еще одна функция, которая вернет вам дескриптор выписки, который вы можете получить, как и обычные и PDO интерфейсы.

Мне кажется, что $qry - это из класса «обертка» библиотеки доморощенного MySQL, который предоставляет ограниченное подмножество функций. Если этот объект не предоставляет способ получить дескриптор инструкции, вам может потребоваться добавить соответствующие функции к определению объекта или отказаться от него и просто использовать mysqli или PDO.

Существует множество примеров того, как это сделать. С PDO, нашим первым разрезом (перед добавлением проверки ошибок и обработки исключений) может выглядеть примерно так:

$sql="SELECT t.name FROM really_big_table t"; 
$sth=$dbh->prepare($sql); 
$sth->execute(); 

while ($row = $sth->fetch(PDO::FETCH_ASSOC)) { 
    echo "<br>Name is: ". htmlentities($row['name']); 
} 

$sth->close(); 

Ссылка: http://php.net/manual/en/pdostatement.fetch.php

1

я следующее:

//DB Query getData 
$q_getData = "SELECT `stuff`, `moreStuff`, `otherStuff` FROM `table`"; 
$rsgetData = mysqli_query($DBi, $q_getData) or die(mysqli_error($DBi)); 
$row_rsgetData = mysqli_fetch_assoc($rsgetData); 
$rows_rsgetData = mysqli_num_rows($rsgetData); 

if($rows_rsgetData>0) { 
    do { 
     echo $row_rsgetData['stuff'] . '&nbsp;' . $row_rsgetData['moreStuff'] . '<br>'; 
     echo $row_rsgetData['otherStuff']; 
    } while ($row_rsgetData = mysqli_fetch_assoc($rsgetData)); 
     $rows = mysqli_num_rows($rsgetData); 
     if($rows > 0) { 
      mysqli_data_seek($rsgetData, 0); 
      $row_rsgetData = mysqli_fetch_assoc($rsgetData); 
     } 
    mysqli_free_result($rsgetData); 
}; 

Это работает запрос и петли через каждую строку до тех пор, пока не осталось строк - только если в первую очередь возвращены строки. Как только все закончится, он освободит соединение.

Смежные вопросы