Problème : You have an error in your SQL syntax...

Eléphanteau du PHP | 11 Messages

17 août 2010, 11:26

Afin d'apprendre le PHP (essayer en tout cas) je cherche à faire un site en local (sous wampserver 2) pour ma collection de DVD. J'ai cherché donc des site présentant des page pour gérer la base mysql de mes DVD (ajouter - modifier - supprimer - rechercher un DVD).

MERCI beaucoup de m'aider

Bonjour,

J'ai un problème avec une page #-o "modification2.php". Je suis un peu plus que débutant.
J'ai le message : 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 ''dvd' WHERE id_dvd =' at line 1

Cette ligne : 'dvd' WHERE id_dvd =' at line 1 est sur la page modification2.php. Je ne voix pas ce quelle à et où elle peut agir pour créer ce message.

Infos base de données :
- base mysql : videotheque
- table : dvd

-champs :

Code : Tout sélectionner

CREATE TABLE IF NOT EXISTS `dvd` ( `id` int(3) NOT NULL AUTO_INCREMENT COMMENT 'Identifiant du DVD', `rub` enum('Documentaire','Enfant','Fantastique','Film s_musicaux','Humour','Sagas','Spectacles','Tous_ publics','Westerns''Autres') NOT NULL, `nom` varchar(255) NOT NULL, `sor` year(4) NOT NULL COMMENT 'Année de sortie du film', `com` longtext NOT NULL, `aff` varchar(255) NOT NULL COMMENT 'Lien vers l''affiche de la vidéo', PRIMARY KEY (`nom`), UNIQUE KEY `id` (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Ma vidéothèque 2010 ' AUTO_INCREMENT=15 ;
Fichier "header.php"

Code : Tout sélectionner

<?php $host = "localhost"; $name = "root"; $pass = ""; $base = "videotheque"; $cnx = mysql_connect($host, $name, $pass) or die ('Erreur : '.mysql_error() ); $cnxbase = mysql_select_db($base) or die ('Erreur :'.mysql_error()); $table = "dvd"; $champs = "id,rub,nom,sor,com,aff"; ?>
_________________________________________

Voici mes pages :

_________________________________________

Modification1.php

Code : Tout sélectionner

<?php require "header.php" ?> <?php //requête SQL: $sql = "SELECT * FROM 'dvd' ORDER BY 'nom' " ; //exécution de la requête: $requete = mysql_query($sql, $cnx ) or die( mysql_error() ) ; //affichage des données: while ($result = mysql_fetch_object($requete)) { echo (" ".$result->id." ".$result->rub." ".$result->nom." ".$result->sor." ".$result->com." <a href=\"modification2.php?iddvd=".@$result->id_dv d."\">Modifier</a><br />\n ") ; } ?> <?php require "footer.php" ?>
________________________________________

Modification2.php

Code : Tout sélectionner

<?php require "header.php" ?> <?php //récupération de la variable d'URL qui va nous permettre de savoir quel enregistrement modifier $id = $_GET["iddvd"] ; //requête SQL $sql = "SELECT * FROM 'dvd' WHERE id_dvd =".$id ; //exécution de la requête $requete = mysql_query($sql, $cnx) or die( mysql_error() ) ; //affichage des données if( $result == mysql_fetch_object( $requete ) ) { ?> <form name="insertion" action="modification3.php" method="POST"> <table> <tr><td><input type="hidden" name="id" value="<?php echo($id) ;?>"></td></tr> <tr><td>Rubrique </td><td><input type="text" name="rub" value="<?php echo($result->rub) ;?>"></td></tr> <tr><td>Nom </td><td><input type="text" name="nom" value="<?php echo($result->nom) ;?>"></td></tr> <tr><td>Sortie </td><td><input type="text" name="sor" value="<?php echo($result->sor) ;?>"></td></tr> <tr><td>Affiche </td><td><input type="text" name="aff" value="<?php echo($result->aff) ;?>"></td></tr> <tr><td colspan="2"><input type="submit" value="modifier"></td></tr> </table> </form> <?php }//fin if ?> <?php require "footer.php" ?>
_____________________________________________

modification3.php

Code : Tout sélectionner

<?php require "header.php" ?> <?php //récupération des valeurs des champs: //rub : $rub = $_POST["rub"] ; //nom : $nom = $_POST["nom"] ; //sortie : $sor = $_POST["sor"] ; //Commentaie: $com = $_POST["com"] ; //récupération de l'identifiant de la personne: $id = $_POST["id"] ; //création de la requête SQL: $sql = "UPDATE dvd SET rub = '$rub', nom = '$nom', sor = '$sor', com = '$com', WHERE id_dvd = '$id' " ; //exécution de la requête SQL: $requete = mysql_query($sql, $cnx) or die( mysql_error() ) ; //affichage des résultats, pour savoir si la modification a marchée: if($requete) { echo("La modification à été correctement effectuée") ; } else { echo("La modification à échouée") ; } ?> <?php require "footer.php" ?>
________________________________________

A l'aide SVP, merci...
Patoche

Mammouth du PHP | 686 Messages

17 août 2010, 11:29

$sql = "SELECT * FROM 'dvd' WHERE id_dvd =".$id ;
Pas de guillement dans le nom de la table et je comprent pas pourquoi du concatène avec des guillements doubles, il n'y en pas pas besoin

essaie ceci
$sql = "SELECT * FROM dvd WHERE id_dvd ='$id' ";

ViPHP
AB
ViPHP | 5818 Messages

17 août 2010, 15:47

Ou si tu concatènes il faudrait écrire ceci :
$sql = "SELECT * FROM table WHERE champ ='".$var."'";

Eléphanteau du PHP | 11 Messages

17 août 2010, 18:07

Dans modification2.php

Avec :

Code : Tout sélectionner

$sql = "SELECT * FROM dvd WHERE id_dvd ='$id' ";
J'obtiens l'erreur :

Code : Tout sélectionner

Unknown column 'id_dvd' in 'where clause'
_________________________________________________________
Avec :

Code : Tout sélectionner

$sql = "SELECT * FROM dvd WHERE id_dvd ='".$id."'";
J'obtiens l'erreur :

Code : Tout sélectionner

Unknown column 'id_dvd' in 'where clause'
_________________________________________________________

Je ne sais pas si l'on peut dire qu'il y a du mieux, mais on a plus la même erreur ?
On avance...

Merci
Patoche

ViPHP
ViPHP | 5462 Messages

17 août 2010, 18:16

montre le schéma de ta table dvd ?

EDIT : `id` int(3) ? c'est id pas id_dvd ...
Modifié en dernier par stealth35 le 17 août 2010, 18:24, modifié 1 fois.

ViPHP
xTG
ViPHP | 7331 Messages

17 août 2010, 18:19

Un petit billet qui ne t'aidera pas à résoudre ton problème mais en rapport avec quelque chose qui me choque toujours dans les requêtes. ^^

Article : La guerre des étoiles

Eléphanteau du PHP | 11 Messages

17 août 2010, 18:51

La voici...

CREATE TABLE IF NOT EXISTS `dvd` (
`id` mediumint(9) NOT NULL AUTO_INCREMENT COMMENT 'Identifiant du DVD',
`rub` text NOT NULL,
`nom` text NOT NULL,
`sor` year(4) NOT NULL COMMENT 'Année de sortie du film',
`com` longtext NOT NULL,
`aff` text NOT NULL COMMENT 'Lien vers l''affiche de la vidéo',
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Ma vidéothèque 2010 ';

Merci

Je ne sais pas moi nom plus d'où il sort ce id_dvd...? J'ai suivi le tuto du site : http://ressources.mediabox.fr/tutoriaux ... -donne-php. C'est vrai que je n'en ai pas trouvé d'autre ? Je l'ai adapté à ma base, et j'essaie de comprendre le code... J'étais plus alaise en HTML... Il faut vivre avec son temps et pour faire ce que je veux il me faut du PHP. Le HTML a ses limites ! Et puis c'est sympa de coder, j'aime bien !

Donc j'en reviens à mon problème... Je ne sais vraiment pas quoi faire et je voudrais te remercier pour tes messages... On avance, on avance...

______________

C'est vrai que l'article est intéressant. C'est un peu par fainéantise, j'avoue, que je tape le *. Mais aussi parce-que je ne sais pas si je dois mettre tous les champs ou pas ?
Modifié en dernier par biboupat le 17 août 2010, 19:03, modifié 1 fois.
Patoche

ViPHP
AB
ViPHP | 5818 Messages

17 août 2010, 19:00

Ben oui tu n' as pas de colonne id_div donc le message d'erreur te répond que cette colonne n'existe pas.

Vu que ta colonne s'appelle "id" essaies
$sql = "SELECT * FROM dvd WHERE id ='".$id."'";

Eléphanteau du PHP | 11 Messages

17 août 2010, 19:05

Là, j'ai une page blanche !
Rien dans le code source non plus (entre <body> et </body>
Patoche

ViPHP
AB
ViPHP | 5818 Messages

17 août 2010, 19:19

Ben c'est peut-être que la variable $id que tu met dans ta requête ne correspond à aucun id existant dans ta table.
En tous cas si page blanche => pas d'erreur dans la requête :wink:

Eléphanteau du PHP | 11 Messages

17 août 2010, 20:17

J'ai pris le tore par les cornes !
- J'ai changé le champ " id" par " id_dvd "
- J'ai changé quelques " id " en " id_dvd" dans le code
- j'ai remis les bonne terminaisons de mes WHERE (par rapports au tuto original

Maintenant :
- Affichage du tableau de mes dvd = OK
- Ajout d'un DVD = OK
- Modification d'une fiche d'un DVD :
- - - Modification1 = ok
- - - Modification2 = ok (enfin)
Le problème se pose maintenant dur le fichier " modification3 "

Erreur :
 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 id_dvd = ''' at line 1
Au niveau encore du " WHERE "

Je te repasse les fichiers "modification 1, 2 et 3" avec mes modif de " id " en " id_dvd".

_________________________________________________________
Modification1.php

Code : Tout sélectionner

<?php require "header.php" ?> <?php require "var.inc" ?> <?php // on se connecte $cnx = mysql_connect($host, $name, $pass) OR die( mysql_error() ); // on selectionne la base de données $cnxbase = mysql_select_db($base) OR die( mysql_error() ); // requête SQL: $sql = "SELECT * FROM dvd ORDER BY nom " ; // exécution de la requête: $requete = mysql_query( $sql, $cnx ) OR die( mysql_error() ) ; // affichage des données: while ($result = mysql_fetch_object($requete)) { echo (" <table><tr> <td class'modif'>".$result->rub."</td> <td class='modif'> ".$result->nom."</td> <td class='modif'><a href=\"modification2.php?iddvd=".@$result->id_dvd."\">Modifier</a></td>\n </tr></table> ") ; } ?> <?php require "footer.php" ?>
_________________________________________________________

Modification2.php

Code : Tout sélectionner

<?php require "header.php" ?> <?php require "var.inc" ?> <?php // on se connecte $cnx = mysql_connect($host, $name, $pass) OR die( mysql_error() ); // on selectionne la base de données $cnxbase = mysql_select_db($base) OR die( mysql_error() ); //récupération de la variable d'URL qui va nous permettre de savoir quel enregistrement modifier @$id = $_GET["iddvd"] ; //requête SQL $sql = "SELECT * FROM dvd WHERE id_dvd = ".$id ; //exécution de la requête $requete = mysql_query($sql, $cnx) OR die( mysql_error() ) ; //affichage des données if ($result = mysql_fetch_object($requete)) { ?> <form name="insertion" action="modification3.php" method="POST"> <table> <tr><td>Rubrique </td><td><input type="text" name="rub" value="<?php echo($result->rub) ;?>"></td></tr> <tr><td>Nom </td><td><input type="text" name="nom" value="<?php echo($result->nom) ;?>"></td></tr> <tr><td>Sortie </td><td><input type="text" name="sor" value="<?php echo($result->sor) ;?>"></td></tr> <tr><td>Commentaire </td><td><input type="text" name="com" value="<?php echo($result->com) ;?>"></td></tr> <tr><td>Affiche </td><td><input type="text" name="aff" value="<?php echo($result->aff) ;?>"></td></tr> <tr><td colspan="2"><input type="submit" value="modifier"></td></tr> </table> </form> <?php }//fin if ?> <?php require "footer.php" ?>
_________________________________________________________

modification3.php

Code : Tout sélectionner

<?php require "var.inc" ?> <?php // on se connecte $cnx = mysql_connect($host, $name, $pass) OR die( mysql_error() ); // on selectionne la base de données $cnxbase = mysql_select_db($base) OR die( mysql_error() ); //récupération des valeurs des champs: //id : $id = @$_POST["id_dvd"] ; //rub : $rub = $_POST["rub"] ; //nom : $nom = $_POST["nom"] ; //sortie : $sor = $_POST["sor"] ; //Commentaie: $com = $_POST["com"] ; //Affiche: $aff = $_POST["aff"] ; //récupération de l'identifiant du DVD: $id = @$_POST["id_dvd"] ; //requête SQL: $sql = "UPDATE dvd SET id_dvd = '$id', rub = '$rub', nom = '$nom', sor = '$sor', com = '$com', aff = '$aff', WHERE id_dvd = ".$id ; //exécution de la requête SQL: $requete = mysql_query($sql, $cnx) OR die( mysql_error() ) ; //affichage des résultats, pour savoir si la modification a marchée: if($requete) { echo("La modification à été cORrectement effectuée") ; } else { echo("La modification à échouée") ; } ?> <?php require "footer.php" ?>
________________________________________________________________

Super merci....
Patoche

ViPHP
AB
ViPHP | 5818 Messages

17 août 2010, 21:21

C'est une bonne habitude de concaténer les variables dans la requête car cela permet de mieux voir les erreurs, et puis aussi tu devrais normalement utiliser mysql_real_escape_string pour protéger tes variables dans toutes tes requêtes. Essaies :
 $sql = "UPDATE dvd SET 
id_dvd = '".mysql_real_escape_string($id)."', 
rub = '".mysql_real_escape_string($rub)."', 
nom = '".mysql_real_escape_string($nom)."', 
sor = '".mysql_real_escape_string($sor)."', 
com = '".mysql_real_escape_string($com)."', 
aff = '".mysql_real_escape_string($aff)."' 
WHERE id_dvd = '".mysql_real_escape_string($id)."'" ;
A noter qu'il ne faut jamais de virgule juste avant le WHERE
Modifié en dernier par AB le 18 août 2010, 04:15, modifié 1 fois.

Eléphanteau du PHP | 11 Messages

17 août 2010, 23:14

J'ai fais la modif dans modification3.php. Tout ce passe bien mise à part que la modification ne s'effectue pas sur la base. Pourtant je n'ai pas de message d'errreur. J'ai même " La modification à été correctement effectuée "

Code : Tout sélectionner

<?php require "header.php" ?> <?php require "var.inc" ?> <?php require "menu.php" ?> <?php // on se connecte $cnx = mysql_connect($host, $name, $pass) OR die( mysql_error() ); // on selectionne la base de données $cnxbase = mysql_select_db($base) OR die( mysql_error() ); //récupération des valeurs des champs: //id : $id = @$_POST["id_dvd"] ; //rub : $rub = $_POST["rub"] ; //nom : $nom = $_POST["nom"] ; //sortie : $sor = $_POST["sor"] ; //Commentaie: $com = $_POST["com"] ; //Affiche: $aff = $_POST["aff"] ; //récupération de l'identifiant du DVD: $id = @$_POST["id_dvd"] ; //création de la requête SQL: //$sql = "UPDATE dvd SET id_dvd = '$id', rub = '$rub', nom = '$nom', sor = '$sor', com = '$com', aff = '$aff', WHERE id_dvd = ".$id ; $sql = "UPDATE dvd SET id_dvd = '".mysql_real_escape_string($id)."', rub = '".mysql_real_escape_string($rub)."', nom = '".mysql_real_escape_string($nom)."', sor = '".mysql_real_escape_string($sor)."', com = '".mysql_real_escape_string($com)."', aff = '".mysql_real_escape_string($aff)."' WHERE id_dvd = '".mysql_real_escape_string($id)."'" ; //exécution de la requête SQL: $requete = mysql_query($sql, $cnx) OR die( mysql_error() ) ; //affichage des résultats, pour savoir si la modification a marchée: if($requete) { echo("La modification à été correctement effectuée ") ; } else { echo("La modification à échouée") ; } ?> <?php require "footer.php" ?>
PS :
J'ai fais une modif dans ton code, il y avait une inversion entre " apostrophe " et " guillemet " juste après id_dvd : WHERE id_dvd = "'
sinon j'ai une erreur : Parse error

C'est presque ça...

Peut tu me passer le code sans les : mysql_real_escape_string. Car ses pages sont destinées à être utilisées depuis un disque dur externe avec un serveurs portable comme wampMSS ou autre. Elles n'irons pas sur internet.

merci
Patoche

ViPHP
AB
ViPHP | 5818 Messages

18 août 2010, 04:30

Bah tu vois quand on écrit clairement, c'est plus facile pour trouver les erreurs :wink:
J'ai édité mon code pour corriger.

Sinon, non :non: , tu n'as pas à enlever mysql_real_escape_string car ce n'est pas uniquement de sécurité qu'il s'agit mais aussi pour ajouter des '\' devant des ' etc. et donc pour éviter que ta chaine soit rompue. Si tu n'utilises pas cette fonction tu auras rapidement des erreurs quand tu rentreras du texte, c'est certain. C'est pour cette raison que tu devrais l'utiliser dans toutes tes requêtes (insertion, update...) sans exceptions. C'est ce que conseille le manuel php. Regardes la doc de la fonction pour t'en convaincre :
Cette fonction doit toujours (avec quelques exceptions) être utilisée pour protéger vos données avant d'envoyer la requête à MySQL.
Et c'est pareil avec mysqli, (pdo ayant un autre système).

Cela dit c'est certain que si tu es sûr de rentrer un nombre comme variable, tu peux t'en passer.

Mammouth du PHP | 686 Messages

18 août 2010, 09:30

ET pour compléter, lorsque tu récupère tes données de ta base, utilise stripslashes()