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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 684
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 684
    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).

+ 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