Problème de script pour suppression de données

BFH
Eléphant du PHP | 214 Messages

03 juin 2005, 09:38

voici mon code de suppression de données
if(isset($_GET["ID_LI"]))
{
$Li=$_GET["ID_LI"];
}
	
$Lieu="SELECT lieu FROM lieu_intervention WHERE ID_LI='".$Li."' ";//choisit le nom du lieu a supprimer
$query="DELETE FROM lieu_intervention WHERE ID_LI='".$Li."' ";//supprime le lieu
$temp="SELECT ID_R FROM report WHERE RHost LIKE '".$Lieu."'";//devrait choisir tous les rapports dont le nom est similaire
$query2="DELETE FROM report WHERE RHost LIKE '".$Lieu."'";//devrait supprimer tout les rapports choisit
$query3="DELETE FROM item WHERE ReportID ='".$temp."' ";//devrait supprimer toutes les infos liées aux rapports
	
mysql_query($Lieu)or die(mysql_error());
mysql_query($query)or die(mysql_error());
mysql_query($temp)or die(mysql_error());
mysql_query($query2)or die(mysql_error());
mysql_query($query3)or die(mysql_error());
Bien sûr ça ne fonctionne pas ! l'erreur retournée est :

Code : Tout sélectionner

Erreur de syntaxe près de 'SELECT lieu FROM lieu_intervention WHERE ID_LI="206" ''' à la ligne 1
Perdu dans la matrice avec un guide michelin ](*,) #-o
Adorateur de Cyrano
Parti puis revenu...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

03 juin 2005, 09:43

1) si tu met un =, il ne faut pas mettre de '

Code : Tout sélectionner

$Lieu="SELECT lieu FROM lieu_intervention WHERE ID_LI=".$Li." ";//choisit le nom du lieu a supprimer
2) Ca ne sert à rien de faire un SELECT avant de faire un DELETE, la sélection dont tu parle se fait par la clause WHERE de ton DELETE. Tu peut donc remplacer ton code par :
if(isset($_GET["ID_LI"]))
{
  $Li=$_GET["ID_LI"];
}

$query="DELETE FROM lieu_intervention WHERE ID_LI=".$Li." ";//supprime le lieu
$query2="DELETE FROM report WHERE RHost LIKE '".$Lieu."'";//devrait supprimer tout les rapports choisit
$query3="DELETE FROM item WHERE ReportID =".$temp." ";//devrait supprimer toutes les infos liées aux rapports
    
mysql_query($query)or die(mysql_error());
mysql_query($query2)or die(mysql_error());
mysql_query($query3)or die(mysql_error());  
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 19672 Messages

03 juin 2005, 09:46

C'est parce que tu envoies un identifiant sous forme de chaine de caractère alors que le champ correspondant est de type numérique: enlève les apostrophes ou guillemets:
$Lieu="SELECT lieu FROM lieu_intervention WHERE ID_LI=".$Li;
En principe ça devrait marcher... :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

03 juin 2005, 10:06

L'erreur est logique dans la troisième requête qui est supposée récupérer le lieu à partir de la première.

Quand tu écris :
$Lieu="SELECT lieu FROM lieu_intervention WHERE ID_LI='".$Li."' ";//choisit le nom du lieu a supprimer 
 
tu veux récupérer le lieu que tu utilise dans la 3° requête :
$temp="SELECT ID_R FROM report WHERE RHost LIKE '".$Lieu."'";//devrait choisir tous les rapports dont ....
Mais puisque tu n'as pas exécuter la 1° avant de lancer la 3° requête, la clause WHERE de cette dernière se trouve concaténée avec le contenu de $Lieu qui est la 1° requête (ce qui donne en réalité une 3° requête écrite comme suit :
$temp="SELECT ID_R FROM report WHERE RHost LIKE 'SELECT lieu FROM lieu_intervention WHERE ID_LI='206'' et c'est ton erreur.

Même remarque pour la requête basée sur le paramètre $temp.

La Correction: Il faut exécuter les requêtes chainées.
$Lieu="SELECT lieu FROM lieu_intervention WHERE ID_LI='".$Li."' ";//choisit le nom du lieu a supprimer 
$res = mysql_query($Lieu)or die(mysql_error()); 
$Lieu = mysql_fetch_array($res);

$query2="DELETE FROM report WHERE RHost LIKE '".$Lieu[0]."'";//devrait supprimer tout les rapports choisit 
mysql_query($query2)or die(mysql_error()); 

$temp="SELECT ID_R FROM report WHERE RHost LIKE '".$Lieu[0]."'"; //devrait choisir tous les rapports dont le nom est similaire 
$res = mysql_query($temp)or die(mysql_error()); 
$temp= mysql_fetch_array($res);

$query3="DELETE FROM item WHERE ReportID ='".$temp[0]."' ";//devrait supprimer toutes les infos liées aux rapports 
mysql_query($query3)or die(mysql_error());

$query="DELETE FROM lieu_intervention WHERE ID_LI='".$Li."' ";//supprime le lieu 
mysql_query($query)or die(mysql_error()); 
 
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 19672 Messages

03 juin 2005, 10:14

Arf, je suis pas réveillé moi, effectivement sadeq a complètement raison :oops:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

03 juin 2005, 10:44

Carrément !!!!

J'ai zappé les conditions quand j'ai vu les apostrophes et j'ai pas cherché à voir plus loin :agenouille: bien joué sadeq
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

03 juin 2005, 10:55

Mes seigneurs c'est le matin que je suis bien réveillé. En fait BFH a l'habitude de laisser l'exécution de ses requête à la fin. Et c'est cette habitude qui a trahi maintenant.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

BFH
Eléphant du PHP | 214 Messages

03 juin 2005, 11:09

Merci beaucoup sadeq, j'ai repris ton code presque trait pour trait :
 $Lieu="SELECT lieu FROM lieu_intervention WHERE ID_LI='".$Li."' ";//choisit le nom du lieu a supprimer
$result1= mysql_query($Lieu)or die(mysql_error());
$row1= mysql_fetch_assoc($res);
	
$RHost=$row['lieu']
	
$query="DELETE FROM report WHERE RHost LIKE '".$RHost."'";//ici ça bug
mysql_query($query)or die(mysql_error());

$temp="SELECT ID_R FROM report WHERE RHost LIKE '".$RHost."'"; //choisit tous les rapports dont le nom est similaire
$result2= mysql_query($temp)or die(mysql_error());
$row2= mysql_fetch_array($result2);
	
$ID_R=$row['ID_R'];
	
$query3="DELETE FROM item WHERE ReportID ='".$ID_R."' ";//supprime toutes les infos liées aux rapports
mysql_query($query3)or die(mysql_error());

$query4="DELETE FROM lieu_intervention WHERE ID_LI='".$Li."' ";//supprime le lieu
mysql_query($query4)or die(mysql_error());
maintenant j'ai l'erreur:

Code : Tout sélectionner

Parse error: parse error in c:\program files\easyphp1-8\www\php\administration3.php on line 20
si je mets
$query="DELETE FROM report WHERE RHost LIKE '".$RHost."%'";
cela ne fonctionne pas non plus!
note: Si mon lieu s'appelle TEST les rapports qui correspondent s'appellent TEST, TEST_accueil, TEST_exemple
Perdu dans la matrice avec un guide michelin ](*,) #-o
Adorateur de Cyrano
Parti puis revenu...

Mammouth du PHP | 19672 Messages

03 juin 2005, 11:15

manque un ";" juste avant :
$RHost=$row['lieu'];
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

03 juin 2005, 11:17

à la ligne 20, t'as oublié un ;
Ajoute aussi un addslashes pour neutraliser les caractères spéciaix dans ta chaine $RHost ou autres.
Correction:
$RHost=$row['lieu'];
     
$query="DELETE FROM report WHERE RHost LIKE '%".addslashes($RHost)."%'";
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

BFH
Eléphant du PHP | 214 Messages

03 juin 2005, 11:54

J'ai encore un petit problème mais là je doit etre trop fatigué pour voir comment le resoudre. voila mon code :
$Lieu="SELECT lieu FROM lieu_intervention WHERE ID_LI='".$Li."' "; 
$result1= mysql_query($Lieu)or die(mysql_error());
$row1= mysql_fetch_assoc($result1);
		
$RHost=$row1['lieu'];
	
$temp="SELECT ID_R FROM report WHERE RHost LIKE '".addslashes($row1['lieu'])."%'"; 
$result2= mysql_query($temp)or die(mysql_error());
$row2= mysql_fetch_assoc($result2);
	
$ID_R=$row2['ID_R'];
	
$query="DELETE FROM report WHERE RHost LIKE '".addslashes($RHost)."%'"; 
mysql_query($query)or die(mysql_error());
	
$query3="DELETE FROM item WHERE ReportID ='".$ID_R."' "; // ici est mon problème
mysql_query($query3)or die(mysql_error());

$query4="DELETE FROM lieu_intervention WHERE ID_LI='".$Li."' "; 
mysql_query($query4)or die(mysql_error());
Avec $query3 je supprime qu'une catégorie d'item car je retourne qu'une seule valeur de $ID_R même si j'ai plusieurs valeurs a retourner! (tout le monde comprend ce que je veux dire?)

Et je vois pas comment faire! :oops:
Perdu dans la matrice avec un guide michelin ](*,) #-o
Adorateur de Cyrano
Parti puis revenu...

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

03 juin 2005, 12:46

Dans ce cas tu fais une boucle pour supprimer tous les ID_R trouvés dans report :

Correction à partir de la requête $temp :
....
//Extraire tous les ID_R dans report de même RHost
$temp="SELECT DISTINCT ID_R FROM report WHERE RHost LIKE '".addslashes($RHost)."%'"; 
$result2= mysql_query($temp)or die(mysql_error()); 
while ($row2= mysql_fetch_assoc($result2)) {
     
    $ID_R=$row2['ID_R']; 
     
    $query3="DELETE FROM item WHERE ReportID ='".$ID_R."' ";
    mysql_query($query3)or die(mysql_error()); 
}
//Supprimer finalement les reports
$query="DELETE FROM report WHERE RHost LIKE '".addslashes($RHost)."%'"; 
mysql_query($query)or die(mysql_error()); 

//Et le lieux d'interventions
$query4="DELETE FROM lieu_intervention WHERE ID_LI='".$Li."' "; 
mysql_query($query4)or die(mysql_error()); 
   
La requête $temp utilise DISTINCT et te permet de générer tous les ID_R distincts qui ont le même RHost dans report. Pour économiser les raffale de delete dans la boucle while.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

BFH
Eléphant du PHP | 214 Messages

03 juin 2005, 14:26

merci beaucoup sadeq j'avais vraiment pas les yeux en face des trous ! :shock:
Perdu dans la matrice avec un guide michelin ](*,) #-o
Adorateur de Cyrano
Parti puis revenu...