Aide au raisonnement

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Aide au raisonnement

Re: Aide au raisonnement

par sadeq » 03 juil. 2014, 16:12

Bonjour, Voici l'explication :

1. D'abord je vais remplacer le nom "array" que t'as choisi par un nom plus lisible comme "tab_mois".

2. Du coup, ton formulaire doit envoyer par POST des champs sous forme de tableau comme :
tab_mois['2014-JAN'][1], tab_mois['2014-JAN'][2], tab_mois['2014-JAN'][3], tab_mois['2014-FEV'][1], tab_mois['2014-FEV'][2], tab_mois['2014-FEV'][3], ...

C'est pour cela qu'on doit coder le tableau comme ça dans HTML :
$mois = $donnees->mois;
echo '<tr><input type=hidden name="id" value="\''.$donnees->ID_detail,'\'"/>
                                        <td> '.$mois.'</td>
                                        <td> <input type="text" name="tab_mois['.$mois.'][1]"/> </td>
                                        <td> <input type="text" name="tab_mois['.$mois.'][2]"/> </td>
                                        <td> <input type="text" name="tab_mois['.$mois.'][3]"> </td> </tr>';
3. En PHP, on va donc recevoir un tableau via $_POST nommé : $_POST["tab_mois"] qui contient un premier niveau listant les mois : ['2014-JAN'], ['2014-FEV'], ...
et dans chaque nœud/mois on retrouve 3 cases de valeurs : [1], [2] et [3] (correspondant aux champs input du formulaire)

La structure est donc comme ceci:
$_POST["tab_mois"] = array ( ['2014-JAN'] => array ( [1]=>'blabla' , [2]=>'blabla' , [3]=>'blabla' ) , ['2014-FEV'] => array ( [1]=>'blabla' , [2]=>'blabla' , [3]=>'blabla' ), ... )

4. On peut donc récupérer les 3 données de chaque mois en parcourant le tableau $_POST["tab_mois"] par un foreach. Comme ça:
$tab_mois = isset($_POST['tab_mois']) ? $_POST['tab_mois'] : null;
foreach( $tab_mois as $mois=>$donnees ){   //ici: $donnees contient les 3 valeurs [1],[2] et [3] de l'index $mois
                $update = $bdd->prepare('UPDATE `detail_affaire` SET `Etude_p`=:etude,`Chantier_p`=:chantier,`Mes_p`= :mes WHERE `ID_detail` =:id');
                $update->execute(array('etude'=>$donnees[1],
                                                     'chantier'=>$donnees[2],
                                                     'mes'=>$donnees[3],
                                                     'id'=>$_POST[id]));
}

Voici donc le correctif :
<?php  
        include("connection.php");
       
        if(isset($_GET['id']) && $_GET['id'] != "0")
                {
?>
                <html>
                <link rel="stylesheet" type="text/css" href="css.css" />
                <div class="datagrid"><form method="post" action="ajoutdetail.php"><table> <thead><tr><th>Mois</th><th>Etude Prévisionelle (en %)</th><th>Chantier Prévisionelle (en %)</th><th>Mise en Service Prévisionelle (en %)</th></tr></thead>
                <tbody>
               
<?php
                $format = "%y-%b";
                $i=0;
                $nb_detail = $bdd->query('SELECT `ID_detail`,DATE_FORMAT(`Mois`,\''.$format.'\') as mois FROM `detail_affaire`  WHERE `ID_affaire` = \''.$_GET['id'].'\'');
                while($donnees = $nb_detail->fetch(PDO::FETCH_OBJ)){
                $mois = $donnees->mois;
                echo '<tr><input type=hidden name="id" value="\''.$donnees->ID_detail,'\'"/>
                                        <td> '.$mois.'</td>
                                        <td> <input type="text" name="tab_mois['.$mois.'][1]"/> </td>
                                        <td> <input type="text" name="tab_mois['.$mois.'][2]"/> </td>
                                        <td> <input type="text" name="tab_mois['.$mois.'][3]"> </td> </tr>';
                $i = $i+1;
                }
 ?>
                <tr><center><input type='submit' name='savedetail' value='Enregistrer'/></center></tr>
                </tbody><table></form></div></html>
  <?php
         }

         //---------------------------------------------------------------------//
        // debug : affichage du postage (à désactiver si tout est ok)
        //--------------------------------------------------------------------//
        echo "<pre>"; print_r($_POST); echo "</pre>";
        //--------------------------------------------------------------------//


         //Mise à jour de la BD
         $tab_mois = isset($_POST['tab_mois']) ? $_POST['tab_mois'] : null;

         if(isset($_POST['savedetail']) && $_POST['savedetail'] != "0" &&  $tab_mois != null){
              
             foreach( $tab_mois as $mois=>$donnees){  //ici: $donnees contient les 3 valeurs [1],[2] et [3] de l'index $mois
                
                $update = $bdd->prepare('UPDATE `detail_affaire` SET `Etude_p`=:etude,`Chantier_p`=:chantier,`Mes_p`= :mes WHERE `ID_detail` =:id');
                $update->execute(array('etude'=>$donnees[1],
                                                     'chantier'=>$donnees[2],
                                                      'mes'=>$donnees[3],
                                                      'id'=>$_POST[id]));
               
              }
        }

Re: Aide au raisonnement

par moogli » 03 juil. 2014, 14:58

tu te rend compte que tu travail avec des string délimitées par des simple quote et que tu met des variables dedans ?
<?php
 echo '<tr><input type=hidden name="id" value="\''.$donnees->ID_detail,'\'"/>
                                        <td> '.$mois.'</td>
                                        <td> <input type="text" name="$array[$mois][1]"/> </td>
                                        <td> <input type="text" name="$array[$mois][2]"/> </td>
                                        <td> <input type="text" name="$array[$mois][3]"> </td> </tr>';
une solution
 
<?php
echo '<tr><input type=hidden name="id" value="\''.$donnees->ID_detail,'\'"/>
                                        <td> '.$mois.'</td>
                                        <td> <input type="text" name="array['.$mois.'][]"/> </td>
                                        <td> <input type="text" name="array['.$mois.'][]"/> </td>
                                        <td> <input type="text" name="$rray['.$mois.'][]"> </td> </tr>';
tu auras un tableau 2D dans $_POST['array']

ceci dit il te manque une données, un label pour expliquer a quoi servent ces champs etc.

@+

Re: Aide au raisonnement

par JVL » 03 juil. 2014, 14:29

Help, je ne voit pas comment faire pour utiliser les tableau 2D.


<?php	
	include("connection.php");
	
	if(isset($_GET['id']) && $_GET['id'] != "0")
		{ 
		?>
		<html>
		<link rel="stylesheet" type="text/css" href="css.css" /> 
		<div class="datagrid"><form method="post" action="ajoutdetail.php"><table> <thead><tr><th>Mois</th><th>Etude Prévisionelle (en %)</th><th>Chantier Prévisionelle (en %)</th><th>Mise en Service Prévisionelle (en %)</th></tr></thead>
		<tbody>
		
		<?php
		$format = "%y-%b";
		$i=0;
		$nb_detail = $bdd->query('SELECT `ID_detail`,DATE_FORMAT(`Mois`,\''.$format.'\') as mois FROM `detail_affaire`  WHERE `ID_affaire` = \''.$_GET['id'].'\'');
		while($donnees = $nb_detail->fetch(PDO::FETCH_OBJ)){
		$mois = $donnees->mois;
		echo '<tr><input type=hidden name="id" value="\''.$donnees->ID_detail,'\'"/>
					<td> '.$mois.'</td>
					<td> <input type="text" name="$array[$mois][1]"/> </td>
					<td> <input type="text" name="$array[$mois][2]"/> </td>
					<td> <input type="text" name="$array[$mois][3]"> </td> </tr>';
		$i = $i+1;
		}
		?>
		<tr><center><input type='submit' name='savedetail' value='Enregistrer'/></center></tr>
		</tbody><table></form></div></html>
		
		
	<?php
		}
		if(isset($_POST['savedetail']) && $_POST['savedetail'] != "0"){ 
		
		for($m=0;$m<=$i;$m++){
		
		$update = $bdd->prepare('UPDATE `detail_affaire` SET `Etude_p`=:etude,`Chantier_p`=:chantier,`Mes_p`= :mes WHERE `ID_detail` =:id');
		$update->execute(array('etude'=>"$array[$mois][1]",
							   'chantier'=>"$array[$mois][2]",
							   'mes'=>"$array[$mois][3]",
							   'id'=>"$_POST[id]"));
		
		
		
		
		}
		
		
		}

Re: Aide au raisonnement

par sirakawa » 03 juil. 2014, 10:19

Regarde le code que ça produit dans ton navigateur.
Quant à moi:
Original:
          echo '<tr><input type=hidden value="\''.$donnees->ID_detail,'\'"><td> '.$donnees->mois,'</td><td> <input type="text" name="$array[$donnees->mois][1]"> </td><td> <input type="text" name="$array[$donnees->mois][2]"> </td><td> <input type="text" name="$array[$donnees->mois][3]"> p</td></tr>';
Suggestion
  $detail =   $donnees->ID_detail;
    $mois =  $donnees->mois;
print "<input type = 'hidden'  name = 'mois'  value = '$mois' />"; //ca permet de savoir à quel mois correspondent les valeurs
print "<input type = 'hidden' value = '$detail' /> "; //où est le name?
print " <input type='text' name='mois][1]' />"; // comme indiqué par moogli et le /> est dans la norme

Re: Aide au raisonnement

par JVL » 03 juil. 2014, 09:12

Bonjour,
Merci de répondre, je pense avoir compris, est-ce une démarche du genre ?
<?php	
	include("connection.php");
	if(isset($_GET['id']) && $_GET['id'] != "0")
		{ 
		?>
		
		<link rel="stylesheet" type="text/css" href="css.css" /> 
		<div class="datagrid"><table> <thead><tr><th>Mois</th><th>Etude Prévisionelle (en %)</th><th>Chantier Prévisionelle (en %)</th><th>Mise en Service Prévisionelle (en %)</th></thead>
		<tbody>
		
		<?php
		$format = "%y-%b";
		$nb_detail = $bdd->query('SELECT `ID_detail`,DATE_FORMAT(`Mois`,\''.$format.'\') as mois FROM `detail_affaire`  WHERE `ID_affaire` = \''.$_GET['id'].'\'');
		while($donnees = $nb_detail->fetch(PDO::FETCH_OBJ)){
		
		echo '<tr><input type=hidden value="\''.$donnees->ID_detail,'\'"><td> '.$donnees->mois,'</td><td> <input type="text" name="$array[$donnees->mois][1]"> </td><td> <input type="text" name="$array[$donnees->mois][2]"> </td><td> <input type="text" name="$array[$donnees->mois][3]"> p</td></tr>';
		
		}
		?>
		</tbody><table></div>
		
		
		<?php 
		} ?>

Re: Aide au raisonnement

par moogli » 02 juil. 2014, 19:10

alors nommer les inputs $mois_1 c'est une très mauvaise idée.

utiliser la notation tableau est une meilleur idée ;)

mais pas en nommant avec le mois car c'est une données aléatoire.

avec un tableau a deux dimensions ça devrait le faire
input[le mois][]

@+

Re: Aide au raisonnement

par telnes » 02 juil. 2014, 16:01

hello

name=juin_1
name=juin_2
name=juin_3

je pense qu'un name=juin[1] ... ca doit faire un tableau dans $_GET ou $_POST

Re: Aide au raisonnement

par JVL » 02 juil. 2014, 15:43

Merci de répondre,

D'accord mais il y a 3 inputs par ligne(mois) comment les reconnaître, les différencier ?

Re: Aide au raisonnement

par telnes » 02 juil. 2014, 15:20

hello

les champs input on un attribut "name", renseigne le mois dedans

++

Aide au raisonnement

par JVL » 02 juil. 2014, 15:01

Bonjour,

Je vais essayer d'expliquer le problème clairement: j'ai un premier formulaire qui propose de saisir 2 dates, ensuite une fonction qui compte le nombre de mois d'intervalle, et pour chaque mois d'intervalle je crée un enregistrement ( `mois`). Mon deuxième formulaire récupère le nombre de mois et crée une ligne dans tableau par mois, il y a 3 informations en renseigner par ligne. Les lignes du tableau étant généré dynamiquement (while) je ne sais pas comment identifier mes inputs afin d'update le bon Mois.

Merci d'avance,

Cordialement.