Page 1 sur 1

Problème de Syntaxe

Posté : 13 août 2012, 19:21
par fuji60
Bonjour a tous,
Ca fait depuis un moment que PHP m'affiche plusieurs erreurs sur une de mes syntaxes. J'ai essayer de cherché le problème, mais je ne l'ai pas trouvé. J'ai également essayé de changer la syntaxe mais des erreurs apparaissent encore et encore. Voici une partie du code :

<?php
$ids = array_keys($_SESSION['panier']);
$produits = $DB -> query("SELECT * FROM produits WHERE id IN (".implode(",",$ids).")");
foreach($produits as $produit):
?>

Et voici l'erreur :

Warning: PDOStatement::execute(): 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 ')' at line 1 in C:\wamp\www\Test\db.class.php on line 35

Merci d'avance :)

Re: Problème de Syntaxe

Posté : 13 août 2012, 19:59
par moogli
salut,

en clair ta requete SQL est foireuse :)

utilise une variable pour la stocker et affiche la en cas d'erreur tu y verra plus clair.


la je penche pour un cas d'injection SQL ou équivalent.

Par exemple
<?php
$ids = array_keys($_SESSION['panier']);
$sql = "SELECT * FROM produits WHERE id IN (".implode(",",$ids).")";
try {
$produits = $DB -> query($sql);
//foreach($produits as $produit):
}
catch(Exception $e){
echo 'Erreur SQL : '.$e->getMessage().'<br />'.$sql;'<br />';
}
?>
@+

Re: Problème de Syntaxe

Posté : 13 août 2012, 20:01
par sirakawa
Une suggestion
Bonjour a tous,
<?php

var_dump($_SESSION);
$t_panier = $_SESSION['panier'];
var_dump($t_panier);
$ids = array_keys($t_panier);
var_dump($ids);
$implode_ids = implode(",",$ids);

//il doit y avoir une histoire de quotes. C'est pourquoi je préfère passer par des variables définies avant.
$requete = "SELECT * FROM produits WHERE id IN ($implode_ids)";
print "$requete";
$produits = $DB -> query($requete);
foreach($produits as $produit):
?>

Et voici l'erreur :

Warning: PDOStatement::execute(): 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 ')' at line 1 in C:\wamp\www\Test\db.class.php on line 35

Merci d'avance :)

Re: Problème de Syntaxe

Posté : 13 août 2012, 20:09
par moogli
heu j'ai pas tous suivis y a un doublon qui traine ? :oops:

Re: Problème de Syntaxe

Posté : 13 août 2012, 20:55
par fuji60
Merci pour vos réponses :D
J'essaye tout de suite ce que vous m'avez suggéré. Moogli, moi aussi au début je n'avais pas trop compris, mais je crois que Sirakawa a repris mon message en le modifiant pour que je puisse voir si le code est bon.

Re: Problème de Syntaxe

Posté : 13 août 2012, 21:00
par fuji60
Il semble que le problème vienne d'une autre page, au niveau des requêtes :
En fait j'était sur une page appelé panier.php, et cette page affiche une erreur venant d'une page appelé db.class.php.
L'erreur vient d'après php de la :

public function query($sql, $data = array())
{
$req = $this -> db -> prepare($sql);
$req -> execute($data);
return $req->fetchAll(PDO::FETCH_OBJ);
}

Re: Problème de Syntaxe

Posté : 14 août 2012, 00:47
par moogli
non la requete viens du serveur MySQL !

Oui c'est le fichier db à la ligne 35 qui lève l'exception la base vient de mysql.

je comprend mieux le message de sirakawa, (problème avec les quotes qui rendent la chose peux lisible ^^).

il faut que tu affiche la requete SQL pour voir à quoi elle resemble.

le message est clair
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 ')'
the right syntax to use near ')' => la parenthèse fermante n'est pas à sa place et sans la requete il est impossible de savoir pourquoi.

soit tu a une virgule en trop soit c'est un problème quote mais c'est impossible a deviner sans savoir ce que contient les variables utilisées pour la requete et surtout $ids (et la session aussi). d'où les multiples var_dump() indiqué par sirakawa (qui a pas mal modifier ton code en conséquence pour débugguer.

tu peux aussi utiliser un ide qui te permetteras de debugguer le script directement (zend studio / eclipse + pdt, netbeans etc, le tout couplé avec xdebug).


@+

Re: Problème de Syntaxe

Posté : 14 août 2012, 01:24
par fuji60
Merci a vous les pros !

En utilisant le code de Sirakawa,
voila ce que sa m'affiche :

array (size=1)
'panier' =>
array (size=0)
empty

array (size=0)
empty

array (size=0)
empty

SELECT * FROM produits WHERE id IN ()

Je vais essayé de suite votre solution pour débugger :)

Re: Problème de Syntaxe

Posté : 14 août 2012, 02:39
par fuji60
Alors la, merci à vous Moogli et Sirakawa !!
le code marche parfaitement. Il fallait également rajouté des ' '
Voici le code complet, ca pourrait aidé certaine personne :
var_dump($_SESSION);
$t_panier = $_SESSION['panier'];
var_dump($t_panier);
$ids = array_keys($t_panier);
var_dump($ids);
$implode_ids = implode(",",$ids);

//il doit y avoir une histoire de quotes. C'est pourquoi je préfère passer par des variables définies avant.
$requete = ("SELECT * FROM produits WHERE id IN ('$implode_ids')");
echo "$requete";
$produits = $DB -> query($requete);
foreach($produits as $produit):

Merci encore :D

Re: [RESOLU] Problème de Syntaxe

Posté : 14 août 2012, 17:16
par moogli
salut,

heu déja faut virer les var_dump() pour une utilisation normale.


par conter les ' dans le in ne me semble pas utile, surtout si tu n'en n'ajoute pas avec la fonction implode. (la tu va chercher une seul chaîne qui contient les id, séparé d'une virgule c'est pas la même chose que de chercher parmi tous les id ;) )

ta requete SQL doit ressembler à sa une fois correcte :
SELECT * FROM produits WHERE id IN (1,2,3,4,5,6,7);
les chiffres ne sont qu'un exemple ;)


@+