PDO fetchObject () después de fetchall (). devolviendo falso

Soy nuevo en PHP. Estoy tratando de mostrar los detalles de los empleados en forma de tabla. Pero while($row = $result->fetchObject()) no se está ejecutando, ya que $result->fetchObject() devuelve falso. Tiene algo que ver con $rows = $result->fetchAll(); ? Aquí está el fragmento de código.

 $sql = "SELECT id, name, designation FROM employees"; if ($result = $pdo->query($sql)) { $rows = $result->fetchAll(); $num_rows = count($rows); if ($num_rows > 0) { echo "\n"; echo " \n"; echo " \n"; echo " \n"; echo " \n"; echo " \n"; while($row = $result->fetchObject()) { echo " \n"; echo " \n"; echo " \n"; echo " \n"; echo " \n"; } echo "
IDNameDesignation
" . $row->id . "" . $row->name . "" . $row->designation . "
"; } else { echo "No employees in database."; } else { echo "ERROR: Could not execute $sql. " . print_r ($pdo->errorInfo()); }

La documentación de PDO es un poco confusa en esto, pero el PDOStatement::fetch() y su primo fetchAll() devuelven false cuando no hay más filas disponibles para devolver. Los documentos dicen que devuelve false cuando falla , y la falta de filas disponibles cuenta como una falla.

Su llamada inicial a fetchAll() obtiene todas las filas del objeto PDOstatement result y no hay más para la llamada fetchObject() para recuperar, por lo que devuelve false .

Solo necesita su llamada inicial a fetchAll() , pero es posible que necesite establecer su tipo de búsqueda en PDO::FETCH_OBJ si no estableció anteriormente el tipo de búsqueda predeterminado para su conexión.

Luego, puede reemplazar su ciclo while con un bucle foreach simple sobre la matriz $rows que ya tiene. Esto tiene el beneficio adicional de separar un poco más la lógica de visualización de la lógica de negocio de consulta de base de datos:

 if ($result = $pdo->query($sql)) { // Fetch them now, as objects $rows = $result->fetchAll(PDO::FETCH_OBJ); $num_rows = count($rows); if ($num_rows > 0) { echo "\n"; echo " \n"; echo " \n"; echo " \n"; echo " \n"; echo " \n"; // $rows now has everything you need, just loop over it foreach ($rows as $row { echo " \n"; echo " \n"; echo " \n"; echo " \n"; echo " \n"; } echo "
IDNameDesignation
" . htmlspecialchars($row->id) . "" . htmlspecialchars($row->name) . "" . htmlspecialchars($row->designation) . "
"; } else { echo "No employees in database."; } else { echo "ERROR: Could not execute $sql. " . print_r ($pdo->errorInfo()); }

Tenga en cuenta también que agregué llamadas a htmlspecialchars() mientras escribía salida en HTML. Esto siempre se recomienda, de modo que los caracteres como < > & que tengan un significado especial en HTML estén codificados correctamente, y evite las vulnerabilidades de secuencias de comandos entre sitios si esos valores se originaron como datos de entrada del usuario.