Supprimer une une ligne du tableu en le selectionnant par un

Eléphant du PHP | 86 Messages

21 oct. 2010, 18:41

Salut
Quelqu'un peut m'aider.Je voudrais que losque je selectionne une ligne de mon tableau dans lequel j'ai affiché les informations d'une table de ma bd je puisse les supprimer par click sur un boutton.Les selection se fonts via un checkbox.

Code : Tout sélectionner

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=UTF-8"/> <title>Page principale</title> <link href="feuille.css" rel="stylesheet" type="text/css" /> </head> <body> <div id="bloc-fixe"> <?php session_start(); echo '<br/>'; echo '&nbsp;&nbsp;&nbsp;'; echo $_SESSION['login'], ' est connecté(e)'; ?> </div> <div id="contenu"> <ul id="menuDeroulant"> <li> <a href="#">Gestion des users</a> <ul class="sousMenu"> <li><a href="#">Liste</a></li> <li><a href="nouveau.php">Nouveau</a></li> </ul> </li> <li> <a href="#">Services</a> <ul class="sousMenu"> <li><a href="#">Famille Amis</a></li> <li><a href="#">Cub20</a></li> <li><a href="#">Internet Mobil</a></li> <li><a href="#">Ya bussiness</a></li> </ul> </li> <li> <a href="#">Informations</a> <ul class="sousMenu"> <li><a href="acceuil.php">Pharmacies</a></li> <li><a href="#">News</a></li> </ul> </li> <li> <a href="#">Préchargement</a> </li> </ul> <?php ini_set('display_errors','1'); //Inclusion de la classe mère include ("SGBD.class.php"); /* Initialisation de la variable du SGBD correspondant */ $SQL = "MySQL"; // Inclusion de la classe fille du SGBD correspondant include ($SQL.".SGBD.class.php"); /* Création d'un nouvel objet de la classe fille + lancement du constructeur */ $database = new $SQL('root', '', 'localhost', 'dbprojet'); // Connection à la base de données $database->connect(); $database->requete("SELECT login, nom, prenoms, root FROM USERS "); if (mysql_num_rows($database->requete) > 0) { $nb=mysql_num_rows($database->requete); echo '<p>&nbsp;</p>'; echo '<hr align="left" width="64%" color="red" size="1">'; echo '<input type="submit" value="Modifier"/>'; echo '&nbsp;'; echo'<input type="submit" value="Supprimer"/>'; echo '&nbsp;&nbsp;'; echo "$nb utilisateur(s) enregistré(s)"; //--------------------------------------------------------------------------------------------------------- // Affichage des utilisateurs dans le tableau //--------------------------------------------------------------------------------------------------------- if(( $data = mysql_fetch_array($database->requete))!= NULL) { echo '<form>'; echo '<table bgcolor="#FFFFFF" width="650px">'."\n"; echo '<tr height="25" id="legend">'; echo '<td align="center"><b>&nbsp;</b></td>'; echo '<td align="center"><b>Login</b></td>'; echo '<td align="center"><b>Nom</b></td>'; echo '<td align="center"><b>Prénom(s)</b></td>'; echo '<td align="center"><b>Root</b></td>' ; echo '</tr>'."\n"; do { echo '<tr>'; echo '<td height="3" align="center"><input type="checkbox" name="admin" id="administrateur" value="vrai"onchange="colorier(this);"/></td>'; echo '<td bgcolor="#f3fbff" height="25" align="center">&nbsp;'.$data['login'].'</td>'; echo '<td bgcolor="#f3fbff" height="25" align="center">&nbsp;'.$data['nom'].'</td>'; echo '<td bgcolor="#f3fbff" align="center" height="25">'.$data['prenoms'].'</td>'; echo '<td bgcolor="#f3fbff" align="center" height="25">'.$data['root'].'</td>'; echo '</tr>'."\n"; }while(( $data = mysql_fetch_array($database->requete))!= NULL); echo '</table>'."\n"; } //---------------------------------------------------------------------------------------------------------- } echo '</form>'; echo '<p>&nbsp;</p>'; ?> <!------------------------------------------------------------------------------------------------------------------------------------> <!--Fonction permettant de changer la couleur d'un checkbox selectionné--> <script> function colorier(quoi) { if ( quoi.checked ) quoi.parentNode.parentNode.style.backgroundColor="#B0D8E8"; else quoi.parentNode.parentNode.style.backgroundColor="#B0D8E8"; } </script> </div> </body> </html>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

21 oct. 2010, 19:02

salut,

il faut utiliser un "input" de type checkbox, auquel on donne un nom avec la notation tableau et lui donner pour valeur la clef primaire de la table qui est affichée.
par exemple <input type="checkbox" name="asupprrimer[]" value="$id" />

sur la page de validation du formulaire un simple implode permet de faire les suppressions en une seule fois

par exemple : $requete = 'delete from latable where id in ('.implode(',',$_POST['asupprimer']);
ensuite un substr pour supprimer la dernière virgule (en trop) et ajoute la ) manquante
$requete = substr($requete,0,-1) .');';

reste le mysql_query !

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 86 Messages

21 oct. 2010, 19:21

Pouvez vs faire un rapprochement avec mon code car je vois pas ce qui va correspondre à la variable asupprimer et $id

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

21 oct. 2010, 19:36

Il en faut peu pour être heureux ......

Eléphant du PHP | 86 Messages

21 oct. 2010, 19:41

Je te rassure que ça c'est un acquis(plus ou moins)

Eléphant du PHP | 288 Messages

21 oct. 2010, 19:53

Salut

change ta ligne
 echo '<td  height="3" align="center"><input type="checkbox" name="admin" id="administrateur" value="vrai"onchange="colorier(this);"/></td>';
Pour
 echo '<td  height="3" align="center"><input type="checkbox" name="admin[]" id="administrateur" value="vrai"onchange="colorier(this);"/></td>';
passe un tableau dans name et du côté de php tu recupère le tableau et itère dedan.

Voilà

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

21 oct. 2010, 19:53

désolé mais c'est plutôt moins que plus, car si c'était compris, car dans ce cas $_POST['asupprimer'] est évident !

donc

nous avons un formulaire html
<form action="pageTraitement.php" method="post">
<input type="text" name="nom" />
<input type="checkbox" name="asupprimer[]" value="case1"/>
<input type="checkbox" name="asupprimer[]" value="case2"/>
<input type="checkbox" name="asupprimer[]" value="case3"/>
<input type="checkbox" name="asupprimer[]" value="case4"/>
et pourquoi pas d'autre input / textarea.
<input type="submit" value="valider" name="submitform" /> <!-- ben oui faut bien valider le formulaire :)-->
</form>

coté php comment ça se passe ?

comme j'ai choisis la méthode"post" pour le transfert des données dans le la déclaration du formulaire, je fait avoir les valeurs de tous les champs du formulaire dans le tableau $_POST.
cette variable est dite super globale, ce qui signifie que l'on peut y accéder de partout. si j'avais choisis la méthode get (passage des infos par l'url) nous aurions utiliser le table $_GET !

le fichier appelé après le submit est pageTraitement.php.
sur ce fichier je vais pouvoir utiliser le tableau $_POST qui aura les indexs :
- nom
- asupprimer
- submit

ces index correspondent aux noms des champs input (c'est relativement facile).

donc $_POST['nom'] contient la valeur rentré dans le champ de formulaire.
$_POST['asupprimer'] est un tableau qui va contenir la valeur des cases qui ont étaient cochées par l'utilisateur (seulement celle la).
par exemple $_POST['asupprimer'][0] sera égale à "case3".

a partir de la tu 'sais' utiliser les infos fournies par un formulaire.
le reste du code que j'ai donné se décrit en lisant la doc des fonctions (sur php.net).

pour info ce que j'ai fait n'est pas "sécurisé" il serais intéressant d'ajouter un mysql_real_escape_string() pour les éléments du tableau $_POST['asupprimer'].

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 86 Messages

22 oct. 2010, 11:59

Salut la solution de moogli est un peu bizard car la blém est que le nombre d'element à supprimer dans le tableau n'est pas connu d'avance etant donné que celui ci est trés dynamique :oops:
Donc il me faut récupérer, à mon avis les valeur dans un tableau pour traitement c'est là le hic |*() |*()

ViPHP
xTG
ViPHP | 7331 Messages

22 oct. 2010, 12:19

Tu rajoutes les checkbox en même temps que l'affichage de tes valeurs tout simplement. :)

Eléphant du PHP | 86 Messages

22 oct. 2010, 14:24

Voici ce que j'ai pu faire mais helas

ici je recupére les element du de ma table

Code : Tout sélectionner

do { $vrai=$data['login']; echo '<tr>'; echo '<td height="3" align="center"><input type="checkbox" name="check[]" value="$vrai" onchange="colorier(this);"/></td>'; echo '<td bgcolor="#f3fbff" height="25" align="center">&nbsp;'.$data['login'].'</td>'; echo '<td bgcolor="#f3fbff" height="25" align="center">&nbsp;'.$data['nom'].'</td>'; echo '<td bgcolor="#f3fbff" align="center" height="25">'.$data['prenoms'].'</td>'; echo '<td bgcolor="#f3fbff" align="center" height="25">'.$data['root'].'</td>'; echo '</tr>'."\n"; }while(( $data = mysql_fetch_array($database->requete))!= NULL);


ici la suppression

Code : Tout sélectionner

<?php if(isset($_POST["Supprimer"])) { if (isset($_POST['check'])) { $check=$_POST['check']; $_SESSION['check']=$check; $c = count($_POST['check']); echo "$c"; echo "check[$c]"; $_SESSION["var1"]=$c; for ($i = 0;$i < $c; $i++) { echo "check[$i]"; $database->requete = 'delete from USERS where login in ('.implode(',',$_POST['check']); $database->requete = substr($database->requete,0,-1) .');'; //$database->requete("delete from USERS where login=check['$i']"); } $i=0; $_SESSION["var"]=$i; } } ?>
la deuxiéme requete de suppression n'a pas donnée donc j'ai essayé celle e moogli mais ça marche toujours pas

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

22 oct. 2010, 17:22

bon aller puisqu'il faut tout décortiquer
- les boutons submit ne sont pas dans le formulaire (en dehors de <form></form>) (et n'ont d’ailleurs pas d'attribut name donc introuvable dans $_POST)
- la déclaration du formulaire manque d'une action et d'une méthode. (<form action="fichier qui traite le résultat" method="get ou post"> ...</form>)
- TOUTES les cases à cocher ont pour valeur "vrai" quel intérêt ?
- tu n'a pas compris ce que je propose la boucle for for qui essai de supprimer autant de fois que possible les tuples en une seule fois ...
- le dernier code semble correct hormis la boucle for
- Je comprend pas tu utilise : $database->requete = 'delete from USERS where login in ('.implode(',',$_POST['check']); , $database->requete("SELECT login, nom, prenoms, root FROM USERS "); et while(( $data = mysql_fetch_array($database->requete))!= NULL);
C'est quoi au final $database-> requete ?

je ferais code ainsi
<?php
$database->requete('SELECT login, nom, prenoms, root FROM USERS');
if (mysql_num_rows($database->requete) > 0) {
    $nb=mysql_num_rows($database->requete);
}
else {
    $nb = 0;
}
echo <<<EOT
<p>&nbsp;</p>';
<hr align="left" width="64%" color="red" size="1">
<form action="" method="post">
<input type="submit" name="submit" value="Modifier"/>&nbsp;
<input type="submit" name="submit" value="Supprimer"/><br />
$nb utilisateur(s) enregistré(s)
<table bgcolor="#FFFFFF" width="650px">
<tr height="25" id="legend">
<td align="center"><b>&nbsp;</b></td>
<td align="center"><b>Login</b></td>
<td align="center"><b>Nom</b></td>
<td align="center"><b>Prénom(s)</b></td>
<td align="center"><b>Root</b></td></tr>
EOT;
while(( $data = mysql_fetch_array($database->requete))!= NULL){
    echo '<tr>';
    echo '<td  height="3" align="center"><input type="checkbox" name="check[]" id="administrateur"
        value="'.$data['login'].'" onchange="colorier(this);"/></td>';
    echo '<td bgcolor="#f3fbff" height="25" align="center">&nbsp;'.$data['login'].'</td>';
    echo '<td bgcolor="#f3fbff"  height="25" align="center">&nbsp;'.$data['nom'].'</td>';
    echo '<td bgcolor="#f3fbff" align="center"  height="25">'.$data['prenoms'].'</td>';
    echo '<td bgcolor="#f3fbff" align="center"  height="25">'.$data['root'].'</td>';
    echo '</tr>'."\n";
}
echo '</table>';
// traitement du formulaire
if ( !empty($_POST['submit']) && $_POST['submit']=='supprimer') {
    //on à demander une suppression
    if ( !empty($_POST['check']) && is_array($_POST['check'])) {
        array_walk($_POST['check'],create_function('$value','return mysql_real_escape_string($value);'));
        $requete = 'DELETE FROM USERS where login in (\''.implode('\',\'',$_POST['check']).'\');';
        $database->requete($requete);
    }
    else {
        //$_POST['check'] est vide, existe pas ou n'est pas un tableau !
    }
}
elseif (!empty($_POST['submit']) && $_POST['submit']=='supprimer') {
    // cas du bouton modifier
}
else {
    //il y a un soucis avec le formulaire ce cas ne peut pas arriver si ont ne touche à la source html !
}
?>
je te laisse le soin de trouver les messages d'erreur et de tester (je n'ai pas ta base ni ta classe database pour cela).

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 86 Messages

22 oct. 2010, 19:28

Merci moogli ta formule permet de supprimer mais le bléme est que au premier coup il supprime pas mais au deuxiéme si.Jignore la cause t'as une idée?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

22 oct. 2010, 20:21

vu que le traitement du formulaire se fait après l'affichage de celui (sur la page de destination) forcément tu affiche les données avant de les supprimer c'est pour cela que tu ne le vois pas à la première validation.

Un code fonctionnel et testé j'ai remplacé ta fonction de connection au sgdb par les fonctions de base et la table se nomme hiker au lieu de USERS mais le reste est identique.
<!DOCTYPE html>
<html lang="fr">
      <head>
        <meta charset="utf-8">
        <meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
        <title>Test Hiker</title>
        <link rel="stylesheet" media="all" href="css/main.css" />
    </head>
    <body>
    <header>
        <h1>TEst code Hiker</h1>
    </header>
        <code title="sql">
create table hiker(
id int not null auto_increment,
login text not null,
nom text not null,
prenoms text not null,
root text not null,
primary key(id)
)type=myisam;
insert into hiker (login,nom,prenoms,root) values ('hiker','nom hiker','prenom hikers','oui'),('moogli','moog','li','oui'),('test','nom test','prenom test','non');
</code>
<?php
mysql_connect('localhost','root','yyRu2TKEvyYpzFLK');
mysql_select_db('test');
/* Validation du formulaire */
if ( !empty($_POST['submit']) && $_POST['submit']=='Supprimer') {
    //on à demander une suppression
    if ( !empty($_POST['check']) && is_array($_POST['check'])) {
        array_walk($_POST['check'],create_function('$value','return mysql_real_escape_string($value);'));
        $requete = 'DELETE FROM hiker where login in (\''.implode('\',\'',$_POST['check']).'\');';
        $r = mysql_query($requete);
        if ($r === false){
            echo '<p>Erreur Mysql : '.$requete.'<br />'.  mysql_error().'</p>';
        }
        else {
            echo '<p>Suppression de '.mysql_affected_rows().' tuple(s)</p>';
        }
    }
    else {
        //$_POST['check'] est vide, existe pas ou n'est pas un tableau !
    }
}
elseif (!empty($_POST['submit']) && $_POST['submit']=='Modifier') {
    // cas du bouton modifier
}
else {
    //il y a un soucis avec le formulaire ce cas ne peut pas arriver si ont ne touche à la source html !
}
//$q('SELECT login, nom, prenoms, root FROM USERS');
$query = 'SELECT login, nom, prenoms, root FROM hiker';
$q = mysql_query($query);
if (mysql_num_rows($q) > 0) {
    $nb=mysql_num_rows($q);
}
else {
    $nb = 0;
}

echo <<<EOT
<hr align="left" width="64%" color="red" size="1">
<form action="" method="post">
<input type="submit" name="submit" value="Modifier"/>&nbsp;
<input type="submit" name="submit" value="Supprimer"/><br />
$nb utilisateur(s) enregistr&eacute;(s)
<table bgcolor="#FFFFFF" width="650px">
<tr height="25" id="legend">
<td align="center"><b>&nbsp;</b></td>
<td align="center"><b>Login</b></td>
<td align="center"><b>Nom</b></td>
<td align="center"><b>Prénom(s)</b></td>
<td align="center"><b>Root</b></td></tr>
EOT;
while(( $data = mysql_fetch_array($q))!= NULL){
    echo '<tr>';
    echo '<td  height="3" align="center"><input type="checkbox" name="check[]" id="administrateur"
        value="'.$data['login'].'" onchange="colorier(this);"/></td>';
    echo '<td bgcolor="#f3fbff" height="25" align="center">&nbsp;'.$data['login'].'</td>';
    echo '<td bgcolor="#f3fbff"  height="25" align="center">&nbsp;'.$data['nom'].'</td>';
    echo '<td bgcolor="#f3fbff" align="center"  height="25">'.$data['prenoms'].'</td>';
    echo '<td bgcolor="#f3fbff" align="center"  height="25">'.$data['root'].'</td>';
    echo '</tr>'."\n";
}
echo '</table>';
?>
    </body>
</html>
@+
Il en faut peu pour être heureux ......