PDOException' with message 'SQLSTATE[42000]

PDOException' with message 'SQLSTATE[42000] - PHP - Programmation

Marsh Posté le 15-02-2013 à 13:46:20    

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:  
 

Reply

Marsh Posté le 15-02-2013 à 13:46:20   

Reply

Marsh Posté le 15-02-2013 à 17:28:34    

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

Reply

Marsh Posté le 15-02-2013 à 18:57:58    

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.

Reply

Marsh Posté le 15-02-2013 à 22:12:35    

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)
Reply

Marsh Posté le 16-02-2013 à 09:48:06    

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();

Reply

Marsh Posté le 16-02-2013 à 15:31:07    

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
Reply

Marsh Posté le 16-02-2013 à 16:33:00    

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.

Reply

Marsh Posté le 16-02-2013 à 17:11:49    

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

Reply

Marsh Posté le 16-02-2013 à 17:27:20    

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.
 

Reply

Marsh Posté le 16-02-2013 à 17:35:44    

Même avec les ?

Reply

Marsh Posté le 16-02-2013 à 17:35:44   

Reply

Marsh Posté le 16-02-2013 à 17:38:26    

Oui  :D  

Reply

Marsh Posté le 16-02-2013 à 18:01:13    

Ç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

Reply

Marsh Posté le 16-02-2013 à 18:17:48    

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.

Reply

Marsh Posté le 16-02-2013 à 18:28:00    

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
Reply

Marsh Posté le 16-02-2013 à 18:43:23    

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

Reply

Marsh Posté le 16-02-2013 à 18:49:43    

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.

Reply

Marsh Posté le 16-02-2013 à 21:09:38    

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:

Reply

Marsh Posté le 05-03-2013 à 01:28:44    

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:

Reply

Marsh Posté le 29-07-2013 à 01:03:54    

Ça arrive surtout aux routeux :o


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

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed