[RESOLU] Problème de Syntaxe

Petit nouveau ! | 9 Messages

13 août 2012, 19:21

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

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

13 août 2012, 19:59

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 />';
}
?>
@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 2278 Messages

13 août 2012, 20:01

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 :)
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

13 août 2012, 20:09

heu j'ai pas tous suivis y a un doublon qui traine ? :oops:
Il en faut peu pour être heureux ......

Petit nouveau ! | 9 Messages

13 août 2012, 20:55

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.

Petit nouveau ! | 9 Messages

13 août 2012, 21:00

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

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

14 août 2012, 00:47

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


@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 9 Messages

14 août 2012, 01:24

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

Petit nouveau ! | 9 Messages

14 août 2012, 02:39

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

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

14 août 2012, 17:16

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


@+
Il en faut peu pour être heureux ......