BLOB

Petit nouveau ! | 4 Messages

20 déc. 2011, 15:04

Bonjour messieurs,

je crois être un des rares à avoir une erreur dans l'affichage de mon image provenant d'un champ BLOB dans ma BD MySQL.
Voici l'erreur que j'obtiens :
L'image "http://localhost/test/fonction/apercu.php?id=1" ne peut être affichée car elle contient des erreurs.
Mes bouts de codes.

1 - POUR INJECTER L'IMAGE DANS LA BASE
                    $fichier_blob = file_get_contents($_FILES['foto']['tmp_name']);
               
                    $fichier_blob = addslashes($fichier_blob);

                    $requete = "INSERT INTO `photo_candidat` (`id_compte_emploi`, `photo_nom`, `photo_taille`, `photo_type`, `photo_description`, `photo_data`)
                               VALUES ('$numCompte', '$fichier_nom', '$fichier_taille', '$fichier_type', 'eVolution', '$fichier_blob')";

                    $inject  = mysql_query($requete);
                    if($inject)                                                         //ETAPE 5
                    {
                        $injection['result'] = 'ok';
                        return $injection;
                    }                            
                    else
                    {
                        $injection['mess'] = "Problème avec la base de donnée";
                        $_SESSION['error'] =  "Impossible d'effectuer la requete sur la BDD - Erreur 1105 
                        return $injection;
                    }
L'injection se passe sans problème


2 - POUR AFFICHER L'IMAGE
A - LISTE DES IMAGE DANS LA BASE
$req = "SELECT photo_nom, photo_candidatId FROM photo_candidat ORDER BY photo_nom";
$ret = mysql_query ($req) or die (mysql_error ());
while ( $col = mysql_fetch_row ($ret) )
{
     echo "<a href=\"apercu.php?id=".$col[1].
              "\">".$col[0]."</a><br />";
}

B - PAGE QUI DOIT AFFICHER L'IMAGE
if(isset($_GET['id']))
{
    $id = intval($_GET['id']);
    
    $req = "SELECT photo_candidatId, photo_type, photo_data ".
           "FROM photo_candidat WHERE photo_candidatId = $id ORDER BY photo_nom";
    
    $ret = mysql_query ($req) or die (mysql_error ());
    //$col = mysql_fetch_row ($ret);
    
    if ( !mysql_result($ret, 0) )
    {
        echo "Id d'image inconnu";
    }
    else
    {
        //header ("Content-type: ".$col[1]);
        header('Content-type: image/jpeg');
        header('Content-transfer-encoding: binary');
        echo mysql_result($ret, 2);
    }
}
else
{
    echo "Mauvais id d'image";
}
Et j'obtiens le message décrit au dessus. J'ai cru au début à un problème d'encodage des caractères (UTF-8, unicode et autre) donc j'ai passé ma BDD en ''uni_general_ci, j'ai vidé les fichier BLOB, j'ai ré injecté de nouveau et même résultat.

Merci à toute âme charitable pour des indications ou une soluces....

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

20 déc. 2011, 15:48

salut,

tu a un addlslashes foireux dans la 1ère pages y a des chances que ça se reporte sur le reste.

la protection des données avec l'extension mysql ce fait avec mysql_real_escape_string (à faire pour tout les champs).

@+
Il en faut peu pour être heureux ......

ViPHP
ViPHP | 2287 Messages

20 déc. 2011, 16:01

Bonjour,

Il est peut-être pertinent de rappeler que tu te serais évité ce problème (ainsi que d'autres à venir) en stockant non pas une image dans un champ blob mais simplement le chemin vers un fichier externe à la base. Il est encore temps de changer d'avis... ;-)

@+
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Petit nouveau ! | 4 Messages

20 déc. 2011, 16:08

salut,

tu a un addlslashes foireux dans la 1ère pages y a des chances que ça se reporte sur le reste.

la protection des données avec l'extension mysql ce fait avec mysql_real_escape_string (à faire pour tout les champs).

@+
Je change et j'essai de suite...

