Aide au raisonnement

JVL
Eléphant du PHP | 76 Messages

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.

Eléphant du PHP | 422 Messages

02 juil. 2014, 15:20

hello

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

++
toujours faire une recherche sur http://www.php.net et/ou sur http://www.google.fr :)
utiliser http://ideone.com/ pour vos codes :)

JVL
Eléphant du PHP | 76 Messages

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 ?

Eléphant du PHP | 422 Messages

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
toujours faire une recherche sur http://www.php.net et/ou sur http://www.google.fr :)
utiliser http://ideone.com/ pour vos codes :)

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

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][]

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

JVL
Eléphant du PHP | 76 Messages

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 
		} ?>

Mammouth du PHP | 2278 Messages

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
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

JVL
Eléphant du PHP | 76 Messages

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]"));
		
		
		
		
		}
		
		
		}

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

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.

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

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

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]));
               
              }
        }
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène