簡體   English   中英

如何在PHP中顯示MySQL數據庫中存儲的一個表的所有數據

[英]How to display all the data of a table stored in a MySQL database in PHP

我試圖以 blob 格式顯示包含圖像的表的數據,但我只能顯示最后插入的記錄。 我想顯示所有記錄及其各自的圖像,當添加新記錄時,它將與表數據的 rest 一起顯示。

MYSQL

noticias: idNoticia(PK), idUser(FK), titulo, imagen(LONGBLOB), texto, fecha

PHP - insertarNoticias.php

include('./DB.php');
session_start();

$idUser = $_SESSION['usuario'][0];
   $titulo = $_POST['titulo-noticia'];
   $texto = $_POST['texto-noticia'];
   $fecha = $_POST['fecha-noticia'];
   $nombreImagen = $_FILES['imagen']['name'];
   $carpetaDestino = $_SERVER['DOCUMENT_ROOT'] . '/masterD/trabajo_final_php/img/'; 
   move_uploaded_file($_FILES['imagen']['tmp_name'], $carpetaDestino . $nombreImagen);
   
   $conexion = DB::conn();
   $imagen = fopen($carpetaDestino . $nombreImagen, "r");
   $archivoBytes = fread($imagen, intval(filesize($carpetaDestino . $nombreImagen)));
   fclose($imagen);
   
   $sentencia = 'INSERT INTO noticias (idUser, titulo, imagen, texto, fecha) VALUES (:idUser, :titulo, :imagen, :texto, :fecha)';
   $consulta = $conexion->prepare($sentencia);
   $consulta->bindParam(':idUser', $idUser);
   $consulta->bindParam(':titulo', $titulo);
   $consulta->bindParam(':imagen', $archivoBytes);
   $consulta->bindParam(':texto', $texto);
   $consulta->bindParam(':fecha', $fecha);
   $consulta->execute();
   $consulta->closeCursor();
   $conexion = null;

PHP - mostrarNoticias.php

include('./DB.php');
session_start();

$titulo = '';
    $imagen = '';
    $texto = '';
    $fecha = '';

    $conexion = DB::conn();
    $sentencia = 'SELECT * FROM noticias';
    $consulta = $conexion->prepare($sentencia);
    $consulta->execute();

    
    while ($row = $consulta->fetch(PDO::FETCH_ASSOC)) {
        
        $titulo = $row['titulo'];
        $imagen = $row['imagen'];
        $texto = $row['texto'];
        $fecha = $row['fecha'];
        
    }

    $consulta->closeCursor();
    $conexion = null;

PHP - adminNoticias.php

<?php
include('./mostrarNoticias.php');
?>

<form class="form" action="./insertarNoticias.php" method="post" id="crear-noticia" enctype="multipart/form-data">
                            <div class="form-label">
                                <input type="file" name="imagen" class="form-control mb-3" id="imagen-noticia" required>
                                <input type="text" class="form-control mb-3" name="titulo-noticia" id="titulo-noticia" placeholder="Título noticia" required>
                                <input type="text" class="form-control mb-3" name="texto-noticia" id="texto-noticia" placeholder="Texto noticia" required>
                                <input type="date" class="form-control mb-3" name="fecha-noticia" id="fecha-noticia" required>
                            </div>
                            <button type="submit" class="btn btn-success col-12 text-center">
                                Crear noticia
                            </button>
                        </form>

<div class="grid-container pt-4" id="ver-noticias">
            <div class="grid-item">
                <?php
                echo "<h4>$titulo</h4>";
                echo "<p>$texto</p>";
                echo "<p>$fecha</p>";
                echo "<img width='300' height='160' src='data:image/png; base64," . base64_encode($imagen) . "'>";
                ?>
            </div>
        </div>

@LuqMan 這就是我的意思

現在它是這樣顯示的

<div class="grid-container">
<div class="grid-item">
<h4></h4>
<p></p>
<p></p>
<img>
<h4></h4>
<p></p>
<p></p>
<img>
</div>
</div>

我希望它看起來像這樣:

<div class="grid-container">
<div class="grid-item">
<h4></h4>
<p></p>
<p></p>
<img>
</div>
<div class="grid-item">
<h4></h4>
<p></p>
<p></p>
<img>
</div>
</div>

您正在循環獲取數據,覆蓋相同的變量。 您需要在循環中顯示變量。 最好創建一個 function 來顯示每一行並從循環中調用它。

一種解決方案如下 -

將包含向下移動到顯示所在的位置

PHP - adminNoticias.php

<form class="form" action="./insertarNoticias.php" method="post" id="crear-noticia" enctype="multipart/form-data">
                            <div class="form-label">
                                <input type="file" name="imagen" class="form-control mb-3" id="imagen-noticia" required>
                                <input type="text" class="form-control mb-3" name="titulo-noticia" id="titulo-noticia" placeholder="Título noticia" required>
                                <input type="text" class="form-control mb-3" name="texto-noticia" id="texto-noticia" placeholder="Texto noticia" required>
                                <input type="date" class="form-control mb-3" name="fecha-noticia" id="fecha-noticia" required>
                            </div>
                            <button type="submit" class="btn btn-success col-12 text-center">
                                Crear noticia
                            </button>
                        </form>

<div class="grid-container pt-4" id="ver-noticias">
<?php
include('./mostrarNoticias.php');
?>
</div>

並在這里顯示每一行

PHP - mostrarNoticias.php

include('./DB.php');
session_start();

$titulo = '';
    $imagen = '';
    $texto = '';
    $fecha = '';

    $conexion = DB::conn();
    $sentencia = 'SELECT * FROM noticias';
    $consulta = $conexion->prepare($sentencia);
    $consulta->execute();

    
    while ($row = $consulta->fetch(PDO::FETCH_ASSOC)) {
        
        $titulo = $row['titulo'];
        $imagen = $row['imagen'];
        $texto = $row['texto'];
        $fecha = $row['fecha'];
        ?>
        <div class="grid-item">
        <?php
        echo "<h4>$titulo</h4>";
        echo "<p>$texto</p>";
        echo "<p>$fecha</p>";
        echo "<img width='300' height='160' src='data:image/png; base64," . base64_encode($imagen) . "'>";
        ?>
        </div>        
        <?php
    }

    $consulta->closeCursor();
    $conexion = null;

…………

這里分享了非常簡單的解決方案,但也可能有其他選擇。 您的代碼中的問題是,您的 while 循環繼續其循環,並且循環中的變量在每次迭代時都替換其值。 您可以將每個變量轉換為數組,然后在您想要使用 foreach 循環顯示表格的代碼中使用它們。 但最簡單的解決方案如下:

PHP - mostrarNoticias.php

$output='';
while ($row = $consulta->fetch(PDO::FETCH_ASSOC)) {

    $titulo = $row['titulo'];
    $imagen = $row['imagen'];
    $texto = $row['texto'];
    $fecha = $row['fecha'];

    $output .= "<h4>$titulo</h4>
            <p>$texto</p>
            <p>$fecha</p>
            <img width='300' height='160' src='data:image/png; base64," . base64_encode($imagen) . "'>";

}

PHP - adminNoticias.php在您的 adminNoticias 文件中,將以下 div 替換為使用從包含所有記錄的先前 while 循環中獲取的 output。

<div class="grid-container pt-4" id="ver-noticias">
            <div class="grid-item">
                <?php
                echo $output;
                ?>
            </div>
</div>

如果您需要任何解釋,我將不勝感激:-)

根據您的評論編輯的版本

DIV 元素可以嵌入 while 循環中,如下所示:

PHP - mostrarNoticias.php

$output='';
while ($row = $consulta->fetch(PDO::FETCH_ASSOC)) {

    $titulo = $row['titulo'];
    $imagen = $row['imagen'];
    $texto = $row['texto'];
    $fecha = $row['fecha'];

    $output .= "<div class='grid-container pt-4' id='ver-noticias'>";
    $output .= "<div class='grid-item'><h4>$titulo</h4>";
    $output .="<p>$texto</p>
            <p>$fecha</p>
            <img width='300' height='160' src='data:image/png; base64," . base64_encode($imagen) . "'></div></div>";

}

現在在 adminNoticias.php 文件中打印 Output

            <?php
            echo $output;
            ?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM