Page 1 sur 1

Suppression de données en base

Posté : 20 sept. 2010, 11:10
par Ptisouiss
Bonjour à tous!

Je mets actuellement en place une page sur laquelle s'affiche une liste de miniatures. Je charge celles ci au préalable en base de données, via un formulaire. J'y stock uniquement une balise <img> dans laquelle j'ai dynamiser l'attribut "src". Ces images sont affichées à la fois sur un site (front) et sur ma page qui sert de page d'administration. Jusqu'ici, tout vas bien, les images s'affichent bien en front, et ma liste, en backoffice, se met bien à jour à chaque fois que j'ajoute une nouvelle image.

J'aimerai maintenant pouvoir ajouter un bouton ou un lien, a chaque miniature, qui me permettrait d'effacer une image.
Je vous colle ici le script que j'ai tant bien que mal tenter de développer avec mes pauvres connaissance en PHP et les infos que j'ai pu trouver sur le net :
<?php
	// si on demande la suppression, on lance le script avant l'affichage
	if(isset($_GET['del_img']) && (!empty($_GET['del_img']))){
		include("del_img.php");
	}
	?>
	
	<?php
	
	// on affiche les miniatures
	$sql = 'SELECT id,tb_path FROM img_slider WHERE page="' . $cp . '" ORDER BY id';	// $cp est la variable des mes différentes page, récupérée via $_GET['page']
	
	// on envoie la requête
	$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());		
	
	?>
	
	<div class="thumbs_lst">
	
	<?php
	while($result = mysql_fetch_object($req)){
		$img_id = ($result->id);
		echo 
		"<ul>"
			."<li>"
				.$img_id
				.($result->tb_path)
				."<a href=\"backoffice.php?page=$cp&del_img=$img_id\">Supprimer</a>"
			."</li>"
		."</ul>";
		
	}
	?>
Ma démarche était la suivante : Récupérer l'id, en base de données, de mon image (pour savoir quelle image supprimer évidement :D ), et de passer celui ci au script qui se chargera de l'opération, via l'url (del_img=$img_id). Je vérifie donc, au chargement de la page, si 'del_img' est passée, et, si c'est le cas, j'inclue le script :
// initialisation des variables

$cp = $_GET['page'];

$sql = 'SELECT id FROM img_slider WHERE page="' . $cp . '"';	

// on envoie la requête
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());		

while($result = mysql_fetch_object($req)){
	$img_id = ($result->id);
}

// lancement de la requête pour effacer 
$sql ='DELETE from img_slider WHERE id="'.$img_id.'" AND page="'.$cp.'"';  

echo 'nombre de lignes affectées par la suppression : '.mysql_affected_rows().' enregistrements';
 
// on exécute la requête (mysql_query) et on affiche un message au cas où la requête ne se passait pas bien (or die)  
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());  

Première chose : Je me trouve dans l'obligation de "redéclarer" mes variables $cp et $img_id. Je pense que ce n'est pas la meilleure des façons de faire, mais pour l'instant, je n'ai pas trouvé d'autre solution, et cela permet, provisoirement, au script de fonctionner.

Ensuite, la suppression de mes entrées en base, car c'est ce qui m'intéresse :)
Le script efface bien mes entrées, mais pas celles que je veux !!!
supposons que j'ai 3 images d'afficher sur ma page, et que celles ci ont comme id : 45, 46, 47
Lorsque je clique sur la première (45), c'est la dernière qui s'efface! et ainsi de suite jusqu'à ce qu'il ne reste plus que celle que je voulais supprimer au départ!

Enfin, l'url.
Lorsque je demande la suppression d'une image, comme expliquer plus haut, je passe une variable dans l'url pour déclancher le script. mon url devient donc un truc du genre : backoffice.php?page=restaurant&del_img="ID de mon image"
Ce qui me gène, et ce qui je pense peut être une des causes de mon problème, et que une fois une suppression effectuée, cette url reste. et en cas de rafraichissement, relance l'action sur une image qui, finalement, ne devrait plus exister. Comment revenir à l'url de "base", c'est à dire " backoffice.php?page=restaurant" au lieu de " backoffice.php?page=restaurant&del_img="ID de mon image""

Donc, pour résumer :)
- Le choix d'inclure le fichier de traitement comme je le fait est il judicieux? existe t'il une façon de procéder qui serait plus...optimale?
- Que me manque t'il pour que le script supprime bien l'image demandée. Je pense ne pas être loin de but, puisque une image est tout de même effacer. Problème de ma requête? dans ma base?
- Quelle méthode pour retrouver l'url de ma page départ? Je pensais à une redirection, mais étant donné que mon script est inclue, donc dans la même page, cela n'aurait aucune sens.

Je reconnais qu'il y a pas mal de chose, mais si vous pouviez juste un peu m'éclairer, me dire là ou ça peut coincer, ça serait tip top comme ça :pouce: :wink:

Merci d'avance

Re: Suppression de données en base

Posté : 20 sept. 2010, 11:40
par Ptisouiss
Voici quelques évolution depuis tout à l'heure :

Le problème de suppression est tout autre que ce que je pensais!
Si je supprime la 2ème, ou 3ème etc..... image, cela fonctionne. Le script supprime bien les images que je demande. Mais si je veux supprimer la 1ère, c'est là que ça pose problème. Il supprime la dernière image de la liste!!! et ainsi de suite, jusqu'à ce qu'il ne reste que la 1ère!!??

Autre chose, j'ai ajouté l'action au formulaire, qui avait disparu....? :)

Re: Suppression de données en base

Posté : 20 sept. 2010, 11:41
par Ptisouiss
<form method="post" action="backoffice.php?page=<?php echo $cp ?>" enctype="multipart/form-data">

Re: Suppression de données en base [résolu]

Posté : 20 sept. 2010, 13:48
par Ptisouiss
Problème solutionné! Voici comment

J'ai d'abord fait appel au script directement, sans l'inclure dans la page, en lui passant ma variable $img_id

Je récupère le tout dans le script, fais le traitement et je renvoie vers ma page principale.
// on affiche les miniatures
	$sql = 'SELECT id,tb_path FROM img_slider WHERE page="' . $cp . '"';	
	
	// on envoie la requête
	$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());		
	
	?>

	<ul class="thumbs_lst">
		<?php
		while($result = mysql_fetch_object($req)){
			$img_id = ($result->id);
			echo 
			"<li>"
				.($result->tb_path)
				."<p><a href=\"del_img.php?page=$cp&del_img=$img_id\">Supprimer</a></p>"
			."</li>";
		}
if(isset($_GET['del_img']) && (isset($_GET['page']))){

	// initialisation des variables

	require_once 'connect.php';

	$cp = $_GET['page'];
	
	$img_id = $_GET['del_img'];

	// lancement de la requête pour effacer 
	$sql ='DELETE from img_slider WHERE id="'.$img_id.'" AND page="'.$cp.'"';  
	 
	// on exécute la requête (mysql_query) et on affiche un message au cas où la requête ne se passait pas bien (or die)  
	mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());  

	// on ferme la connexion à la base  
	//mysql_close();

	// on vide les données pour éviter un doublon des données en cas de nouvelle soumission du formulaire
	unset($_GET);

	header('Location: backoffice.php?page='.$cp);

}
else{
	echo "Erreur";
}
Manque plus qu'à trouver comment faire apparaître un message de confirmation sur la page principale après suppression.

Re: Suppression de données en base [résolu]

Posté : 20 sept. 2010, 15:35
par AB
Problème solutionné! Voici comment

J'ai d'abord fait appel au script directement, sans l'inclure dans la page, en lui passant ma variable $img_id

Je récupère le tout dans le script, fais le traitement et je renvoie vers ma page principale.
if(isset($_GET['del_img']) && (isset($_GET['page']))){

	// initialisation des variables

	require_once 'connect.php';

	$cp = $_GET['page'];
	
	$img_id = $_GET['del_img'];

	// lancement de la requête pour effacer 
	$sql ='DELETE from img_slider WHERE id="'.$img_id.'" AND page="'.$cp.'"';  
	 
	// on exécute la requête (mysql_query) et on affiche un message au cas où la requête ne se passait pas bien (or die)  
	mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());  

	// on ferme la connexion à la base  
	//mysql_close();

	// on vide les données pour éviter un doublon des données en cas de nouvelle soumission du formulaire
	unset($_GET);

	header('Location: backoffice.php?page='.$cp);

}
else{
	echo "Erreur";
}
Manque plus qu'à trouver comment faire apparaître un message de confirmation sur la page principale après suppression.
Tu n'as pas besoin de faire unset($_GET); puisque le contenu de $_GET sera égal aux variables $_GET que tu mettras dans ton header.
D'ailleurs tu pourrais en profiter (du header Location) pour ajouter une seconde variable qui indiquerait que la mise à jour est effectuée.
header('Location: backoffice.php?page='.$cp.'&suppr=ok');
et dans la page de destination tu fais
if (isset($_GET['suppr']) && $_GET['suppr'] == 'ok') echo 'image supprimée';
Alternativement tu peux enregistrer un message de confirmation dans une variable de session que tu effacerais juste après sont affichage.