PHP. Неопределенное свойство: стандартный класс в двойном запросе

#php #mysql #sql #mysqli

#php #mysql #sql #mysqli

Вопрос:

Второй запрос не работает, и я пытаюсь повторить всю информацию во втором запросе из другой таблицы, но появляется следующее сообщение:
Undefined property: stdClass::$titulo (и остальная часть «resultado2»)
Я попытался выполнить while, как в первом запросе (while ($nfila = $resultado2-> fetch_object())), но появляется другое сообщение об ошибке:
Trying to get property of non-object

 <?php
    $usuario = $_SESSION['usuario_valido'];
    $consulta = "SELECT * FROM `lista-usuarios` WHERE categoria='favoritos' AND  nombreusuario='$usuario' ORDER BY pelicula ASC";
    $resultado = $conexion->query($consulta);

    if ($resultado)
        {
        $cont3 = 1; //Para el id de la peli
        $i = 0; //Para un class unico
        while ($nfila = $resultado->fetch_object())
            {
            $pelicula = "peli" . $cont3; //Para hacer un id unico de cada pelicula
            $i  ;
            echo "<form role='form' id='$pelicula'><table class='table table-striped'>";
            echo "
                            <tr>
                                <td>" . $cont3 . "</td>
                                <td class='celda2'>" . $nfila->pelicula . "</td>
                                <td class='celda2'>" . $nfila->anio . "</td>
                                <td class='celda2'><button type='button' class='infoCompleta btn btn-default' data-toggle='modal'data-target='.modal" . $i . "'><span class='glyphicon glyphicon-hand-right'></span> Info Completa</button></td><td class='celda2'><button type='button' class='eliminarFav1 btn btn-danger'><span class='glyphicon glyphicon-remove-sign'>                                                     </span> Favoritos</button></td>
                            </tr>";
            $consulta2 = "SELECT * FROM `peliculas` WHERE titulo='$nfila->pelicula'";
            $resultado2 = $conexion->query($consulta2);
            if ($resultado2)
                {
                echo "
                            <div class='modal fade bs-example-modal-lg modal" . $i . "' tabindex='-1' role='dialog' aria-labelledby='myLargeModalLabel'>
                            <div class='modal-dialog modal-lg'>
                            <div class='modal-content'>
                            <div class='modal-header'>
                            <button tyle='button' class='close' data-dismiss='modal' aria-hidden='true'>amp;times;</button>
                            <h4 class='modal-tigle'>" . $nfila->titulo . "</h4>
                            </div>
                            <div class='modal-body'>
                            <center><a target='_blank' href='imagenes/" . $nfila->imagen . "'>
                            <img class='img-top-peliculas' src='imagenes/" . $nfila->imagen . "' class='img-rounded '></a>
                            </center><br />
                            <p><strong>Titulo Original: </strong>" . $nfila->tituloOriginal . "</p>
                            <p><strong>Año: </strong>" . $nfila->anio . "</p>
                            <p><strong>Duracion: </strong>" . $nfila->duracion . " min.</p>
                            <p><strong>País: </strong>" . $nfila->pais . "</p>
                            <p><strong>Director: </strong>" . $nfila->director . "</p>
                            <p><strong>Reparto: </strong>" . $nfila->reparto . "</p>
                            <p><strong>Género: </strong>" . $nfila->genero . "</p>
                            <p><strong>Sinopsis: </strong>" . $nfila->sinopsis . "</p>
                            </div>
                            <div class='modal-footer'>
                            <button type='button' class='btn btn-default' data-dismiss='modal'>Cerrar</button>
                            </div>
                            </div>
                            </div>
                            </div>";
                }

            echo "<input name='usuario' type='hidden' value='$usuario'>";
            echo "<input name='titulo' type='hidden' value='$nfila->pelicula'>";
            echo "<input name='anio' type='hidden' value='$nfila->anio'>";
            echo "<input name='categoria' type='hidden' value='categoria' class='cat'>";
            echo "</table></form>";
            $cont3  ;
            }

        echo "<span class='datos'></span>";
        }
      else
        {
        echo "Hubo un problema al cargar las peliculas";
        } 
  

Ответ №1:

Вы не извлекаете результаты из $resultado2 = $conexion->query($consulta2); . Вы все еще используете последнее $nfila из предыдущих $nfila = $resultado->fetch_object() . Я предполагаю, что вы хотите что-то вроде:

    if ($resultado2) {
        $nfila2 = $resultado2->fetch_object();
  

Затем используйте $nfila2 в этом внутреннем условном, где вы echo выводите другую часть.

   echo "
        ... stuff ....

      <h4 class='modal-tigle'>" . $nfila2->titulo . "</h4>

       ... more stuff....";
  

Кроме того, я не рекомендую вложенные запросы к одному и тому же соединению. Я бы сделал выборку всего исходного набора:

  $results =  $resultado->fetch_all();
 foreach($results as $nfila) {
       //Do stufff
  

Однако fetch_all в mysqli возвращаются только массивы, а не объекты, поэтому просто убедитесь, что вы преобразовали $nfila->pelicula ссылки в $nfila['pelicula']

Комментарии:

1. Большое вам спасибо, это работает, я хотел бы задать еще один вопрос. Кто-то сказал мне: «Это отразится на производительности приложения, потому что в цикле выполняется n запросов, которые в зависимости от конфигурации сервера могут его выбросить, возможно, лучше поставить другой способ сделать это». Это хороший способ сделать это? Или я должен поступить иначе?

2. Да, я бы сделал это в одном объединенном запросе, поскольку вы используете в $nfila->pelicula качестве ключа во 2-й таблице. Также вы можете столкнуться с выполнением 2 активных запросов к одному и тому же соединению подобным образом, поэтому я бы, по крайней мере, выполнил fetch_all() для первого результата запроса и повторил предоставляемый массив.

3. Хорошо, но считаете ли вы, что есть проблема, как и я?

4. Я бы избегал вложенных запросов. Смотрите Обновление внизу моего ответа

5. Хорошо, большое вам спасибо, ответ был очень полезным.