Insérer des objets Blob dans une base de données MySql avec php
Je suis en train de stocker une image dans la Base de données, pour une raison quelconque, il ne semble pas fonctionner. Voici la structure de ma table.
mysql> describe ImageStore;
+---------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+----------+------+-----+---------+-------+
| ImageId | int(11) | NO | PRI | NULL | |
| Image | longblob | NO | | NULL | |
+---------+----------+------+-----+---------+-------+
2 rows in set (0.01 sec)
Et voici ma requête qui insère l'image ou au moins c'est ce qu'il doit:
//Store the binary image into the database
$tmp_img = $this->image['tmp_name'];
$sql = "INSERT INTO ImageStore(ImageId,Image)
VALUES('$this->image_id','file_get_contents($tmp_image)')";
mysql_query($sql);
Si j'imprime la valeur de file_get_contents($tmp_image), alors il y a des tonnes de données sur l'écran. Mais cette valeur n'est pas stockés dans la base de données et c'est la question que je me pose.
OriginalL'auteur nikhil | 2011-08-13
Vous devez vous connecter pour publier un commentaire.
Problème
Cela crée une chaîne de caractères en PHP nommé
$sql
. Oublier de MySQL pour une minute, parce que vous n'êtes pas à l'exécution d'une requête encore. Vous êtes juste à la construction d'une chaîne de caractères.La magie de PHP signifie que vous pouvez écrire un nom de variable — dire,
$this->image_id
— à l'intérieur de les guillemets et la variable obtient toujours magiquement agrandi.Cette fonctionnalité, appelée "interpolation de variable", ne se produit pas pour les appels de fonction. Donc, tout ce que vous faites ici est l'écriture de la chaîne
"file_get_contents($tmp_image)"
dans la base de données.Solution de (1)
Donc, pour concaténer le résultat de l'appel
file_get_contents($tmp_image)
, vous avez à sauter hors de la chaîne et de faire les choses de manière explicite:(Vous pouvez le voir, même juste de la coloration syntaxique comment cela a fonctionné.)
Solution de (2)
Maintenant, le problème que vous avez est que si le binaire de données contient tout
'
, votre requête n'est pas valide. Donc, vous devez l'exécuter à traversmysql_escape_string
à désinfecter pour l'opération de requête:Solution de (3)
Maintenant, vous avez un vraiment grosse corde, et votre base de données devient encombrant.
Préfère ne pas stocker des images dans des bases de données, où vous pouvez l'aider.
Pas de problème!
Re "préfèrent ne pas stocker de gros fichiers en db".. en fait ça dépend de ce db.
OriginalL'auteur Lightness Races in Orbit
De s'étendre sur les Tomalak commentaire, vous ne pouvez pas exécuter une fonction à l'intérieur de guillemets.
Essayer:
OriginalL'auteur Ben
essayez ceci:
OriginalL'auteur classic
Comme mentionné vous vient de sauver de la chaîne
"file_get_contents($tmp_image)"
dans la dbmais vous avez besoin pour exécuter la fonction
file_get_contents
au lieun'oubliez pas de hachage de l'image à l'aide d'un algorithme de hachage comme
base64_encode
avant de l'enregistrer dans la bd.les images peuvent matières un peu illégal de mots (tels que -- , " , " et ainsi de suite...) et cela peut causer des problèmes alors que nous sommes à l'exécution de la requête
sans hachage ou d'autres contrôles cela peut provoquer des attaques par injection sql
Vous n'avez pas besoin de hachage. Juste d'échapper les guillemets simples et les barres obliques inverses pour éviter de briser la chaîne de mode.
Vous avez raison , mais il y a une autre option , on peut envoyer et recevoir des images comme une chaîne et à partir du navigateur , le navigateur le plus peut convertir un fichier crypté en base64 de la chaîne de l'image , mais pour les injections sql et personnalisé erreurs que j'ai faites confiance à votre solution
OriginalL'auteur RezaSh