Class requete [Résolu]

Messages postés
22
Date d'inscription
mercredi 20 août 2008
Dernière intervention
9 novembre 2018
- 10 juin 2018 à 17:42 - Dernière réponse :
Messages postés
23246
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 novembre 2018
- 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)

--
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Messages postés
23246
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 novembre 2018
- 10 juin 2018 à 19:44
1
Merci
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.

Merci jordane45 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de jordane45
Messages postés
22
Date d'inscription
mercredi 20 août 2008
Dernière intervention
9 novembre 2018
- 11 juin 2018 à 06:18
0
Merci
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 !!
--
Messages postés
23246
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 novembre 2018
- 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);
Commenter la réponse de cs_Elberton

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.