Probléme requete sql = unknow column

Probléme requete sql = unknow column - PHP - Programmation

Marsh Posté le 18-01-2007 à 21:40:13    

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:  

Reply

Marsh Posté le 18-01-2007 à 21:40:13   

Reply

Marsh Posté le 18-01-2007 à 22:36:29    

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."'";  

Reply

Marsh Posté le 18-01-2007 à 23:01:40    

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

Reply

Marsh Posté le 18-01-2007 à 23:39:47    

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
Reply

Marsh Posté le 18-01-2007 à 23:40:50    

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


Message édité par geforst le 19-01-2007 à 00:05:09
Reply

Marsh Posté le 19-01-2007 à 00:19:33    

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

Reply

Marsh Posté le 19-01-2007 à 01:19:37    

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
Reply

Marsh Posté le 19-01-2007 à 11:15:03    

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
Reply

Sujets relatifs:

Leave a Replay

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