Class requete

Résolu
cs_Elberton Messages postés 25 Date d'inscription mercredi 20 août 2008 Statut Membre Dernière intervention 28 septembre 2019 - Modifié le 10 juin 2018 à 19:34
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 - 11 juin 2018 à 09:57
Bonjour,
Je vous explique un soucis.
Dans un précédent post, j'ai demandé s'il fallait mieux stocker dans un repertoire ou un blob.
Cela fonctionne avec le répertoire, aucun problème.
Cependant dans le projet, j'ai un accès à une autre base de donnée qui ne m'appartient pas mais dont j'ai accès en lecture pour certaine données.
Notamment par exemple la table db_race qui contient des données sur des chiens méchants catégorisé.
Il y a un id, le nom_race, cat, photo.
Le champ photo est un blob que je dois afficher. J'arrive à afficher la photo avec le code suivant :
    //Check connection
    if($db->connect_error){
       die("Connection failed: " . $db->connect_error);
    }
    
    //Get image data from database
    $result = $db->query("SELECT * FROM db_race WHERE id =1");
 if($result->num_rows > 0)
 {
        $imgData = $result->fetch_assoc();
        
        //Render image
        header("Content-type: image/jpg"); 
        //echo "<a href='http://localhost/".$imgData['Photo']."'>Lien</a>"; 
  echo $imgData['Photo'];
    }
 else
 {
        echo 'Image not found...';
    }


Hors je fonctionne avec une class. Et là je n'y arrive pas a afficher la photo correctement.
Toute les données texte fonctionne mais pas les photos:
 public function TabResSQL($Requete)
 {
  $i = 0;
  
  $TabResultat=array();
  //Si la requete est ok, on fait la boucle sinon on renvoie l'erreur
  if($Ressource = mysqli_query($this->Lien,$Requete))
  {
   while ($Ligne = $Ressource->fetch_assoc())
   {
    foreach ($Ligne as $clef => $valeur) $TabResultat[$i][$clef] = $valeur;
    $i++;
   }
  }
  else
  {
   die(mysqli_error($this->Lien));
  }
  //on libere les ressources des requetes
  mysqli_free_result($Ressource);
  return $TabResultat;
 }


Quand je fais appel à ma fonction :

$result = $link->TabResSQL('SELECT * FROM db_race WHERE id=1;');
 header("content-type:image/jpg,true"); 
 echo $result[0]['Photo'];


Sa m'affiche un carré noir avec rien dedans.
Si je fais un test dans une page vide avec du code linéaire cela fonctionne. Mais pas quand j'utilise ma class.

Si je retire le header j'ai tout des suites de lettre et de chiffre.
Je pense que je dois oublier de faire quelques chose. Le but de la manoeuvre est d'afficher la photo de la race du chien dans un tableau avec d'autres informations lié aux chiens.

merci beaucoup

EDIT : Ajout du langage dans les balises de code pour avoir la coloration syntaxique ! (jordane)

--

2 réponses

jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
10 juin 2018 à 19:44
Bonjour,
l'affichage d'images blob se fait via un base64 et non un header (même si ça peut marchouiller comme tu as pu le voir...)
Essayes donc ça :
echo '<img src="data:image/jpeg;base64,'.base64_encode( $result[0]['Photo'] ).'"/>';


Au passage ta fonction de requetage peut s'écrire plus simplement:
public function TabResSQL($Requete)
 {
  $TabResultat=array();
  //Si la requete est ok, on fait la boucle sinon on renvoie l'erreur
  if($Ressource = mysqli_query($this->Lien,$Requete)) {
    while ($Ligne = $Ressource->fetch_assoc())
    {
      $TabResultat[] = $Ligne;
    }
  } else {
     die(mysqli_error($this->Lien));
  }
  //on libere les ressources des requetes
  mysqli_free_result($Ressource);
  return $TabResultat;
 }


NB: Tu noteras que les balises de code affichent en "couleur".
J'ai, pour cela, préciser le langage dedans....
J'ai édité ton message pour le faire apparaitre.
Explications ici : http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code
A prendre en compte pour tes prochains messages... merci.
1
cs_Elberton Messages postés 25 Date d'inscription mercredi 20 août 2008 Statut Membre Dernière intervention 28 septembre 2019
11 juin 2018 à 06:18
Merci beaucoup, cela fonctionne impeccable ! Je n'avais pas trouver sur internet base64. Enormement de réponse sur le header justement.
Merci.
.
 while ($Ligne = $Ressource->fetch_assoc())
    {
      $TabResultat[] = $Ligne;
    }

Pour les lignes, je ne connaissais pas ce type d'écriture mais en effet c'est simplifié. je vais voir pour le faire dans d'autres fonction

Merci encore pour ton aide !!
--
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
11 juin 2018 à 09:57
D'ailleurs... y'a même encore plus simple... sans boucle ni rien...
Juste une seule ligne :
$TabResultat = mysqli_fetch_all($Ressource,MYSQLI_ASSOC);
0
Rejoignez-nous