MySQL - Array con imágenes BLOB sólo muestra la última foto del array

 
Vista:
sin imagen de perfil
Val: 1
Ha disminuido su posición en 53 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Array con imágenes BLOB sólo muestra la última foto del array

Publicado por Maje (1 intervención) el 03/11/2018 09:28:42
Hola a tod@s! He creado un proyecto en ionic que tiene que cargar los datos de una tabla creada con phpMyAdmin. La base de datos MySql, tiene una tabla "fotos" que contiene un campo BLOB "foto". Con PHP tiene que leer todo el array de fotos y mostrarlas. En Ionic mostraría todas las imágenes.

El problema que tengo es que sólo muestra la úlima foto leída. Dentro del bucle, sólo queda almacenada la última lectura. He sacado un ejemplo de la red que parece que funciona pero yo no consigo solucionarlo. Os pongo el código para ve si alguien le ve una solución.

Muchas gracias por leerme.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET,POST,OPTIONS,DELETE,PUT');
header( 'Access-Control-Allow-Headers: Authorization, Content-Type' );
 
 
// Define database connection parameters
$hn      = 'localhost';
$un      = 'root';
$pwd     = '';
$db      = 'basedatos';
$cs      = 'utf8';
 
// Set up the PDO parameters
$dsn  = "mysql:host=" . $hn . ";port=3306;dbname=" . $db . ";charset=" . $cs;
$opt  = array(
                    PDO::ATTR_ERRMODE            =>
PDO::ERRMODE_EXCEPTION,
                    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
                    PDO::ATTR_EMULATE_PREPARES   => false,
                   );
// Create a PDO instance (connect to the database)
$pdo  = new PDO($dsn, $un, $pwd, $opt);
$data = array();
 
// Attempt to query database table and retrieve data
try {
  $listing = $pdo->query('SELECT * FROM fotos');
 
  while($listing_row  = $listing->fetch(PDO::FETCH_OBJ))
  {
 
    // Assign each row of data to associative array
     $listing_data[] = $listing_row;
     $newArrData = [];
 
     foreach ($listing_data as $key =>$value){
         $newArrData["foto"] = base64_encode($value->foto);
     }
  }
 
  $array = array($newArrData);
  echo json_encode($listing_data);
  echo json_encode($array);
}
 
catch(PDOException $e)
{
  echo $e->getMessage();
}
 
?>

En Ionic, el fichero home.ts sería:

1
2
3
4
5
6
7
8
9
10
11
12
loadFoto() : void{
  this.http
  .get('http://localhost/prueba_uno/blob.php')
  .subscribe((data2 : any) =>
  {
     console.dir(data2);
     this.fotos = data2;
  },
  (error : any) =>
  {
     console.dir(error);
  });}

Y en home.html

1
2
3
<ion-card *ngFor="let foto of fotos">
 
    <img src="data:image/jpeg;base64,{{foto.foto}}"/>
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 21
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Array con imágenes BLOB sólo muestra la última foto del array

Publicado por Fabricio (7 intervenciones) el 10/11/2018 13:51:14
Buen día: Estas almacenando el dato (en este caso foto) en la misma posición del array, es por eso que solo te queda la ultima foto, pues en la ultima iteración del bucle carga tal foto
Haces...
1
2
3
4
5
6
7
8
9
while ($listing_row  = $listing->fetch(PDO::FETCH_OBJ)){
    $listing_data[] = $listing_row;  // aquí  asignas el registro leído, luego ya no necesitas un foeach
    $newArrData = [];
 
     foreach ($listing_data as $key =>$value){
         $newArrData["foto"] = base64_encode($value->foto);
     }
..
}

Una forma de hacerlo es con un array indexado

1
2
3
$i = 0;
while ($listing_row  = $listing->fetch(PDO::FETCH_OBJ)
  $newArrData[$i++] =base64_encode($listing_row['foto']);

Revisa tal código, soy nuevo en php.

Espero te sirva. Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar