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

  FORUM HardWare.fr
  Programmation
  PHP

  Probléme requete sql = unknow column

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probléme requete sql = unknow column

n°1504791
geforst
Posté le 18-01-2007 à 21:40:13  profilanswer
 

Bonjour à tous
 
j'ai un probléme bizarre pour lancer la requete sql , un message erreur apparait 'unknwon column 'TD1001' in where clause'.
la requete était $requete22 = "SELECT * FROM ".$bien." WHERE id = '".$idl."'";   (ou idl = TD1001).
j'etais essayer ce code avec d 'autre fichier php et cela marche  :pt1cable:  sauf le code ci-dessous .
 
 

Code :
  1. <?
  2. $lien = mysql_connect ($hote, $utilisateur, $motdepasse);
  3. mysql_select_db($nombase,$lien);
  4. $idl = $_GET['id'];
  5. $bien = $_GET['bien'];
  6. $requete = "DELETE FROM $bien WHERE id = $idl";
  7. $rep="../images/".$bien."/";
  8. $rep2="../images/video/";
  9. $requete22 = "SELECT * FROM ".$bien." WHERE id = '".$idl."'";
  10. //echo $requete22.'<br>';
  11. //$resu = mysql_query($requete2, $lien) or die(mysql_error());
  12. $resu22 = mysql_db_query ($nombase, $requete22, $lien) or die(mysql_error());
  13. $image = mysql_fetch_array($resu22);
  14. $images = explode(";", $image['image']);
  15. $video = $image['cuis_equip'];
  16. $i=0;
  17. while( $photo = $images[$i] ){
  18. if(file_exists($rep.$photo) && ($photo != 'photo_indisp.jpg')) unlink('../images/'.$bien.'/'.$photo);
  19. $i++;
  20. }
  21. while( $vid = $video ){
  22. if(file_exists($rep2.$vid)) unlink('../images/video/'.$vid);
  23. }
  24. if (mysql_query($requete, $lien) or die(mysql_error()))
  25. {
  26. echo "<script language=\"Javascript\">";
  27. $message="Votre annonce a bien été supprimé";
  28. echo "window.alert(\" ".$message."\" );
  29. </script>";
  30. }
  31. else
  32. {
  33. echo "<script language=\"Javascript\">";
  34. $message="Votre annonce n'a pas pu etre supprimé";
  35. echo "window.alert(\" ".$message."\" );
  36. </script>";
  37. }
  38. ?>


 
j'ai déja essayer sans guillement comme ceci $requete22 = " SELECT * FROM $bien WHERE id = $idl "; mais même résultat .
ce que je comprend pas pourquoi le messaeg disait que 'TD1001' est comme colonne alors que c'est 'id'.
 
Merci :hello:  

mood
Publicité
Posté le 18-01-2007 à 21:40:13  profilanswer
 

n°1504806
olivthill
Posté le 18-01-2007 à 22:36:29  profilanswer
 

Je me souviens avoir vu des messages concernant des problèmes similaires. A chaque fois, le programmeur avait eu l'étrange et mauvaise idée de nommer une colonne "id" au lieu de "toto_id", or il semble que "id" soit plus ou moins un mot réservé pour MySQL. Je crois me souvenir que la requête passait en préfixant le champ "id" par le nom de la table ou un alias de la table. En l'occurrence, il faudrait essayer :

$requete22 = "SELECT * FROM ".$bien." t1 WHERE t1.id = '".$idl."'";  

n°1504812
leflos5
On est ou on est pas :)
Posté le 18-01-2007 à 23:01:40  profilanswer
 

Ou simplement que si le type de la colonne id est un numérique, il ne faut pas de guillemets :spamafote:

n°1504832
geforst
Posté le 18-01-2007 à 23:39:47  profilanswer
 

marche non plus
 c est incroyable
 
SELECT * FROM location t1 WHERE t1.id = 'RECP1003'
Unknown column 'RECP1003' in 'where clause'


Message édité par geforst le 18-01-2007 à 23:43:53
n°1504833
geforst
Posté le 18-01-2007 à 23:40:50  profilanswer
 

id est de type varchar(255) et clé primaire


Message édité par geforst le 19-01-2007 à 00:05:09
n°1504848
geforst
Posté le 19-01-2007 à 00:19:33  profilanswer
 

j'ai trouvé
ca ne venait pas de select mais de delete ou il faut mettre le guillemet.
c'est tout béte. je suis ridiculiser
excusez moi les gars et merci pour vos réponses

n°1504864
sielfried
Posté le 19-01-2007 à 01:19:37  profilanswer
 

olivthill a écrit :

Je me souviens avoir vu des messages concernant des problèmes similaires. A chaque fois, le programmeur avait eu l'étrange et mauvaise idée de nommer une colonne "id" au lieu de "toto_id"


 
"id" n'est pas un mot réservé de MySQL d'après http://dev.mysql.com/doc/refman/5.0/en/reserved.
 
(Je l'utilise tout le temps comme identifiant numérique, jamais eu de soucis.)


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
n°1504975
FlorentG
Unité de Masse
Posté le 19-01-2007 à 11:15:03  profilanswer
 

geforst a écrit :

Code :
  1. <?
  2.  
  3. $lien = mysql_connect ($hote, $utilisateur, $motdepasse);
  4. mysql_select_db($nombase,$lien);
  5. $idl = $_GET['id'];
  6. $bien = $_GET['bien'];
  7. $requete = "DELETE FROM $bien WHERE id = $idl";
  8.  
  9. ...
  10.  
  11.  
  12. if (mysql_query($requete, $lien) or die(mysql_error()))
  13. {
  14.  echo "<script language=\"Javascript\">";
  15.    $message="Votre annonce a bien été supprimé";
  16.    echo "window.alert(\" ".$message."\" );
  17.    </script>";
  18. } else {
  19.  echo "<script language=\"Javascript\">";
  20.    $message="Votre annonce n'a pas pu etre supprimé";
  21.    echo "window.alert(\" ".$message."\" );
  22.    </script>";
  23. }


 

Dzzzzzzzzzt § ALERTE CODE ROUGE §§§ ALERTE CODE ROUGE §§§§

 

FAILLE DE SECURITE, VIOLATION DU PROTOCOLE HTTP, ET NON-RESPECT DE L'ACCESSIBILITE DETECTES §§§§

 

ALERTE §§§

  

Alors moult erreurs ici.

  • Violation du protocole HTTP :


Tu utilise les $_GET pour récupérer l'annonce à supprimer. Ca veut dire qu'il existe une URL qui cause un effet de bord. Ce qui est extrêmement dangereux. Le protocole HTTP/1.1 veut qu'une requête modifiant l'état d'une application (ajout, modification, suppression, etc.) doit être transmise via la méthode POST, et non GET comme tu l'as fait. Une URL, appellée en GET, doit pouvoir être appelée autant de fois qu'on veut, rien ne doit changer.

 

Ce genre de truc a déjà causé pas mal de dégats : genre avec le premier Google Accelerator. Il préchargeait tous les liens d'une page, histoire d'accélerer le surf. Si un lien cause la suppression d'un élément, alors le fait de tout-précharger va causer la tout-suppression, ce qui est évidemment catastrophique.

 

Il faut donc convertir tous les liens de suppression en formulaires, du genre :

Code :
  1. <form action="pouet.php" method="post">
  2.  <span>
  3.    <input type="hidden" name="id" value="xxx" />
  4.    <input type="hidden" name="bien" value="pouet" />
  5.    <input type="submit" value="Supprimer" />
  6.  </span>
  7. </form>


Si confirmation de suppression il y a, alors normalement le mieux est de mettre une vraie page de suppression, qui ajouterait en plus un token de confirmation, qui serait vérifié côté serveur lors du réenvoi (via session par exemple c'est pas mal). Parce que là comme ça ma solution est toujours sensible aux CSRF (mais déjà moins évidente car basée sur POST...)

 


  • Faille de sécurité :


Tu mets dans ta requête DELETE directement ce qu'il y a dans la requête... Alors combine le problème n°1 avec celui-là : Je t'envoi par mail un truc genre "Bonjour, y'a un bug là : http://pouet.com/tagada.php?action [...] =pouet.... Là du coup la requête SQL va ressembler à :

Code :
  1. DELETE FROM pouet WHERE id=1 OR 1=1


*boom*, tout sera supprimé
Et comme tu met en plus la table directement à partir de la requête, je peux en mettre une autre et supprimer totalement autre chose...
La solution est d'utiliser mysql_real_escape_string et d'autres trucs encore pour protéger. Déjà pour la table prise de la requête, faut une liste des tables authorisées quelque part, sinon *boom*.

Code :
  1. if(is_numeric($id)) {
  2.  mysql_query('DELETE FROM `' . verifTable($bien) . '` WHERE id = ' . mysql_real_escape_string($id))
  3. } else {
  4.  // pouet, $id doit être un nombre
  5. }
 
  • Non-respect de l'accessibilité :


Il ne faut resposer sur du JS pour les messages, mieux vaut mettre une page de confirmation ou rien du tout. Il y a un autre problème avec la confirmation :

 
  • Violation du protocole HTTP n°2 :


Après une requête POST (vu que tu aura changé ;) ), il faut rediriger vers le résultat via un header 303 :

Code :
  1. $page = '';
  2. if (mysql_query($requete, $lien) or die(mysql_error()))
  3.  $page = 'deleteok.html';
  4. } else {
  5.  $page = 'deletepasok.html';
  6. }
  7. header('Location: http://pouet.php/' . $page, true, 303);
  8. exit();


Et le tour est joué [:dawak]


Message édité par FlorentG le 19-01-2007 à 11:15:49

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

  Probléme requete sql = unknow column

 

Sujets relatifs
Problème pour fixer l'image de fondEncore un petit probleme
un problème dans une équation c++[Resolu] Probleme redirection .htaccess
Problème de @@DateFirst sur 40aine de serveurs[REGLE] Problème d'include
fonction mkdir, choix du dossier destination ?Problème .GBK
Probleme d'association de requete Count et Select 
Plus de sujets relatifs à : Probléme requete sql = unknow column


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