Une seule checkbox et plusieurs requêtes SQL.

Eléphanteau du PHP | 24 Messages

27 déc. 2014, 14:08

Bien le bonjour à tous !
Je m’explique, développant un site web pour une société, j'ai un petit soucis au sujet d'une checkbox.
Le but étant, de cocher une seule checkbox qui sont générées automatiquement en fonction du nombre de lignes du tableau grâce a la boucle while si je me trompe pas et par la suite de supprimer d'abord la table correspondante à ce capteur puis la ligne correspondante dans la table "tp_arexx_capteur" .
Actuellement il est vrai que, la suppression de la ligne correspondante dans la table ce fait correctement si à la ligne :

Code : Tout sélectionner

<td style="text-align:center;width:20%;"><input type="checkbox" id="squaredFour" name="champ[]" value="<?php echo $tab_contenu['Arexx_index']; ?>" /></td>
Arexx_index est présent, si je met Arexx_Table cela me supprime bien la table mais non la ligne, or je veut éviter de faire deux checkbox.

Voici le code entier :
<?php
/* ------------------ CASE A COCHER ------------------ */
 // connexion
$mysql_user="admin";
$mysql_password="admin";
$reqco = mysql_connect("localhost",$mysql_user,$mysql_password);
 
//sélection de la BDD
$reqse = mysql_select_db("tp_arexx",$reqco);
 
//résupération des informations
$req=mysql_query("SELECT * FROM tp_arexx_capteurs",$reqco);
if ( $reqco == NULL ) 
{ 
    echo " Cet agent n'a participé à aucune session."; 
} 
 
/* ------------------ CASE A COCHER ------------------ */
 
if (isset($_POST['champ'])) {
 
 
	for ($i=0;$i<sizeof($_POST['champ']);$i++) {
 
	$champ[$i] = $_POST['champ'][$i];
	$numero_article = $_POST['champ'][$i];
 
	$query2 = mysql_query("SELECT `Arexx_Table` FROM `tp_arexx_capteurs` WHERE `Arexx_Table`='$numero_article'");
	$result_donnees2=mysql_fetch_assoc($query2);
 
 
 
	$query = "DROP TABLE IF EXISTS . `$champ[$i]`";
	$result = mysql_query($query)  or die('Erreur SQL ! '.$query.'<br/>'.mysql_error());
 
 
 
 
    }
 
 
 
}
 
if (isset($_POST['champ'])) {
 
	for ($i=0;$i<sizeof($_POST['champ']);$i++) {
 
	$champ[$i] = $_POST['champ'][$i];
	$numero_article1 = $_POST['champ'][$i];
 
 
 	$query3 = mysql_query("SELECT `Arexx_index` FROM `tp_arexx_capteurs` WHERE `Arexx_index`='$numero_article1'");
	$result_donnees3=mysql_fetch_array($query3);
 
 
 
 
 
 
	$query1 = 'DELETE FROM `tp_arexx_capteurs` WHERE `Arexx_index` = '. $champ[$i];
	$result1 = mysql_query($query1)  or die("Erreur SQL ! ".$query1."<br/>".mysql_error());
    }
	?>
<script type="text/javascript">
 
    function generate(layout) {
 
        var n = noty({
		animation: {
        open: 'animated zoomIn', // Animate.css class names
        close: 'animated  zoomOut', // Animate.css class names
    },
 
            text        : 'Supression de X élements et de leurs tables liées.<br>Opérations terminées correctements.</br>',
            type        : 'success',
            dismissQueue: true,
            layout      : layout,
            theme       : 'defaultTheme',
 
        }).setTimeout(3800).close();
 
 
        console.log('html: ' + n.options.id);
    }
 
 
    function generateAll() {
 
        generate('center');
 
 
    }
 
    $(document).ready(function () {
 
        generateAll();
 
    });
 
  </script>
<?php
}
 
 
 
/* ------------------ A partir d'ici table : alimentaire Lecture ------------------ */
$reponse = mysql_query("SELECT * FROM tp_arexx_capteurs"); // Requête SQL
?>
 
 
 <form method="POST" id="form" name="form">
 
 <div class="top-shadow">
<table class="flatTable" table border="0" CELLSPACING="0" >
  <tr class="titleTr">
    <td class="titleTd">Liste des capteurs</td>
    <td colspan="4"></td>
    <td class="plusTd button"></td>
 
				    <td class="plusTd3 button"></td>
	</div>
 
  </tr>
  <tr class="headingTr">
 <td><center>Index du capteur</center></td> 
<td><center>Nom du capteur</center></td> 
<td><center>Identifiant du capteur</center></td> 
<td><center>Type du capteur</center></td> 
<td><center>Table correspondant au capteur</center></td>
<td><center>Supprimer le capteur</center></td>
<td><center>Supprimer la table correspondante au capteur</center></td>
    <td></td>
  </tr>
 
 
<?php
//Affichage des informations
 
while ($tab_contenu=mysql_fetch_array($req)){
 
 
?> 
<tr>
<td><center><?php echo $tab_contenu['Arexx_index']; ?></center></td> 
<td><center><?php echo $tab_contenu['Arexx_Name']; ?></center></td> 
<td><center><?php echo $tab_contenu['Arexx_Id']; ?></center></td> 
<td><center><?php echo $tab_contenu['Arexx_Type']; ?></center></td> 
<td><center><?php echo $tab_contenu['Arexx_Table']; ?></center></td>
<section title=".squaredFour">
    <!-- .squaredFour -->
    <div class="squaredFour">
     <td style="text-align:center;width:20%;"><input type="checkbox" id="squaredFour" name="champ[]" value="<?php echo $tab_contenu['Arexx_index']; ?>" /></td>
 
 
      <label for="squaredFour"></label> 
    </div>
    <!-- end .squaredFour -->
  </section>
 <td class="controlTd">
      <div class="settingsIcons">
        <span class="settingsIcon"><img src="http://i.imgur.com/nnzONel.png" alt="X" /></span>
        <span class="settingsIcon"><img src="http://i.imgur.com/UAdSFIg.png" alt="placeholder icon" /></span>
        <div class="settingsIcon"><img src="http://i.imgur.com/UAdSFIg.png" alt="placeholder icon" /></div>
      </div>  
    </td>
</tr> 
 
<?php 
} 
 
?> 
</table>
Un très grand merci à vous tous !
Bonne journée/matinée/soirée.

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

27 déc. 2014, 14:40

salut,

requête inutile : mysql_query("SELECT `Arexx_Table` FROM `tp_arexx_capteurs` WHERE `Arexx_Table`='$numero_article'");
tu sais déjà ce que va retourner la requête puisse tu ne prend que la colonne correspondant au prédicat.
en clair cela retourne la valeur courante de "numero_article".
idem pour SELECT `Arexx_index` FROM `tp_arexx_capteurs` WHERE `Arexx_index`='$numero_article1'"

tu peux le faire en une seule fois avec la clause in sql avec une seule requête.
<?php

if(!empty($_POST['champ'])) {
    // suppression des lignes
    $delete =  'DELETE FROM tp_arexx_capteurs WHERE Arexx_index in('.implode(',',$_POST['champ']).')';
    // exec
    // suppression des tables
    foreach($_POST['champ'] as $tbl){
        $sql = 'drop table '.$tbl;
        // exec
    }
}
Le fait que tu ais des tables ainsi nommées m'indique un problème de conception tu ne devrais (doit pas) avoir une simple clef étrangère doit faire le boulot.

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

Eléphanteau du PHP | 24 Messages

27 déc. 2014, 14:56

Bonjour et merci d'avoir répondu aussi vite !
J'ai donc remplacé toute ma partie

Code : Tout sélectionner

if(!empty($_POST['champ'])) {
par votre code or cela ne fonctionne pas, je pense plutôt à un problème de mon coter.
Il est vrai que cela ne peut que fonctionner, mais ou doi-je le placer ?
Une petite explication du Foreach aussi si possible, parce'que le Foreach récupére la valeur de 'champ' sauf que celui ci est Arexx_index, il devrait etre Arexx_Table pour supprimer la table correspondante non ?

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

27 déc. 2014, 16:33

d'après le code indiquer index / table c'est la même chose vu qu'il n'y qu'un champ de formulaire ($champ)

pour foreach : http://www.php.net/foreach

le code fournit est un condensé du tiens, non fonctionnel puisse qu'il manque l’exécution des requêtes.

Après si le code indiqué plus haut n'est pas bon effectivement cela ne fonctionnera pas plus.

Peux tu fournir le mcd de la table ou le create table (avec des commentaires sur les colonnes) pour que l'on puisse voir ce qui ne va pas dans ce qui a été fait ?

A mon avis la requête pour le nom de table n'est pas bon. ce qui voudrait dire qu'il faut

- un select pour les nom des tables
- faire les drop table dans le traitement du résultat du select
- free result
- delete comme j'ai indiqué dans mon premier message.

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

Eléphanteau du PHP | 24 Messages

27 déc. 2014, 16:46

Voici la structure de ma base de donnés, le but étant de supprimer la table correspondante ( Arexx_Table ) lors de la suppression d'une ligne, grâce a une checkbox j'ai toujours le meme code.
En vous remerciant
BDD.png
.
struct.png
Table.png
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

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

27 déc. 2014, 16:56

C'est simple, ton problème est essentillement à lié à un copier coller mal modifié.
<?php

if(!empty($_POST['champ'])) {
    // selection des noms de tables
    $sql = 'select Arexx_Table FROM tp_arexx_capteurs WHERE Arexx_index in('.implode(',',$_POST['champ']).')';
    $req = mysql_query($sql);
    while($d = mysql_fetch_assoc($req)) {
        $sql = 'drop table '.$d['Arexx_Table'];
        // exec
    }
    mysql_free_result($req);
    // suppression des lignes
    $delete =  'DELETE FROM tp_arexx_capteurs WHERE Arexx_index in('.implode(',',$_POST['champ']).')';
    // exec
}
 
Je pense qu'il est préférable de revoir le modèle maintenant plutôt que plus tard afin de faire quelque chose de correcte et maintenable maintenant (a moins que tu n'essai de te créer du taf bien entendu :lol: )

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

Eléphanteau du PHP | 24 Messages

27 déc. 2014, 17:15

Merci beaucoup, j'y suis presque seulement cela m'affiche une erreur :
Warning: mysql_fetch_array() expects parameter 5 to be resource, null given in C:\Program Files (x86)\EasyPHP-DevServer-14.1VC11\data\localweb\tp_arexx\Tableau\index.php on line 159
Voici le nouveau code :
<?php
/* ------------------ CASE A COCHER ------------------ */
 // connexion
$mysql_user="admin";
$mysql_password="admin";
$reqco = mysql_connect("localhost",$mysql_user,$mysql_password);

//sélection de la BDD
$reqse = mysql_select_db("tp_arexx",$reqco);

//résupération des informations
$reqt=mysql_query("SELECT * FROM tp_arexx_capteurs",$reqco);
if ( $reqco == NULL ) 
{ 
    echo " Cet agent n'a participé à aucune session."; 
} 

/* ------------------ CASE A COCHER ------------------ */

if(!empty($_POST['champ'])) {
    // selection des noms de tables
    $sql = 'select Arexx_Table FROM tp_arexx_capteurs WHERE Arexx_index in('.implode(',',$_POST['champ']).')';
    $req = mysql_query($sql);
    while($d = mysql_fetch_assoc($req)) {
        $sql = 'drop table '.$d['Arexx_Table'];
        // exec
    }
    mysql_free_result($req);
    // suppression des lignes
    $delete =  'DELETE FROM tp_arexx_capteurs WHERE Arexx_index in('.implode(',',$_POST['champ']).')';
    // exec
}
	

 


/* ------------------ A partir d'ici table : alimentaire Lecture ------------------ */
$reponse = mysql_query("SELECT * FROM tp_arexx_capteurs"); // Requête SQL
?>

 
 <form method="POST" id="form" name="form">
 
 <div class="top-shadow">
<table class="flatTable" table border="0" CELLSPACING="0" >
  <tr class="titleTr">
    <td class="titleTd">Liste des capteurs</td>
    <td colspan="4"></td>
    <td class="plusTd button"></td>

				    <td class="plusTd3 button"></td>
	</div>
	
  </tr>
  <tr class="headingTr">
 <td><center>Index du capteur</center></td> 
<td><center>Nom du capteur</center></td> 
<td><center>Identifiant du capteur</center></td> 
<td><center>Type du capteur</center></td> 
<td><center>Table correspondant au capteur</center></td>
<td><center>Supprimer le capteur</center></td>
<td><center>Supprimer la table correspondante au capteur</center></td>
    <td></td>
  </tr>


<?php
//Affichage des informations

while ($tab_contenu=mysql_fetch_array($reqt)){


?> 
<tr>
<td><center><?php echo $tab_contenu['Arexx_index']; ?></center></td> 
<td><center><?php echo $tab_contenu['Arexx_Name']; ?></center></td> 
<td><center><?php echo $tab_contenu['Arexx_Id']; ?></center></td> 
<td><center><?php echo $tab_contenu['Arexx_Type']; ?></center></td> 
<td><center><?php echo $tab_contenu['Arexx_Table']; ?></center></td>
<section title=".squaredFour">
    <!-- .squaredFour -->
    <div class="squaredFour">
     <td style="text-align:center;width:20%;"><input type="checkbox" id="squaredFour" name="champ[]" value="<?php echo $tab_contenu['Arexx_index']; ?>" /></td>
	

      <label for="squaredFour"></label> 
    </div>
    <!-- end .squaredFour -->
  </section>
 <td class="controlTd">
      <div class="settingsIcons">
        <span class="settingsIcon"><img src="http://i.imgur.com/nnzONel.png" alt="X" /></span>
        <span class="settingsIcon"><img src="http://i.imgur.com/UAdSFIg.png" alt="placeholder icon" /></span>
        <div class="settingsIcon"><img src="http://i.imgur.com/UAdSFIg.png" alt="placeholder icon" /></div>
      </div>  
    </td>
</tr> 

<?php 
} 

?> 
</table>

Sa ne serait pas le fait qu'il y est deux fois la variable $req ? J'ai essayer mais cela ne fonctionne pas quand même
Modifié en dernier par moogli le 28 déc. 2014, 00:52, modifié 1 fois.
Raison : Bbcode php

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

28 déc. 2014, 12:07

Je vois que
- tu n'as finis le code que je t'ai fournis dans ton précédent message.
- tu ne regarde pas çe que fait. Tu utilise des variables de façon illogique.

Le cas qui te pose problème c'est que veux afficher les résultats qui se trouvent dans $response et non $reqt !


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

Eléphanteau du PHP | 24 Messages

28 déc. 2014, 15:29

Ah oui après deux bonnes heures je viens de comprendre, a la place de //exec il faut que j'ajoute une ligne pour les exécuter ?
Parce'que en effet en ayant remplacer reqt par réponse sa m'affiche plus aucune erreur mais rien ne se passe donc je pense que c'est ça le problème ?

Eléphanteau du PHP | 24 Messages

28 déc. 2014, 15:52

Parfait, sa marche impec un grand grand merci!
Seulement un petit truck si je met en Arexx_Table un chiffre et non pas quelquechose en toute lettre ( ce qui fonctionne ), que doi-je rajouter pour qu'il prenne en compte aussi les nombres car sinon ce la m'affiche des erreur de Booleen :

Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in C:\Program Files (x86)\EasyPHP-DevServer-14.1VC11\data\localweb\tp_arexx\Tableau\index.php on line 75

Warning: mysql_free_result() expects parameter 1 to be resource, boolean given in C:\Program Files (x86)\EasyPHP-DevServer-14.1VC11\data\localweb\tp_arexx\Tableau\index.php on line 79

ce qui est de ce fait, compréhensible or je trouve trés peu de doc's sur internet à ce sujet! Merci
<?php
if(!empty($_POST['champ'])) {
    // selection des noms de tables
    $sql = 'select Arexx_Table FROM tp_arexx_capteurs WHERE Arexx_index in('.implode(',',$_POST['champ']).')';
    $req = mysql_query($sql);
    while($d = mysql_fetch_assoc($req)) {
        $sql = 'DROP TABLE '.$d['Arexx_Table'];
        $req = mysql_query($sql);
    }
    mysql_free_result($req);
    // suppression des lignes
    $delete =  'DELETE FROM tp_arexx_capteurs WHERE Arexx_index in('.implode(',',$_POST['champ']).')';
	$req1 = mysql_query($delete);
    
}
        

 ?>