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

PHP & Base de données Discussion :

Erreur : Syntax error or access violation


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2003
    Messages : 422
    Par défaut Erreur : Syntax error or access violation
    Bonjour,
    j'ai cette erreur avec cette expression : l'appel du 18 juin

    Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de 'appel du 18 juin %' OR desi LIKE '%l'appel du 18 juin %' OR desi LIK' à la ligne 2 in

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    				$sql="SELECT id, desi, desi_supp FROM collec_0 WHERE
    				desi LIKE '% ".$expression." %'	
    				OR desi LIKE '%".$expression." %' 
    				OR desi LIKE '% ".$expression."%' 
    				OR desi_supp LIKE '% ".$expression." %'	
    				OR desi_supp LIKE '%".$expression." %' 
    				OR desi_supp LIKE '% ".$expression."%' ";
     
    				$reponse = $bdd->prepare($sql);	
     
    				$reponse->execute();
    je n'ai pas d'idée sur ce qui pose problème (peut être " ' " ??)

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 690
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 690
    Par défaut
    pour ne pas avoir besoin de gérer les caractères spéciaux dans les variables, je vous conseille de passer par des requêtes préparées :
    https://www.php.net/manual/fr/pdo.prepare.php

  3. #3
    Membre éclairé
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2003
    Messages : 422
    Par défaut
    Elle est pas préparée ma requête ? $reponse = $bdd->prepare($sql);

  4. #4
    Membre chevronné
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Septembre 2012
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2012
    Messages : 416
    Par défaut
    Requêtes préparées = la structure de la requête (code SQL) est séparée des données de la requête (les variables qu'on envoie dans la requête).

    En résumé et en version simplifiée, la requête est exécutée en 3 temps :

    1) Transmission du code SQL de la requête (la structure)
    2) Injection des variables (les données)
    3) Exécution de l'ensemble (le driver ou le sgbd va compiler l'ensemble et l'exécuter)


    Consultez le lien que Mathieu vous a proposé, vous y verrez plus clair avec les exemples qui s'y trouvent.

  5. #5
    Membre éclairé
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2003
    Messages : 422
    Par défaut
    Bonjour,
    rien compris, à mon age j'ai la comprenette un peu lente !!!
    dans mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    				$sql="SELECT id, desi, desi_supp FROM collec_0 WHERE
    				desi LIKE '% ".$expression." %'	
    				OR desi LIKE '%".$expression." %' 
    				OR desi LIKE '% ".$expression."%' 
    				OR desi_supp LIKE '% ".$expression." %'	
    				OR desi_supp LIKE '%".$expression." %' 
    				OR desi_supp LIKE '% ".$expression."%' ";
     
    				$reponse = $bdd->prepare($sql);	
     
    				$reponse->execute();
    j'ai bien ma structure sql que je transmet à "prepare"

    mon code fonctionne puisque si j'ai comme expression "de Gaule" je n'ai pas d'erreur c'est donc bien l'apostrophe qui pose problème.

    Avant je travaillai avec mysqli et j'avais la fonction mysqli_real_escape_string pour résoudre ce problème mais avec PDO je ne l'ai plus

    J'essaie de comprendre le PDO, alors si quelqu'un peut me mettre le code qui fonctionne je suis preneur, car je souhaite passer tout le site en PDO
    à moins que PDO ne soit pas adapté pour ce genre de requêtes

    Merci et bonne journée

  6. #6
    Membre émérite
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    Août 2017
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 57
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Août 2017
    Messages : 358
    Par défaut Pour travailler dans les règles
    Quand la valeur de la variable est intégrée directement au texte SQL, on ne peut plus appeler cela une requête préparée, ou paramétrée.
    L'idée est de pourvoir réutiliser cette requête avec des valeurs différentes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	// 1 - prépare la requête - structure ONLY, pas de VARIABLE, un PARAMETRE
    	$requete = $bdd->prepare("SELECT * FROM collec_o WHERE desi  like CONCAT('%', :param, '%') or desi_supp  like CONCAT('%', :param, '%'); ");
     
    	// 2 - lie la variable $expression au paramètre :param de la requête préparée
    	$requete->bindValue(':param', $expression, PDO::PARAM_STR);
     
    	//3 - exécution !
    	$requete->execute();
    Dans la mesure où '%' désigne un nombre indéfini de caractères, la condition " desi like '%truc%' " inclut les enregistrements qui vérifient " desi like '% truc%' " ou "desi like '%truc %' "
    Lorsque l'on veut tester un nombre particulier de positions, il faut utiliser un ou des caractères de substitution '_', (=correspond à 1 caractère).

  7. #7
    Membre éclairé
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2003
    Messages : 422
    Par défaut
    Ha merci, là c'est nettement plus clair et compréhensible
    et je viens d'en apprendre encore un bout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete->bindValue(':param', $expression, PDO::PARAM_STR);
    je modifie mon script

    Testé ça marche.
    Maintenant si je peux abuser un peu de votre patiente

    A quoi servent les ":" et les "," pour param (dans le select)

    Encore merci

  8. #8
    Membre émérite
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    Août 2017
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 57
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Août 2017
    Messages : 358
    Par défaut Bonjour Michel71,
    Le ":" signale justement qu'on a affaire à un paramètre, tu peux utiliser le nom de ton choix (bien sûr en évitant caractères spéciaux ou accentués)

    Tu verras aussi parfois ? sans rien derrière mais c'est plus ambigu car dans la 2e étape il faut faire le lien sur la valeur en respectant bien l'ordre d'apparition des ? dans la requête préparée.
    En plus ici tu veux utiliser la même valeur à deux endroits de ta requête.

    En lire plus dans le Manuel PHP sur PDO::prepare et sur la réutilisation de requêtes préparées.

    La fonction CONCAT(truc1, truc2...) (on peut utiliser un certain nombre d'arguments, j'ai rarement eu besoin de plus de six) permet de concaténer plusieurs expressions, je m'en suis servi pour mettre '%' avant la valeur du paramètre et '%' après. Sert principalement sur des chaînes de caractères, ou sur des formats pouvant être convertis en chaînes de caractères.

    CONCAT('Tiens, on est le ', CURRENT_DATE(), ' et il est ', CURRENT_TIME() ) donnera une chaîne de type 'Tiens, on est le : 2020-11-30 et il est : 15:18:35' avec un format de date et d'heure qui dépendra de ta base de données.

    CONCAT('Tiens, on est le ', CURRENT_DATE(), ' et il est ', NULL ) donnera NULL

    Voilà, voilà.

  9. #9
    Membre éclairé
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2003
    Messages : 422
    Par défaut
    Merci
    et donc avec les requêtes préparées plus besoin de se prémunir contre les injections c'est bien ça ?

    Bonne soirée et encore merci

  10. #10
    Membre émérite
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    Août 2017
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 57
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Août 2017
    Messages : 358
    Par défaut Cf. Manuel PHP
    Les paramètres pour préparer les requêtes n'ont pas besoin d'être entre guillemets ; le pilote gère cela pour vous. Si votre application utilise exclusivement les requêtes préparées, vous pouvez être sûr qu'aucune injection SQL n'est possible (Cependant, si vous construisez d'autres parties de la requête en vous basant sur des entrées utilisateurs, vous continuez à prendre un risque).
    Extrait du Manuel PHP sur php.net

    Ce qui ne veut pas dire qu'on peut tout d'un coup faire confiance à ce qui est saisi par l'utilisateur.
    Même si ce n'est pas de l'injection SQL, ça se contrôle.
    Toujours.

    Par exemple, si ta base est très volumineuse, et que ton utilisateur saisit '%', tu peux imaginer le risque sur ta requête.

  11. #11
    Membre éclairé
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2003
    Messages : 422
    Par défaut
    Merci pour tout

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

Discussions similaires

  1. [MySQL] Erreur de syntaxe Syntax error or access violation: 1064
    Par karamaster dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 19/08/2015, 11h18
  2. Réponses: 2
    Dernier message: 08/08/2014, 12h34
  3. [PDO] Erreur louche : 'SQLSTATE[42000]: Syntax error or access violation: 1064'
    Par oliopur dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 19/03/2012, 17h10
  4. [MySQL] Erreur SQL : SQLSTATE[42000]: Syntax error or access violation: 1064
    Par petit.quent dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/12/2011, 16h13
  5. [PDO] Erreur incompréhensible : 'SQLSTATE[42000]: Syntax error or access violation: 1064'
    Par cyril_k dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 13/12/2008, 12h12

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