IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Problème apostrophes et guillemets au niveau d'une requête SQL


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 80
    Points : 52
    Points
    52
    Par défaut Problème apostrophes et guillemets au niveau d'une requête SQL
    Bonjour,

    Voilà le souci,
    Je souhaite insérer des images dans ma BDD MySQL, jusque là, tout va bien.
    Enfin, ça dépend....
    Si le titre de l'image ne comporte pas d'apostrophes ou guillemets, ça marche très bien... dans le cas contraire, ça me donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ame.jpg', '10776', 'image/jpeg', 'ÿØÿà\0JFIF\0\0\0d\0d\0\0ÿì\0Ducky\0\0\0\' at line 1

    L'apostrophe quand je tente d'ajouter cette image provient de l'apostrophe.
    J'aimerais savoir comment faire pour transformer cette apostrophe pour qu'elle ne pose plus de problème et qu'on puisse la voir par la suite (j'ai le même souci avec une partie que j'intitule résumé et qui comportera également des apostrophes).

    Voici ma fonction de transfert d'image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    function transfert ()
    {
    	$ret = false;
    	$img_blob = '';
    	$img_taille = 0;
    	$img_nom= '';
    	$taille_max = 250000;
     
    	$ret = is_uploaded_file ($_FILES['fic']['tmp_name']);
    	if(!$ret)
    	{
    		echo"Problème de transfert";
    		return false;
    	}
    	else
    	{
    		//le fichier a bien été reçu
    		$img_taille = $_FILES['fic']['size'];
    		if($img_taille > $taille_max)
    		{
    			echo "Fichier trop volumineux!";
    			return false;
    		}
    		$img_type = $_FILES['fic']['type'];
    		$img_nom1 = $_FILES['fic']['name'];
    		$img_nom = htmlspecialchars($img_nom1);
    		$img_blob = file_get_contents ($_FILES['fic']['tmp_name']);
     
    		$req = "insert into image ("."image_nom, image_taille,image_type, image_blob".") values ("."'".$img_nom."', "."'".$img_taille."', "."'".$img_type."', "."'".addslashes($img_blob)."')";	
    		$ret = mysql_query ($req) or die (mysql_error());
    		return true;
    	}
    };
    Et mon formulaire pour l'envoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (isset($_FILES['fic']))
    							{
    								transfert();
    							}
    						echo"<form enctype='multipart/form-data' action='#' method='POST'>
    							<input type='hidden' name='max_file_size' value='250000'>
    							<input type='file' name='fic' size=50>
    							<input type='submit' value='Envoyer'>
    						</form>

    Qu'en pensez-vous ??
    Il me semble que l'utilisation de htlmspecialchars ou htmlentities soit nécessaire non ?? Par contre je ne vois pas comment le mettre en oeuvre...
    Un p'tit coup de main serait pas de refus

  2. #2
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 80
    Points : 52
    Points
    52
    Par défaut
    Finalement je vais me répondre à moi-même

    Il me suffit de faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $img_type = $_FILES['fic']['type'];
    		$img_nom1 = $_FILES['fic']['name'];
    		$img_nom = htmlspecialchars($img_nom1,ENT_QUOTES);
    		$img_blob = file_get_contents ($_FILES['fic']['tmp_name']);
    Cela fonctionne, par contre, ça me transforme mon apostrophe en &#039; et ça risque de me poser quelques soucis par la suite... enfin, je verrais bien

  3. #3
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Je te conseille plutôt d'utiliser la fonction mysql_real_escape_string(). Il faut l'utiliser systématiquement lors d'une insertion dans une base, sinon c'est la porte ouverte à toutes les injections SQL.

  4. #4
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 80
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par guidav Voir le message
    Je te conseille plutôt d'utiliser la fonction mysql_real_escape_string(). Il faut l'utiliser systématiquement lors d'une insertion dans une base, sinon c'est la porte ouverte à toutes les injections SQL.
    C'est-à-dire ?? injections SQL ?? 0_o

    Hormis ça je vois pas comment l'afficher sur la page suivante, tu saurais m'aider ??
    J'ai fait une fonction me permettant de récupérer les informations de mon image, mais je ne vois pas vraiment comment l'afficher maintenant

  5. #5
    Expert éminent
    Avatar de 12monkeys
    Homme Profil pro
    Webmaster
    Inscrit en
    Novembre 2006
    Messages
    4 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2006
    Messages : 4 093
    Points : 9 031
    Points
    9 031
    Par défaut
    Hello

    Une injection Sql c'est ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT nom FROM utilisateurs WHERE identifiant = '".$_POST['identifiant']."' AND mdp = '".$_POST['mdp']."' "
    Si la personne entre comme identifiant prenom' -- la requete donne ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nom FROM utilisateurs WHERE identifiant = 'prenom' --' AND mdp = ''
    Cette personne sera identifiée sans mot de passe puisque les deux tirets signifient un commentaire...

    Vois cette fonction dans la FAQ qui t'éviteras ce problème. Pour ensuite afficher la valeur normalement avec les ' et sans les slashs il suffit d'utiliser stripslashes.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 04/06/2015, 13h21
  2. [1.x] Probléme au niveau d'une requête DQL
    Par simolewestside dans le forum Symfony
    Réponses: 1
    Dernier message: 27/12/2012, 12h31
  3. [Oracle] Problème au niveau d'une requête et de l'utilisation de son résultat
    Par LethaL86 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 04/09/2007, 14h31
  4. [VB]Problème avec une requête SQL
    Par Tyrael62 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 18/03/2006, 17h47
  5. Réponses: 11
    Dernier message: 28/12/2004, 16h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo