Cours pratique d'initiation à PHP/MySQL | Sommaire ![]() |
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 :
Copier le fichier search_form.html en le renommant delete_form.html.
Faire les 2 modifications suivantes :
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 :
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é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électionné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).
On doit maintenant apporter les modifications suivantes à la fonction show_rounds() :
if ($checkbox == 1) { echo "<TH> </TH>"; }juste avant l'instruction echo "<TH>Date</TH>";, ce qui aura pour effet d'insérer une cellule vide au début de la première ligne du tableau (la ligne des titres de colonnes) dans le cas où $checkbox == 1.
if ($checkbox == 1) { $id = $row['id']; echo "<TD><INPUT type=\"checkbox\" name=\"ids[]\" value=\"$id\"></TD>"; }à l'intérieur de la boucle while.
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> </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.
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électionné !";
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électionné !";
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ès | Contact : herve.pages@free.fr |