supprimer un ou plusieurs enregistrements

Eléphant du PHP | 335 Messages

23 mai 2005, 11:34

Bonjour,

J'ai fait un tableau qui permet d'afficher ma table.
Sur chaque ligne de ce tableau j'ai rajouté des cases a cocher.
J'ai également un bouton supprimer.

Ce que je voudrais savoir c'est comment faire pour que lorsque l'utilisateur coche une ou plusieurs cases et clic sur supprimer, les lignes correspondantes soient supprimer de ma table?

Merci pour votre aide...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

23 mai 2005, 11:58

Tu peut construire tes case à cocher avec un tableau

Code : Tout sélectionner

<input type="chekbox" name="temp[]" value="val">
Et dans ton script de vérification, tu parcours ce tableau :
foreach ($_POST["temp"] as $index => $val) {
  $str_requete = "DELETE FROM table WHERE champ LIKE ".$val;
  ...
}
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

Administrateur PHPfrance
Administrateur PHPfrance | 430 Messages

23 mai 2005, 11:59

note: je fait ca de tête => c pas sur à 100% mais c l'idée
simple : range les valeurs de tes cases dans un tableau et dans l'attribut value de tes cases a cocher met la partie WHERE du SQL permettant de les identifier :

Code : Tout sélectionner

SELECT * FROM utilisateur WHERE nom='cerber' AND level='admin'
=>

Code : Tout sélectionner

<input type="checkbox" name="listeCase[]" value="nom="cerber" AND level='admin'">
Ensuite il suffit de joindre tes valueus pour avoir la clause WHERE de ta nouvelle requête :
<?
$where='FALSE';
for($i=0;$i<count($_POST['listeCase']);$i++){
  $where.=' OR ('.$_POST['listeCase'][$i].')';
}
$sql = "DELETE FROM table WHERE $where";
?>
si tu est pas sur de tes utilisateurs ou si tu crain un piratage (et tu devrais :twisted:) passe par une valeur fictive et un tableau en session
expl :

Code : Tout sélectionner

$_SESSION['case'][1]="nom='cerber' AND level='admin'" ... <input type="checkbox" name="listeCase[]" value="1"> ... $where.=' OR ('.$_SESSION['case'][$_POST['listeCase'][$i]].')';

Eléphant du PHP | 335 Messages

23 mai 2005, 12:08

Tu peut construire tes case à cocher avec un tableau

Code : Tout sélectionner

<input type="chekbox" name="temp[]" value="val">
Et dans ton script de vérification, tu parcours ce tableau :
foreach ($_POST["temp"] as $index => $val) {
  $str_requete = "DELETE FROM table WHERE champ LIKE ".$val;
  ...
}


qu'est ce que t'entends par $index et $val?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

23 mai 2005, 12:10

Ca signifie que $index va prendre la valuer des index du tableau $_POST["temp"] et $val les valeur du tableau.

exemple

$_POST["Temp"] = array(0 => blanc, 1 => rouge, 2 => vert, 3 => orange)

tour à tour, $index va prendre les valeur 0, 1, 2, 3 et $val va prendre les valeur blanc, rouge, vert, orange
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

Eléphant du PHP | 335 Messages

23 mai 2005, 13:15

<table border="1"> 
      <tr> 
	  	<td></td>
        <td><b>Jour</b></td> 
        <td><b>Mois</b></td>
		<td><b>Annee</b></td>
		<td><b>Heure</b></td>
		<td><b>Type</b></td>
		<td><b>Downtime in SLA</b></td>
		<td><b>Total Downtime</b></td>
		<td><b>Description</b></td>
		<td><b>Action</b></td>
		<td><b>Owner</b></td>
      </tr> 
<?php 
require_once('../Connections/arnis01.php');
mysql_select_db("arnis01"); 

$annee=$_POST["annee"]; 

$str_requete ="SELECT jour, mois, annee, heure, type, sla, total, description, action, owner FROM sla WHERE annee=".$annee." ORDER BY annee, mois, jour"; 
$o_result = mysql_query($str_requete); 

while ($a_result = mysql_fetch_array($o_result, MYSQL_ASSOC)) { 
$tabMois = array ('01'=>'Janvier', '02'=>'Février', '03'=>'Mars', '04'=>'Avril', '05'=>'Mai', '06'=>'Juin', '07'=>'Juillet', '08'=>'Août', '09'=>'Septembre', '10'=>'Octobre', '11'=>'Novembre', 12=>'Décembre'); 
$mois = $tabMois[$a_result["mois"]]; 

  echo "<tr>";
  echo "<td><input type='checkbox' name='temp[]' value='val'></td>";
  echo "<td>".$a_result["jour"]."</td>"; 
  echo "<td>".$mois."</td>"; 
  echo "<td>".$a_result["annee"]."</td>"; 
  echo "<td>".$a_result["heure"]."</td>"; 
  echo "<td>".$a_result["type"]."</td>"; 
  echo "<td>".$a_result["sla"]."</td>"; 
  echo "<td>".$a_result["total"]."</td>"; 
  echo "<td>".$a_result["description"]."</td>"; 
  echo "<td>".$a_result["action"]."</td>";
  echo "<td>".$a_result["owner"]."</td>";  
  echo "</tr>"; 

  foreach ($_POST["temp"] as $index => $val) { 
  $str_requete = "DELETE FROM sla WHERE ? LIKE ".$val;  
}
} 
mysql_close();
?> 
</table>
<button type="button" value="button" name="delete">Supprimer</button>";
Je n'arrive pas a voir quel champ je dois mettre dans ma requete Delete!

Sinon le foreach, je dois le mettre a cet endroit, aprés le input type="checkbox" non?

merci

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

23 mai 2005, 13:27

Pas tout a fait !!!

Quand tu écrit ton formulaire, le input de type chekbox doit contenir l'identifiant de la ligne écrite

Ensuite, dans la page de traitement de ton formulaire, (<form ACTION="maPage.php"), tu doit placer le foreach et le champ que tu doit mettre dans ta requete DELETE, c'est le champ que tu as mis dans ton input chekbox

Le but de la manoeuvre étant de créer un tableau de chakbox qui vont contenir un identifiant d'un enregistrement dans la bdd et que dans la page de validation, tu efface tout ceux les enregistrement dont l'identifiant se trouve dans le tableau de chekbox (ceux qui ont été sélectionnés))
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

Eléphant du PHP | 335 Messages

23 mai 2005, 13:50

<table border="1"> 
      <tr> 
	  	<td></td>
        <td><b>Jour</b></td> 
        <td><b>Mois</b></td>
		<td><b>Annee</b></td>
		<td><b>Heure</b></td>
		<td><b>Type</b></td>
		<td><b>Downtime in SLA</b></td>
		<td><b>Total Downtime</b></td>
		<td><b>Description</b></td>
		<td><b>Action</b></td>
		<td><b>Owner</b></td>
      </tr> 
<?php 
require_once('../Connections/arnis01.php');
mysql_select_db("arnis01"); 

$annee=$_POST["annee"]; 

$str_requete ="SELECT jour, mois, annee, heure, type, sla, total, description, action, owner FROM sla WHERE annee=".$annee." ORDER BY annee, mois, jour"; 
$o_result = mysql_query($str_requete); 

while ($a_result = mysql_fetch_array($o_result, MYSQL_ASSOC)) { 
$tabMois = array ('01'=>'Janvier', '02'=>'Février', '03'=>'Mars', '04'=>'Avril', '05'=>'Mai', '06'=>'Juin', '07'=>'Juillet', '08'=>'Août', '09'=>'Septembre', 
                  '10'=>'Octobre', '11'=>'Novembre', 12=>'Décembre'); 
$mois = $tabMois[$a_result["mois"]]; 

  echo "<tr>";
  echo "<td><input type='checkbox' name='temp[]' value='description'></td>";
  echo "<td>".$a_result["jour"]."</td>"; 
  echo "<td>".$mois."</td>"; 
  echo "<td>".$a_result["annee"]."</td>"; 
  echo "<td>".$a_result["heure"]."</td>"; 
  echo "<td>".$a_result["type"]."</td>"; 
  echo "<td>".$a_result["sla"]."</td>"; 
  echo "<td>".$a_result["total"]."</td>"; 
  echo "<td>".$a_result["description"]."</td>"; 
  echo "<td>".$a_result["action"]."</td>";
  echo "<td>".$a_result["owner"]."</td>";  
  echo "</tr>"; 
} 
?> 
</table>

<form action='downtime2.php'>
<?php
foreach ($_POST["temp"] as $index => $val) { 
$str_requete2 = "DELETE FROM sla WHERE description LIKE ".$val; 
$result = mysql_query($str_requete2);  
}
?>
<button type="button" value="button" name="delete">Supprimer</button>
et j'ai mon tableau qui s'affiche ave en bas cette erreur :
Warning: Invalid argument supplied for foreach()

et lorsque je sélectionne des lignes et clic sur supprimer rien ne se passe!

merci pour votre aide...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

23 mai 2005, 13:57

1erement, si tu veux créer ton tableau Temp lorsque tu cliques sur supprimer, il faut que ton formulaire encadre ton tableau qui contient les input !!!! Ca me semble évident et il me semblait que tu avais compris ça dans un post qu'on avait tenu ensemble !!!!

Ensuite, l'erreur en bas de ton tableau vient du fait que ton code de vérification est appellé lors du construction du tableau dans la page d'affichage alors que je te dit depuis 2 post qu'il faut que ce code se trouve dans la page de validation de ton formulaire !!!!
[size=75]<table border="1">
      <tr>
          <td></td>
        <td><b>Jour</b></td>
        <td><b>Mois</b></td>
        <td><b>Annee</b></td>
        <td><b>Heure</b></td>
        <td><b>Type</b></td>
        <td><b>Downtime in SLA</b></td>
        <td><b>Total Downtime</b></td>
        <td><b>Description</b></td>
        <td><b>Action</b></td>
        <td><b>Owner</b></td>
      </tr>
<?php
require_once('../Connections/arnis01.php');
mysql_select_db("arnis01");

$annee=$_POST["annee"];

$str_requete ="SELECT jour, mois, annee, heure, type, sla, total, description, action, owner FROM sla WHERE annee=".$annee." ORDER BY annee, mois, jour";
$o_result = mysql_query($str_requete);

while ($a_result = mysql_fetch_array($o_result, MYSQL_ASSOC)) {
$tabMois = array ('01'=>'Janvier', '02'=>'Février', '03'=>'Mars', '04'=>'Avril', '05'=>'Mai', '06'=>'Juin', '07'=>'Juillet', '08'=>'Août', '09'=>'Septembre',
                  '10'=>'Octobre', '11'=>'Novembre', 12=>'Décembre');
$mois = $tabMois[$a_result["mois"]];
?>
<form action='downtime2.php' method="post">

<?php
  echo "<tr>";
  echo "<td><input type='checkbox' name='temp[]' value='$a_result["description"]'></td>";
  echo "<td>".$a_result["jour"]."</td>";
  echo "<td>".$mois."</td>";
  echo "<td>".$a_result["annee"]."</td>";
  echo "<td>".$a_result["heure"]."</td>";
  echo "<td>".$a_result["type"]."</td>";
  echo "<td>".$a_result["sla"]."</td>";
  echo "<td>".$a_result["total"]."</td>";
  echo "<td>".$a_result["description"]."</td>";
  echo "<td>".$a_result["action"]."</td>";
  echo "<td>".$a_result["owner"]."</td>";  
  echo "</tr>";
}
?>
</table>
<button type="button" value="button" name="delete">Supprimer</button>
</form>[/size]
Puis dans downtime2.php
[size=75]<?php
foreach ($_POST["temp"] as $index => $val) {
$str_requete2 = "DELETE FROM sla WHERE description LIKE ".$val;
$result = mysql_query($str_requete2);  
}
?>[/size]
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

Eléphant du PHP | 335 Messages

23 mai 2005, 14:13

merci bcp pour ton aide

j'ai un probleme sur cette ligne
echo "<td><input type='checkbox' name='temp[]' value='$a_result["description"]'></td>";

Parse error: parse error, unexpected '"', expecting T_STRING or T_VARIABLE or T_NUM_STRING

J'ai essayé en mettant des simples cote, des antislashes,...
mais rien a faire.

As tu une idée?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

23 mai 2005, 14:16

Excuse moi, j'ai copier/coller sans vérifier !!

Il ne faut jamais mettre un tableau dans un chaine, il faut préferer la concaténation :
echo "<td><input type='checkbox' name='temp[]' value='".$a_result["description"]."'></td>"; 
Tu remarqueras qu'il faut laisser les simples cotes pour le browser et les doubles cotes pour que le serveur apache réalise la concaténation
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

Eléphant du PHP | 335 Messages

23 mai 2005, 14:25

bon ba ca marche tjs pas!

je comprends, tout se passe bien, mais la ligne est toujours présente dans ma table!

merci quand meme, tu m'as bien aidé!

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

23 mai 2005, 14:27

Dans la page qui contient le foreach, fait un print_r($_POST["Temp"]) pour voir s'il contient quelquechose ou pas !!!
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

23 mai 2005, 15:03

Voici un exemple simplifié de ce que tu veux faire, de quoi te donner des idées :

La base de données utilisée contient une table : taches (date : datetime, a_faire : varchar(255) )
Ce programme affiche un calendrier annuel/mensuel de tâches et permet de supprimer des lignes
<?php 
//J'ai une page .class qui connecte à la base et qui crée une variable objet $bd
require_once('serveur_bd.class'); 

//Données
$annee=2005;
$mois = array (1=>'Janvier', 2=>'Février', 3=>'Mars', 4=>'Avril', 5=>'Mai', 6=>'Juin', 7=>'Juillet', 8=>'Août', 9=>'Septembre', 10=>'Octobre', 11=>'Novembre', 12=>'Décembre'); 

//Récuperer l'action du formulaire
$action = isset($_POST["action"])?$_POST["action"]:null;

//Récuperer les lignes à supprimer
$selection = isset($_POST["selection"])?$_POST["selection"]:null;
if ($selection != null && $action == "Supprimer")
foreach ($selection as $date) 
  if ($date != null){ 
                //raffale de suppressions
  	$requete = "DELETE FROM taches WHERE date='$date'"; 
                //executerSQL est une fonction de la classe de l'objet $bd  
  	$bd->executerSQL($requete);
  }

//Afficher le planning des tâches
$requete ="SELECT day(date) as jour, month(date) as mois,year(date) as annee, a_faire 
		   FROM taches WHERE 
		   year(date)=$annee 
		   ORDER BY date"; 
//Dans le cas d'un SELECT executerSQL retourne un tableau
$taches = $bd->executerSQL($requete); 
echo "<h3>Annee $annee
<hr>
<form method=POST>
<table border=1> 
<tr>
<th>
<th>Mois
<th>Jour
<th>Tâche
";
if ($taches != null)
	foreach ($taches as $tache) 
		if ($tache != null) {
			$date = $tache["annee"]."/".$tache["mois"]."/".$tache["jour"];
			$jour = $tache["jour"]; 
			$nom_mois = $mois[$tache["mois"]];
			$a_faire = $tache["a_faire"]; 
			echo "<tr> 
				<td><input type='checkbox' name='selection[]' value=\"$date\"> 
				<td>$nom_mois
				<td>$jour
				<td>$a_faire";  
		}
?> 
</table> 
<hr>
<input type="submit" value="Supprimer" name="action">
</form>
?>
Reamarques que la suppression est traitée avant la requête SELECT pour ne pas réafficher des élèments supprimés

Je te donne aussi la classe serveur_bd pour plus d'information :
<?php
Class serveur_bd { 
   //Données de la classe 
   var $connexion;
   var $base;
   var $serveur;
   
   //Construction (initilaisation de la session serveur: nom serveur, utilisateur, mot de passe et base de données)
   function serveur_bd($serveur = array('host'=>"localhost",'user'=>"root",'pwd'=>""), $base = "test"){$this->serveur = $serveur; $this->base = $base;}
   //fonction d'exécution d'une requête donnée 
   function executerSQL($sql){ 
       //connecter au serveur
        $this->connexion = mysql_connect($this->serveur["host"],$this->serveur["user"],$this->serveur["pwd"]) or die ("Serveur non disponible!"); 
       //ouvrir la base 
        mysql_select_db($this->base, $this->connexion) or die ("Base de données non disponible!"); 
        //exécuter la requête donnée 
		$req = mysql_query($sql, $this->connexion) or die ("Requête non exécutée!"); 
		$res = null;
 		//explorer le resultat pour le transformer en tableau d'objets s'il s'agit d'un recordset
		if (is_resource($req))
         while ($ligne = mysql_fetch_array($req)) { 
                 $res[] = $ligne; 
        } 
    //retourner le tableau assemblé 
    return $res; 
   } 
}//fin de la classe 
//Création d'un objet serveur'
$bd = new serveur_bd();
?>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 335 Messages

23 mai 2005, 15:50

voila ce que j'obtiens avec print_r
Array ( [0] => Problem with the forms server. One process use 100% of CPU and no new users can connect to OA. (OA message: Key CONFAIL buncle oracle.forms.engine.RunformBundle exception java.lang.Illegal ArgumentException: Unknow format type at - Java.net.ConnectExcep )