Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1797 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  PDOException' with message 'SQLSTATE[42000]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

PDOException' with message 'SQLSTATE[42000]

n°2175923
Winpoks
Posté le 15-02-2013 à 13:46:20  profilanswer
 

Bonjour,
 
Je tourne en boucle depuis un moment pour une erreur qui est surement très con mais je ne la trouve pas.  
 
J'ai essayé deux méthodes et j'obtiens à chaque fois la même erreur, je pense que l'erreur proviendrai de la requête SQL mais je n'en suis pas sur. Voici le bout de code incriminé par l'erreur.
 

Code :
  1. try
  2. {
  3. $bdd = new PDO ('mysql:host=localhost;dbname=velolaroue1', 'root', '');
  4. $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  5. }
  6. catch (Exeption $e)
  7. {
  8. die ('Erreur : '.$e->getmessage());
  9. }
  10. $csv = new SplFileObject('web_product.txt', 'r');
  11. $csv->setFlags(SplFileObject::READ_CSV);
  12. $csv->setCsvControl(';');
  13. foreach($csv as $ligne)
  14. {
  15. $prod_existe = $bdd->prepare('SELECT * FROM ps_product WHERE reference = :refpro');
  16. $prod_existe->bindParam('refpro', $ligne[17]);
  17. $prodexi= $prod_existe->rowCount();
  18. if($prodexi == 0)
  19. {
  20.  $creproreq = "INSERT INTO ps_product(reference, price, wholesale_price) VALUES(:reference, :price, :wholesale_price)";
  21.  $crepro=$bdd->prepare($creproreq);
  22.  //$crepro->execute(ARRAY(
  23.  //'reference'=> $ligne[17],
  24.  //'price'=> $ligne[5],
  25.  //'wholesale_price'=> $ligne[14]
  26.  //));
  27.  $crepro->bindParam('reference', $ligne[17]);
  28.  $crepro->bindParam('price', $ligne[5]);
  29.  $crepro->bindParam('wholesale_price', $ligne[14]);
  30.  $crepro->execute();


 
La seconde méthode est en commentaire au milieu et j'enlève la fin lors de celle ci. Le if est fermé plus tard à la suite de d'autres requêtes. Le ligne 40 corresponds à l'execute.  
 
J'ai donc l'erreur suivante
 

Code :
  1. Fatal error: Uncaught exception 'PDOException' with message '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 'INSERT INTO ps_product(reference, price, wholesale_price) VALUES('CHAUSSUR' at line 1' in C:\wamp\www\mag\web_product4.php on line 40


Code :
  1. PDOException: 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 'INSERT INTO ps_product(reference, price, wholesale_price) VALUES('CHAUSSUR' at line 1 in C:\wamp\www\mag\web_product4.php on line 40


 
Je vous remercie de toute l'aide que vous m'apporterez.  :jap:  
 

mood
Publicité
Posté le 15-02-2013 à 13:46:20  profilanswer
 

n°2175973
gelatine_v​elue
Posté le 15-02-2013 à 17:28:34  profilanswer
 

Ce serait pas du aux quotes autour de CHAUSSUR qui fermeraient la requête?

n°2175977
Winpoks
Posté le 15-02-2013 à 18:57:58  profilanswer
 

Bonsoir,
 
C'est aussi ce que je ne comprends pas, c'est censé me renvoyer la valeur chaussure… mais ça la tronque. J'ai essayé avec une autre colonne du csv et ça fait de même.

n°2176009
CyberDenix
Posté le 15-02-2013 à 22:12:35  profilanswer
 

Vérifie si reference ne doit pas être un id, et plus largement si il est apte à recevoir un tel format de données d'après la définition du type de la colonne.
 
Sinon essaye ça :
 
$creproreq = "INSERT INTO ps_product(reference, price, wholesale_price) VALUES(?, ?, ?)";
 
$crepro=$bdd->prepare($creproreq);
 
$crepro->execute(array($ligne[17], $ligne[5], $ligne[14]));


Message édité par CyberDenix le 15-02-2013 à 22:14:09

---------------
Directeur Technique (CTO)
n°2176027
Winpoks
Posté le 16-02-2013 à 09:48:06  profilanswer
 

Bonjour,
Merci, de cette façon là ça marche. J'avais pourtant essayé les points d’interrogations après avoir posté ici mais avec le même résultat. La différence venant d'après.  
 
 

Code :
  1. $creproreq= "INSERT INTO ps_product(reference, price, wholesale_price) VALUES(?, ?, ?)";
  2.  $crepro=$bdd->prepare($creproreq);
  3.  $crepro->bindParam(1, $ligne[17]);
  4.  $crepro->bindParam(2, $ligne[5]);
  5.  $crepro->bindParam(3, $ligne[14]);
  6.  $crepro->execute();

n°2176048
Winpoks
Posté le 16-02-2013 à 15:31:07  profilanswer
 

Bonjour,
J'ai encore et exactement le même soucis. Je ne comprends pas pourquoi la valeur se tronque. J'ai modifié la réquéte pour n'écrire que si la reference n'existe pas.

 
Code :
  1. $creproreq = "INSERT INTO ps_product(reference, price, wholesale_price) VALUES(?, ?, ?) WHERE NOT EXISTS (SELECT id_product FROM ps_product WHERE ps_product.reference = ?";
  2.  $crepro=$bdd->prepare($creproreq);
  3.  $crepro->execute(array($ligne[17], $ligne[5], $ligne[14], $ligne[17]));
 

J'ai donc pris la requête qui marchait en y ajoutant la condition WHERE NOT EXISTS. J'ai essayé aussi avec de simples requêtes comptant le nombre de ligne mais même problème de tronquage (ici ça le fait même avant CHAUSS). Le CSV donne un nom complet avec espace (mais ça coupe avant même la fin du premier mot de cette colonne) avec séparation par des ;.

 

J'ai donc encore une fois exactement la même erreur. Pourtant je ne vois pas ou je ne ferme pas ni ce qui peut clocher (pourtant il y a forcément quelque chose qui ne va pas :D ).

 

Merci encore.  :jap:

  


Message édité par Winpoks le 16-02-2013 à 15:32:08
n°2176049
bistouille
Posté le 16-02-2013 à 16:33:00  profilanswer
 

Je connais pas trop, mais les ; sont pas obligatoires avec les requêtes préparées ?
 
Je pense que c'est ça ton problème, ajoute des ; à chacune de tes requêtes.

n°2176060
Winpoks
Posté le 16-02-2013 à 17:11:49  profilanswer
 

Elles y sont ou alors je ne vois pas ou tu dis d'en mettre d'autres.

n°2176063
bistouille
Posté le 16-02-2013 à 17:27:20  profilanswer
 

Tu en as mis pour le php oui, mais pas dans ton sql pour valider tes requêtes.
 
Donc :
 

Code :
  1. $bdd->prepare('SELECT * FROM ps_product WHERE reference = :refpro;');


 
Idem pour toutes tes autres requêtes.
 

n°2176066
Winpoks
Posté le 16-02-2013 à 17:35:44  profilanswer
 

Même avec les ?

mood
Publicité
Posté le 16-02-2013 à 17:35:44  profilanswer
 

n°2176067
bistouille
Posté le 16-02-2013 à 17:38:26  profilanswer
 

Oui  :D  

n°2176068
Winpoks
Posté le 16-02-2013 à 18:01:13  profilanswer
 

Ça donne une requête bizarre avec la même erreur. :D
 

Code :
  1. $creproreq = "INSERT INTO ps_product(reference, price, wholesale_price) VALUES(?;, ?;, ?;) WHERE NOT EXISTS (SELECT id_product FROM ps_product WHERE reference = ?;";
  2.  $crepro=$bdd->prepare($creproreq);
  3.  $crepro->execute(array($ligne[17], $ligne[5], $ligne[14], $ligne[17])); //ligne 41


 

Code :
  1. Fatal error: Uncaught exception 'PDOException' with message '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 ';, '95';, '53';) WHERE NOT EXISTS (SELECT id_product FROM ps_product WHERE re' at line 1' in C:\wamp\www\mag\web_product4.php on line 41

n°2176070
bistouille
Posté le 16-02-2013 à 18:17:48  profilanswer
 

Ah mais non, faut pas en mettre au milieu de ta requête  :o  
 
Le ; sert à valider une requête, tout comme le ; sert à valider une instruction en php.
 
il doit évidemment se situer uniquement en fin de requête, tout comme tu le ferais avec mysql utilisé dans une console dos ou un terminal linux pour valider tes instructions.

n°2176071
Winpoks
Posté le 16-02-2013 à 18:28:00  profilanswer
 

Han.  [:eraser17]

 

Donc il y a toujours une erreur avec "tronquage" de la dernière variable mais elle est bien fermée par des apostrophes cette fois-ci.  :jap:

 
Code :
  1. $creproreq = "INSERT INTO ps_product(reference, price, wholesale_price) VALUES(?, ?, ?) WHERE NOT EXISTS (SELECT id_product FROM ps_product WHERE reference = ?);";
  2.  $crepro=$bdd->prepare($creproreq);
  3.  $crepro->execute(array($ligne[2], $ligne[5], $ligne[14], $ligne[17])); //ligne 41
 


Code :
  1. Fatal error: Uncaught exception 'PDOException' with message '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 'WHERE NOT EXISTS (SELECT id_product FROM ps_product WHERE reference = 'CHAUSS' at line 1' in C:\wamp\www\mag\web_product4.php on line 41
 


J'ai essayé en mettant $ligne[2] à la place de $ligne[17] pour voir qui dans le fichier à la même valeur cette fois ci histoire de voir. Mais ça ne change rien.


Message édité par Winpoks le 16-02-2013 à 18:29:50
n°2176075
bistouille
Posté le 16-02-2013 à 18:43:23  profilanswer
 

Normal, NOT EXISTS s'utilise dans les requêtes select pas dans les insert.
 

n°2176076
bistouille
Posté le 16-02-2013 à 18:49:43  profilanswer
 

Si c'est pour garantir une contrainte d'unicité met ta colonne reference en primary key ou en unique, du moins si ta table est en innodb, sinon, bah faut que tu fasses une requête count au préalable pour tester si ta valeur est déjà dans ta table.

n°2176083
Winpoks
Posté le 16-02-2013 à 21:09:38  profilanswer
 

Oui c'est pour ça. En cherchant avec une clé unique ça marche et ça simplifie bien la chose.  
 

Code :
  1. $creproreq = "INSERT IGNORE INTO ps_product(reference, price, wholesale_price) VALUES(?, ?, ?);";
  2.  $crepro=$bdd->prepare($creproreq);
  3.  $crepro->execute(array($ligne[1], $ligne[5], $ligne[14])); //ligne 41


 
 
Merci.  :jap:

n°2178741
Winpoks
Posté le 05-03-2013 à 01:28:44  profilanswer
 

Bonjour,
 
Je reviens ici pour une question concernant cette erreur encore. Pas de problème ici. Enfin je voudrai juste comprendre pourquoi elle apparait dans ce cas là.  
 
Je tape la requête sous notepad++. J'enregistre, je test sur le serveur et l'erreur apparait. Je vérifie sous phpmyadmin là requête (sait-on jamais) donc je colle la requête. Et il me sort la même erreur. Hors dans la requête il n'y a pas d'erreur (j'ai quand même regardé 3 bonnes minutes en appuyant de manière frénétique sur exécuter  [:tinostar] ). Je la retape manuellement dans phpmyadmin et l’exécute. Ça passe, pourtant c'était exactement la même requête rien n'avait changé. Je refais la même chose sous notepad++ et ça marche à son tour.  
 
Savez vous d'où peut provenir ce genre d'erreur ?  
 
 
Merci à vous !  :jap:

n°2198946
Profil sup​primé
Posté le 29-07-2013 à 01:03:54  answer
 

Ça arrive surtout aux routeux :o


Message édité par Profil supprimé le 29-07-2013 à 01:04:01

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  PDOException' with message 'SQLSTATE[42000]

 

Sujets relatifs
Envoyer plusieurs mails avec des conditions dans le message[Résolu] Formulaire PHP : problème de TRIM
[Ada] Multiple with clause.Comment changer mon message d'erreur ? :)
attach message au socket au moement de l'exécutionInnosetup message "ISPPBuiltins.iss file was not found"
Action lors de l'affichage d'un messageMessage erreur: function.opendir
Message d'erreur 
Plus de sujets relatifs à : PDOException' with message 'SQLSTATE[42000]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR