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 :

"SQLSTATE[42000]: Syntax error or access violation: 1064" sur requete préparée UPDATE


Sujet :

PHP & Base de données

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Mai 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut "SQLSTATE[42000]: Syntax error or access violation: 1064" sur requete préparée UPDATE
    Bonjour à tous,

    je tente, en vain, d’exécuter une requête préparée de mise à jour et obtient le message :
    Erreur : SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax.
    J'ai beau chercher (par moi-même et sur le net), je ne trouve rien.
    Voila mon code :
    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
    34
    35
    36
    37
    38
    39
    	try
    	{
    		$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    		$db = new PDO('mysql:host=localhost;dbname=MaBase', 'Identifiant', 'Password', $pdo_options);
    	}
    	catch(Exception $e)
    	{die('Erreur : '.$e->getMessage());}
     
    	$arg = $_POST;
    	$sql = 'UPDATE :table SET ';
    	$i = 0;
    	foreach ($_POST as $cle => $element)
    	{
    		if ($cle != 'table' and $cle != 'ID')
    		{
    			if ($i>0) {$sql = $sql.', ';}
    			$sql = $sql.$cle.' = :'.$cle;
    			$i++;
    		}
    	}
    	$sql = $sql.' WHERE ID=:ID';
    	unset ($arg['ID']);
    	$arg['ID'] = intval ($_POST ['ID']);
    	try
    	{
    		$req = $db->prepare($sql);
    		$nb_update = $req->execute($arg);
    		echo $nb_update." entry(ies) updated !";
    	}
    	catch(Exception $e)
    	{
    		echo '<br/>';
    		echo 'Request : '.$sql;
    		echo '<br/>Arguments : ';
    		print_r ($arg);
    		echo '<br/>';
    		die('Erreur : '.$e->getMessage());
     
    	}
    et j'obtiens donc comme résultat :
    Request : UPDATE :table SET Name = :Name, Number = :Number WHERE ID=:ID
    Arguments : Array ( [table] => Account [Name] => TEST [Number] => test [ID] => 7 )
    Erreur : SQLSTATE[42000]: Syntax error or access violation: 1064 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 ''Account' SET Name = 'TEST', Number = 'test' WHERE ID='7'' at line 1
    Si j’exécute cette requête en mode sauvage (je construit ma requête directement avec mes variables) tout fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	[....]
    	$sql = 'UPDATE '.$_POST['table'].' SET ';
    	$i = 0;
    	foreach ($_POST as $cle => $element)
    	{
    		if ($cle != 'table' and $cle != 'ID')
    		{
    			if ($i>0) {$sql = $sql.', ';}
    			$sql = $sql.$cle.' = \''.$element.'\'';
    			$i++;
    		}
    	}
    	$sql = $sql.' WHERE ID='.$_POST['ID'];
    	$db->query($sql) or die(print_r($req->errorInfo()));
    Si quelqu'un voit le pb, parce-que moi je sèche...
    Et si vous avez des remarques sur mon code je les écouterais volontiers, je débute en PHP / MySQL

    Merci d'avance !!

  2. #2
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 275
    Points
    3 275
    Par défaut
    Il n'est pas possible de passer une table en paramètre d'une requête préparée parce que PDO l'entoure de guillemet, ce qui rend ta requête invalide.

    Tu dois l'indiquer en 'brut' dans ta requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql = 'UPDATE '.$arg['table'].' SET ';
    unset($arg['table']);
    Note bien que cela rend ta requête vulnérable aux injections SQL.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Mai 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Ok merci de ta réponse.

    Je vais faire la modif comme dans ma "solution sauvage" et faire manuellement les vérifications pour éviter les injections SQL.

Discussions similaires

  1. [PDO] SQLSTATE[42000]: Syntax error or access violation: 1064
    Par martin30200 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 10/11/2014, 12h45
  2. [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, 18h10
  3. [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, 17h13
  4. [MySQL] [MySQL] SQLSTATE[42000]: Syntax error or access violation: 1064
    Par Domotik35 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 28/07/2011, 17h42
  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, 13h12

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