mysqli — вложенный, пока не работает в переполнении стека

У меня проблема с моим кодом.
Я использую вложенное время в моем коде, а вложенное время не работает, только внешнее время работает
Я не знаю, где ошибка моего кода.
Это часть моего кода:

$database = new mysqli('127.0.0.1', 'user', 'user', 'mini_email');
$query = 'SELECT * FROM mails';
$query2 = 'SELECT * FROM users';
$result_set = $database->query($query);
$result2 = $database->query($query2);

while ($row2 = $result2->fetch_assoc()) {
if ($row2['username'] == $_SESSION['user']) {
$id_email = $row2['id'];
}
}

if (isset($_SESSION['is_logged_in'])) {
echo('<center><font size="10">Mailing List</font></center><br><br>');
echo('<center><table border="3" bgcolor="#f0cdfa">');
echo('<tr>');
echo ('<td>No</td>');
echo ('<td>ID</td>');
echo ('<td>From</td>');
echo('<td>Subject</td>');
echo ('<td>Message</td>');
echo ('<td>Action</td>');
echo ('</tr>');
$i = 1;
while ($row = $result_set->fetch_assoc()) {
if ($row['to_user_id'] == $id_email) {
echo('<tr>');
echo ('<td>' . $i . '</td>');
echo ('<td>' . $row['id'] . '</td>');
while($row2 = $result2->fetch_assoc()){
if($row2['id']== $row['from_user_id']){
echo ('<td>' . $row2['username'] . '</td>');
}
}
echo ('<td>' . $row['subject'] . '</td>');
echo ('<td>' . $row['message'] . '</td>');
echo ('<td><a href="view_email.php?id=' . $row['id'] . '"">View</a></td>');
echo ('</tr>');
$i++;
}
}

0

Решение

Ваш начальный

while ($row2 = $result2->fetch_assoc()) {

перебирает все записи до конца набора,

так что зацикливание во второй раз не получит дальнейшие записи, потому что вы уже в конце набора результатов

Указатели набора результатов не сбрасываются автоматически при запуске нового цикла, но вы можете сбросить их вручную, используя

$result2->data_seek(0);

перед каждым последующим циклом

Но, повторяя замечание, высказанное @Sirko в комментариях, было бы лучше использовать JOIN для создания одного запроса.

1

Другие решения

Если я могу помочь, я думаю, что вы даже не должны выполнять запросы, когда ваш оператор if с сессией возвращает false.

В первых строках или в вашем скрипте вы должны определить функцию со всем этим кодом и написать ее так:

function YourFunction()
{
if (isset($_SESSION['is_logged_in'])) {
return false;
}
// Database connection and queries
// your business
}

Это будет более чистым.

Затем ваш запрос не выглядит правильным. Вы получаете все письма вашего сайта, а затем в цикле проверяете, является ли идентификатор пользователя почты идентификатором пользователя, который у вас есть в сеансе. Представьте себе отсутствие производительности, если у вас есть 35 000 писем в вашей базе данных.

Усовершенствуйте свой запрос с помощью оператора WHERE: http://www.w3schools.com/sql/sql_where.asp

тогда вы уверены, что $_SESSION['user'] содержит идентификатор? Я думаю, что ваше второе утверждение if никогда не вернется из-за этого.

0

По вопросам рекламы [email protected]