Вернуть более 1 записей MySQL с bind_result

Я создаю страницу для своего магазина, но я использовал get_result, и после того, как я все закончил, я понял, что HostGator не может позволить мне запустить mysqlnd. Поэтому мне пришлось вместо этого преобразовать все в bind_result, но я зашел в тупик, вероятно, из-за того, что мне пришлось все изменить...

В любом случае, моя проблема в том, что я вызываю некоторые запросы для чтения таблиц, но весь код останавливается после возврата 1 результата. В этом коде, например, я призываю список назначений, хотя в базе данных установлено примерно 5 назначений, возвращается только первое. Он работает так, как предполагается, и читает из нескольких таблиц, но останавливается на 1 цикле. Это не позволило бы мне продолжить чтение 2-й таблицы, если бы я не делал $listappointments_stmt->free_result(); сначала до следующих запросов, так что я думаю, что это моя проблема, но я понятия не имею, как обойти это, так как это дает мне логическую ошибку, если у меня ее там нет. Любые идеи приветствуются!

Заранее спасибо, Ксенос К.

<?php
                $query="SELECT * FROM appointments";
                $listappointments_stmt=$mysqli->prepare($query);
                $listappointments_stmt->execute();
                $listappointments_stmt->bind_result($AppId, $AppDate, $AppTime, $AppType, $AppArtist, $AppTitle, $AppClient, $AppPrice, $AppNotes);
                while ($listappointments_stmt->fetch())
                {
                $theDate=date("d-M-Y", strtotime($AppDate));
                echo "<tr><td>".$theDate."</td>";
                echo "<td>".$AppTime."</td>";
                $listappointments_stmt->free_result();
                $tempappointmentType=$AppType;
                $query2="SELECT * FROM appointmenttypes WHERE ID=?";
                $listappointmentsTypes_stmt=$mysqli->prepare($query2);
                $listappointmentsTypes_stmt->bind_param("s", $tempappointmentType);
                $listappointmentsTypes_stmt->execute();
                $listappointmentsTypes_stmt->bind_result($AppTypeId, $AppTypeName, $AppTypeColor);
                while ($listappointmentsTypes_stmt->fetch())
                {
                echo "<td><span class=\"label\" style=\"background-color:".$AppTypeColor."\">".$AppTypeName."</span></td>";
                }
                $listappointmentsTypes_stmt->free_result();
                $listappointmentsTypes_stmt->close();
                $tempappointmentArtist=$AppArtist;
                $query3="SELECT * FROM staff WHERE ID=?";
                $listappointmentsArtist_stmt=$mysqli->prepare($query3);
                $listappointmentsArtist_stmt->bind_param("s", $tempappointmentArtist);
                $listappointmentsArtist_stmt->execute();
                $listappointmentsArtist_stmt->bind_result($ArtId, $ArtName, $ArtNickName, $ArtSurname, $ArtPhone, $ArtBirthDate, $ArtIdentificationNumber, $ArtStreetName, $ArtStreetNumber, $ArtPostalCode, $ArtCity, $ArtCountry, $ArtPosition, $ArtEmail, $ArtFacebook, $ArtInstagram);
                while ($listappointmentsArtist_stmt->fetch())
                {
                echo "<td>".$ArtName." ".$ArtNickName." ".$ArtSurname."</td>";
                }
                $listappointmentsArtist_stmt->free_result();
                $listappointmentsArtist_stmt->close();
                echo "<td>".$AppTitle."</td>";
                $tempappointmentClient=$AppClient;
                $query4="SELECT * FROM clients WHERE ID=?";
                $listappointmentsClient_stmt=$mysqli->prepare($query4);
                $listappointmentsClient_stmt->bind_param("s", $tempappointmentClient);
                $listappointmentsClient_stmt->execute();
                $listappointmentsClient_stmt->bind_result($CliId, $CliName, $CliSurname, $CliPhone, $CliBirthDate, $CliIdentificationNumber, $CliStreetName, $CliStreetNumber, $CliPostalCode, $CliCity, $CliCountry, $CliFathersFullName, $CliMothersFullName, $CliEmail, $CliFacebook, $CliInstagram, $CliNotes);
                while ($listappointmentsClient_stmt->fetch())
                {
                echo "<td>".$CliName." ".$CliSurname."</td>";
                echo "<td>".$CliPhone."</td>";
                }
                $listappointmentsClient_stmt->free_result();
                $listappointmentsClient_stmt->close();
                echo "<td>".$AppPrice."</td>";
                echo "<td><a href=\"appointmentsedit.php?appointmentStatus=view&appointmentId=".$AppId."\" title=\"".$lang['view']."\"><i class=\"text-green fa fa-eye\"></i></a></td>";
                echo "<td><a href=\"appointmentsedit.php?appointmentStatus=edit&appointmentId=".$AppId."\" title=\"".$lang['edit']."\"><i class=\"text-blue fa fa-edit\"></i></a></td>";
                echo "<td><a href=\"appointmentsedit.php?appointmentStatus=delete&appointmentId=".$AppId."\" title=\"".$lang['delete']."\"><i class=\"text-red fa fa-trash-o\"></i></a></td></tr>";
                }
                $listappointments_stmt->close();
                ?>

1 ответ

Решение

Вы будете мудры, чтобы научиться использовать JOIN операторы в SQL. Это позволит вам использовать только один SQL-запрос для получения всех необходимых вам результатов.

Между тем, если вы вкладываете некоторые SQL-запросы в другие, то внешний запрос (в вашем случае SELECT * FROM appointments) требуется отдельное подключение к базе данных (в вашем случае $mysqli) из остальных запросов. Выдача нового запроса из соединения сбрасывает остальные запросы.

Совет: не используйте SELECT * в производстве программного обеспечения. Вместо этого приведите список нужных вам столбцов. Ваше программное обеспечение будет более надежным и понятным, если вы сделаете это.

Другие вопросы по тегам