mais pour info le "addshlaches" a été ajouté parce que les modules php "magic_quote_runtime" est désactivé.

Bonjour,

Il est peut-être pertinent de rappeler que tu te serais évité ce problème (ainsi que d'autres à venir) en stockant non pas une image dans un champ blob mais simplement le chemin vers un fichier externe à la base. Il est encore temps de changer d'avis... ;-)
J'ai pesé le pour et le contre... dans mon cas il est VRAIMENT plus judicieux de stocker les fichiers dans la BDD parce que l'arborescence de mon serevur est amené à évoluer. Et je vous dis pas le casse tête que ça sera de maintenir les liens...


A de suite.

Petit nouveau ! | 4 Messages

20 déc. 2011, 16:16

Alors j'ai remplacé le "addslaches" par "mysql_real_escape_string" et j'ai la même erreur.... :roll:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

20 déc. 2011, 17:49

mais pour info le "addshlaches" a été ajouté parce que les modules php "magic_quote_runtime" est désactivé.
vi je me doute bien :)
mais autant faire les chose bien, lien bien la doc de mysql_real_escape_string por voir la différence :)

sinon a tu essayé d'afficher ton image directement dans le navigateur ? (en mettant http://localhost/test/fonction/apercu.php?id=1 dans la barre d'url ?)) voir ce qu'il met dans la page (sans la balise image) s'il y a un message d'erreur tu devrais l'y voir :d

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 4 Messages

21 déc. 2011, 09:11

mais pour info le "addshlaches" a été ajouté parce que les modules php "magic_quote_runtime" est désactivé.
vi je me doute bien :)
mais autant faire les chose bien, lien bien la doc de mysql_real_escape_string por voir la différence :)

sinon a tu essayé d'afficher ton image directement dans le navigateur ? (en mettant http://localhost/test/fonction/apercu.php?id=1 dans la barre d'url ?)) voir ce qu'il met dans la page (sans la balise image) s'il y a un message d'erreur tu devrais l'y voir :d

@+
Alors le truc c'est que quand dans la page apercu.php je supprime tous les header, j'obtiens les caractères contenus dans le champ BLOB à l'état brut. mais quand j'ajoute un header disant que c'est du "image/jpeg" >>>> il me dit que l'image ne peut être affichée parce qu'elle contient des erreurs....

Skim
Invité n'ayant pas de compte PHPfrance

17 janv. 2012, 18:27

Salut à tous,

Je me permet de remettre ce sujet en actu car j'ai le même problème que Dougou.
Pratiquant l'upload de fichier et le stockage du chemin, je me suis orienté vers le stockage BLOB pour pouvoir faire évoluer mon application (de GED) plus facilement.
Ayant des bêtes de courses (je parle de mes serveurs...) les perf ne sont plus mon problème ...

Ma config en local :
OS : Window 7
Serveur WAMP server.

Avant de me lancer tête baissé vers cette solution (qui dans mes conception MCD et UML me convient) je voulais tester très rapidement le fonctionnement.
J'ai fait le tuto suivant : http://beaussier.developpez.com/article ... ysql/blob/ mais ça ne fonctionne pas pourtant le code (même si il est ancien devrait fonctionner).

Suite à cela j'ai fait plusieurs test.

- Un fichier index.php et une image avec le code suivant pour voir si ça ne venais pas de ma config et ça marche:
header('Content-type: image/jpeg');
$img = base64_encode(file_get_contents('img.jpg'));
echo base64_decode($img);
- le deuxième test qui ne marche pas :
- Table images -> img_id:int | img_nom:varchar(45) | img_blob : longblob | img_type : varchar(25)
- j'ai deux insertions dans ma table avec des blob/images enregistrés directement depuis ma bdd
- 3 fichiers : index.php
            include 'connexion.php';
            
            $select = 'SELECT img_id, img_nom FROM images';
            $query = mysql_query($select);
        
            echo '<table>
                    <tr>
                        <th>ID</th>
                        <th>NOM</th>
                        <th>IMAGE</th>
                    </tr>';
            
            while($r = mysql_fetch_object($query)){
                echo '
                <tr>
                    <td>'.$r->img_id.'</td>
                    <td>'.$r->img_nom.'</td>
                    <td><a href="image.php?id='.$r->img_id.'"><img src="image.php?id='.$r->img_id.'" alt="image '.$r->img_id.'"/></a></td>
                </tr>';
            }
            echo'</table>';
- connexion.php :
$hote = 'localhost';
$base = 'blob';
$user = 'root';
$pass = '';

$cnx = mysql_connect ($hote, $user, $pass) or die (mysql_error ());
$ret = mysql_select_db ($base) or die (mysql_error ());
- image.php
 header('Content-type:image/jpeg');
//    $img = file_get_contents('img.jpg');
//    echo $img;
    
    include 'connexion.php';
    
    $id = (int) $_GET['id'];
    
    $select = 'SELECT img_blob FROM images WHERE img_id = '.$id.';';
    $q = mysql_query($select);
    $r = mysql_fetch_object($q);
    
    echo $r->img_blob;
Le principe c'est que mon index m'affiche mes images contenu dans ma base de données en passant par le script image.php.
Ca marche pas !
J'ai essayé de changer le charset de la BDD, sans succès.
Si quelqu'un a une à plusieurs idées je suis preneur.

Cordialement Skim.

ViPHP
xTG
ViPHP | 7331 Messages

17 janv. 2012, 18:54

Qu'en est-il du charset de connexion à la bdd ?
Et le charset du fichier ?

Skim
Invité n'ayant pas de compte PHPfrance

18 janv. 2012, 10:49

Qu'en est-il du charset de connexion à la bdd ?
Et le charset du fichier ?
Ma base de données MySQL est en utf8_general_ci.
Le fichier est encodé au format jpeg donc pas de charset à ma connaissance.

ViPHP
xTG
ViPHP | 7331 Messages

18 janv. 2012, 11:59

Non je parlais du charset du script.
Et du charset de connexion, pas le charset du fichier de la bdd.

charset de connexion : http://dev.mysql.com/doc/refman/5.0/en/ ... ction.html

Skim
Invité n'ayant pas de compte PHPfrance

18 janv. 2012, 13:07

Solution trouvé,
Il ne faut pas de ligne vide entre le header et le echo :
if ( isset($_GET['id']) ) {
	$id = intval ($_GET['id']);
	include ("connexion.php");
	$req = "SELECT img_id, img_type, img_blob,img_nom FROM images WHERE img_id = ".$id;
	$ret = mysql_query ($req) or die (mysql_error ());
	$col = mysql_fetch_row ($ret);
	if ( !$col[0] ) {
		echo "Id d'image inconnu";
	} else {
		header ("Content-type: ".$col[1]);
		//header("Content-Disposition: attachment; filename=".$col[3]);
		echo $col[2];
	}
} else {
	echo "Mauvais id d'image";
}
Ce code marche !
Et le commentaire n'est pas une ligne vide. Allez savoir ...

Sinon pour les charsets je suis en utf8 de partout !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

18 janv. 2012, 20:21

hum étonnant sachant que cela ne change rien tant que c'est dans du code php.

si par contre tu sort du code, ou que tu a des espace, voir un encodage de fichier utf8 avec bom ça merde car le header ne peux être envoyé (envoie de l'entete avant) et dans ce cas tu devrais avoir un message d'erreur.
est ce que ton niveau de rapport d'erreur est bien à E_ALL | E_STRICT ? s'il est inférieur ça peux masquer les éventuels message d'erreur.


@+
Il en faut peu pour être heureux ......

devlop78
Invité n'ayant pas de compte PHPfrance

20 janv. 2012, 04:10

hum étonnant sachant que cela ne change rien tant que c'est dans du code php.
Il me parait évident que la résolution vient d'ailleurs ... par exemple un "?>" à la fin du fichier puis un saut de ligne ? Bref ! L'année 2012 ne fait que commencer, mais je mets cette résolution comme étant pour le moment la plus miraculeuse de l'année 2012

:)