Suppression de données de la base

La suppression de rounds de la table "rounds" se fait en 3 temps : 1) on fait une recherche 2) dans la liste trouvée on sélectionne les rounds qu'on veut supprimer 3) on les supprime. On va donc avoir besoin :

  1. D'un formulaire de recherche (delete_form.html) : identique (au titre près) au formulaire search_form.html.
  2. D'un script PHP (delete_check.php) pour afficher les rounds trouvés : très ressemblant au script search_action.php à la différence que le script delete_check.php va placer une case à cocher devant chaque round de la liste affichée et un bouton de validation en bas de page. La page produite par delete_check.php est en fait un formulaire HTML (dynamique).
  3. D'un 2ème script PHP (delete_action.php) qui va se charger de supprimer les rounds cochés sur la page précédente (le formulaire produit par le script delete_check.php).

delete_form.html

Copier le fichier search_form.html en le renommant delete_form.html.

Faire les 2 modifications suivantes :

  1. Remplacer le titre "Critères de recherche" par "Recherche des rounds à supprimer".
  2. Changer la valeur de l'attribut ACTION de la balise <FORM> (c'est le script delete_check.php qui va traiter les valeurs saisies dans ce formulaire).

delete_check.php

Copier le fichier search_action.php en le renommant delete_check.php.

Comme search_action.php, le script delete_check.php va procéder en 8 étapes :

  1. Récupération des champs du formulaire delete_form.html.
  2. Fabrication d'une requête SELECT à partir des éléments du tableau associatif $_GET.
  3. Connexion au serveur MySQL.
  4. Choix d'une base.
  5. Envoi de la requête SELECT au serveur MySQL et récupération du résultat de cette requête dans une variable.
  6. Affichage du résultat de la requête SELECT dans un tableau dont chacune des lignes doit présenter maintenant une case à cocher.
  7. Libération de la mémoire occupée par le résultat de la requête.
  8. Déconnexion.

Par rapport à l'étape 6 du script search_action.php, on doit apporter les modifications suivantes :

Après modification, le script delete_check.php ressemblera à :

<?php
  ...
?>
<HTML>
<BODY>

<H3>R&eacute;sultat de la recherche</H3>

<FORM action="delete_action.php" method="post">
<?php
  show_rounds($result,1);
?>
<BR>
<INPUT type="submit" value="Supprimer les rounds s&eacute;lectionn&eacute;s">
</FORM>

</BODY>
</HTML>
<?php
  ...
?>

Evidemment, il va falloir modifier la fonction show_rounds() pour qu'elle prenne en compte ce 2ème argument. En attendant, effectuer quand même une recherche à l'aide du script delete_form.html. L'interpréteur PHP ne génère aucun warning. Pourtant l'instruction show_rounds($result,1); n'est pas correcte puisqu'on est train d'appeler la fonction show_rounds() en lui donnant 2 arguments alors que cette fonction n'en attend qu'un ! Ça fait partie des mystères de PHP... (si quelqu'un peut m'expliquer ce comportement inattendu, je suis preneur).


mes_fonctions.inc.php (version 4)

On doit maintenant apporter les modifications suivantes à la fonction show_rounds() :

Après modification, la fonction show_rounds() ressemblera à :

<?php

...

// Affichage sous forme de tableau HTML des rounds
// contenus dans l'identifiant de résultat $result
function show_rounds($result,$checkbox=FALSE)
{
	echo "<TABLE border=\"3\">\n";
	echo "<TR>";
	if ($checkbox) {
		echo "<TH>&nbsp;</TH>";
	}
	echo "<TH>Date</TH>";
	echo "<TH>Round</TH>";
	...
	echo "</TR>\n";
	while ($row = mysql_fetch_assoc($result)) {
		echo "<TR>";
		if ($checkbox) {
			$id = $row['id'];
			echo "<TD><INPUT type=\"checkbox\" name=\"ids[]\" value=\"$id\"></TD>";
		}
		echo "<TD>" . $row['date'] . "</TD>";
		echo "<TD>" . $row['num_round'] . "</TD>";
		...
		echo "</TR>\n";
	}
	echo "</TABLE>\n";
	return;
}

...

?>

Modifier la fonction show_rounds(). Tester. Vérifier le source de la page produite (regarder en particulier les valeurs des attributs name et value des différentes balises <INPUT> de type "checkbox").

Lancer le script select_all.php. Qu'observe-t-on ? Cette fois-ci, l'interpréteur PHP a bien le comportement attendu : il se plaint que la fonction show_rounds() est appelée sans son 2ème argument. Pour rendre cet argument facultatif, il suffit de remplacer function show_rounds($select_result,$checkbox) par function show_rounds($select_result,$checkbox=0) dans la définition de la fonction. Avec ce dernier changement, lorsque la fonction show_rounds() est appelée avec 1 seul argument, le 2ème argument (ici l'argument $checkbox) est mis automatiquement à la valeur 0.

Faire cette modification et relancer le script select_all.php.


delete_action.php

Première version (une requête par round à supprimer, ... on peut faire mieux) :

<?php
  require "mes_fonctions.inc.php";

  if ( ! isset($_POST['ids']) ) {
	echo "ERREUR : Vous n'avez rien s&eacute;lectionn&eacute; !";
	exit;
  }

  $ids = $_POST['ids'];
  print_r($ids); echo "<BR>";

  // Connexion au serveur MySQL et choix de la base 'gaming'
  ...

  // Envoi DES requêtes DELETE
  foreach ($ids as $id) {
	$ma_requete = "DELETE FROM `rounds` WHERE `id`='$id' LIMIT 1";
	mysql_query($ma_requete,$db_link) or die(mysql_error());
  }

  // Déconnexion
  ...

?>
...

N.B. : La ligne print_r($ids); echo "<BR>"; est utile seulement pendant la phase de mise au point du script.

Deuxième version (une seule requête pour supprimer tous les rounds) :

<?php
  require "mes_fonctions.inc.php";

  if ( ! isset($_POST['ids']) ) {
	echo "ERREUR : Vous n'avez rien s&eacute;lectionn&eacute; !";
	exit;
  }

  $ids = $_POST['ids'];
  print_r($ids); echo "<BR>";

  $id_list = implode("','",$ids);
  print_r($id_list); echo "<BR>";

  $ma_requete = "DELETE FROM `rounds` WHERE `id` IN ('$id_list')";
  echo "$ma_requete<BR>";


  // Connexion au serveur MySQL et choix de la base 'gaming'
  ...

  // Envoi de LA requête DELETE
  mysql_query($ma_requete,$db_link) or die(mysql_error());

  // Déconnexion
  ...

?>
...

Pour comprendre cette deuxième version, chercher des infos sur le rôle de la fonction implode() sur http://www.php.net/.

N.B. : Les lignes

sont utiles pendant la phase de mise au point du script pour voir les étapes successives de la transformation du tableau $_POST['ids'] en chaîne de caractères de la forme "id1','id2','id3',...,'idN". Penser à les enlever (en les mettant en commentaire) une fois que tout fonctionne normalement.


Page d'accueil de Hervé PagèsValid HTML 4.01!Contact : herve.pages@free.fr