IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

PHP post tableau


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 21
    Par défaut PHP post tableau
    Salut a tous

    débutant en développement, je suis en train de me créer une petite interface perso pour gérer mes modules domotique.

    Je créais un tableau a partir du requête qui m'affiche le resultat sur chaque ligne.
    Je souhaite avoir sur chaque ligne un bouton "valider/actualiser" pour pouvoir modifier les informations et ensuite les enregistrer dans une autre base de donnée.

    Mon tableau se construit bien, et les données passent bien dans la BDD en utilisant POST avec du JS.

    Cependant les informations qui sont envoyés en BDD sont toujours ceux de la dernière ligne.

    Ce qui me parait normal étant donnée que les variables auront les dernières infos du while.

    Du coup j'ai essayé de générer un formulaire différent par ligne du tableau, générer des ID dans le while pour les attribuer a chaque bouton "valider" mais rien y fait.

    Comment pourrais je solutionner ca??

    Voici une image de ce que je souhaite faire pour vous donner une idée plus précise.

    Nom : Capture.PNG
Affichages : 301
Taille : 80,5 Ko

  2. #2
    Modérateur
    Avatar de Kreepz
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2011
    Messages : 681
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Ce que tu peux faire et qui normalement n'est pas compliqué est d'attribuer une variable à ton bouton valider ou actualiser, mais tu n'as pas besoin de générer un formulaire différent.

    Car dans ta boucle pour chaque ligne tu peux par exemple mettre l'identifiant du premier en variable dans ton bouton.

    Pourrais-tu montrer ce que tu as essayé?
    Pensez à regarder nos cours et tutoriels PHP ainsi que notre FAQ PHP avant de poser votre question!
    Un message vous a aidé, n'oubliez pas le

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 21
    Par défaut
    Oui biensur.

    Voila le code.

    Ps c'est pas du tout optimisé et code melanger je suis pas un pro... pas encore
    j'essaie de comprendre le fonctionnement des languages.

    Je crois que j'avais essayé de generer une variable pour le bouton. je te l'ai remis dans le code et ca ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    <html>
        <head>
     
    		<!-- Include Fichiers -->
    		<link rel="stylesheet" type="text/css" href="../includes/design.css" media="all"/>
    		 <?php include("../includes/db.php"); ?>
     
    		<!-- Recupere le IdContact -->
    		 <?php $idLogement = $_GET['id']; ?>
    		<script language='javascript' type='text/javascript'>
    			//Script Afficher/Cacher un block
    			function afficher(partie)
    				{
    					document.getElementById(partie).style.display = "block";
    				}
    			function cacher(partie)
    				{
    					document.getElementById(partie).style.display = "none";
    				}
    			//Fin Script Afficher/Cacher un block
     
    			//Script defaut
    			function first()
    			{
    				//section
    				cacher("eclairage");
    				cacher("ouvrant");
    				cacher("chauffage");
    				cacher("securite");
    				cacher("energie");
    				cacher("multimedia");
    				cacher("interaction");
    				cacher("confort");
    				cacher("sante");
    				cacher("autre");
    			}
    			// Fin Script default
     
    			//Script Section afficher cacher
    			function section(exp,dest)
    			{
    				if (exp.checked)
    				{
    					document.getElementById(dest).style.display = "block";
    				}
    				else
    				{
    					document.getElementById(dest).style.display = "none";
    				}
    			}
     
    		//Ajout formulaire BDD
    		function add(formulaire)
    		{
    			var id = formulaire.elements['id'].value;
    			var idPiece = formulaire.elements['idPiece'].value;
    			var typeModule = formulaire.elements['typeModule'].value;
    			var nomModule = formulaire.elements['nomModule'].value;
    			var securite = formulaire.elements['securite'].value;
    			var energie = formulaire.elements['energie'].value;
    			var ouvrant = formulaire.elements['ouvrant'].value;
    			$.ajax({
    				url : 'fichepreinstallation.php?id=' + id,
    				type : 'POST',
    				data : 'idPiece=' + idPiece + '&typeModule=' + typeModule + '&nomModule=' + nomModule + '&securite=' + securite + '&energie=' + energie + '&ouvrant=' + ouvrant,
    				dataType : 'html'
    				//success : function(code_html, statut)
    				//{},
    				//error : function(resultat, statut, erreur)
    				//{},
    				//complete : function(resultat, statut)
    				//{}
    			});
    		}	
     
    		</script>
     
        </head>
        <style>
     
        </style>
        <body>
    		<?php
    			//Fonctions PHP
    			function cocher($id, $name)
    			{
    				if ($name == 1)
    				{
    					echo "<script language='javascript' type='text/javascript'>
    							document.getElementById('".$id."').checked = true;
    						  </script>";
    				}
    				else
    				{
    					echo "<script language='javascript' type='text/javascript'>
    							document.getElementById('".$id."').checked = false;
    						  </script>";
    				}
    			}
     
    			function afficheDiv($id, $name)
    			{
    				if ($name == 1)
    				{
    					echo "<script language='javascript' type='text/javascript'>
    							document.getElementById('".$id."').style = block;
    						  </script>";
    				}
    				else
    				{
    					echo "<script language='javascript' type='text/javascript'>
    							document.getElementById('".$id."').style = none;
    						  </script>";
    				}
    			}
     
    			//Generation  nom ouvrant
    			function nomOuvrant($typeOuvrant, $quantiteOuvrant, $i)
    			{
    				if ($quantiteOuvrant == 1)
    				{
    					$quantiteOuvrant = "";
    				}
    				else
    				{
    					$quantiteOuvrant = $quantiteOuvrant - 1 + $i;
    				}
    				$nomOuvrant = $typeOuvrant. ' ' .$quantiteOuvrant;
    				return $nomOuvrant;
    			}
    			//Fin Fonctions
     
     
    			//Lecture info BDD au chargement
     
    			$sql = 'SELECT *
    					FROM besoinDomotique
    					WHERE id = "'.$idLogement.'"'; 
    			$result = mysql_query($sql) or die('Erreur SQL ! '.$sql.'<br>'.mysql_error());	
    			while($row = mysql_fetch_assoc($result))
    			{
    				$securiteOuverture = $row['securiteOuverture'];
    				$securiteMouvement = $row['securiteMouvement'];
    				$securiteSireneInt = $row['securiteSireneInt'];
    				$securiteSireneExt = $row['securiteSireneExt'];
    				$securiteVr = $row['securiteVr'];
    				$securiteCamExt = $row['securiteCamExt'];
    				$securiteCamInt = $row['securiteCamInt'];
    				$securiteIncendie = $row['securiteIncendie'];
    				$securiteGaz = $row['securiteGaz'];
    				$securiteBtPanic = $row['securiteBtPanic'];
    				$securiteChute = $row['securiteChute'];
    				$securiteInondation = $row['securiteInondation'];
    				$panneElectro = $row['panneElectro'];
    				$panneElec = $row['panneElec'];
    				$panneInternet = $row['panneInternet'];
    				$consoElec = $row['consoElec'];
    				$consoEau = $row['consoEau'];
    				$consoGaz = $row['consoGaz'];
    				$ampouleBc = $row['ampouleBc'];
    				$lumiereAuto = $row['lumiereAuto'];
    				$appareilVeille = $row['appareilVeille'];
    				$arrosage = $row['arrosage'];
    				$chauffageZone = $_POST['chauffageZone'];
    				$surconsommationEau = $row['surconsommationEau'];
    				$chauffageOuverture = $row['chauffageOuverture'];
    				$chauffageVr = $row['chauffageVr'];
    				$lumiereGestion = $row['lumiereGestion'];
    				$lumiereAmbiance = $row['lumiereAmbiance'];
    				$ouvrantVr = $row['ouvrantVr'];
    				$ouvrantPortail = $row['ouvrantPortail'];
    				$ouvrantGarage = $row['ouvrantGarage'];
    				$ouvrantOuverture = $row['ouvrantOuverture'];
    				$controleTv = $row['controleTv'];
    				$controleHc = $row['controleHc'];
    				$multiroomAudio = $row['multiroomAudio'];
    				$multiroomVideo = $row['multiroomVideo'];
    				$WoL = $row['WoL'];
    				$sonnette = $row['sonnette'];
    				$bal = $row['bal'];
    				$videoPhone = $row['videoPhone'];
    				$reveil = $row['reveil'];
    				$hoteCuisine = $row['hoteCuisine'];
    				$litChauffant = $row['litChauffant'];
    				$airQualite = $row['airQualite'];
    				$airPurificateur = $row['airPurificateur'];
    				$luminotherapie = $row['luminotherapie'];
    				$sommeil = $row['sommeil'];
    				$aromatherapie = $row['aromatherapie'];
    				$autre = $row['autre'];
    				$tabletteNomade = $row['tabletteNomade'];
    				$tabletteFixe = $row['tabletteFixe'];
    				$smartphone = $row['smartphone'];
    				$vocal = $row['vocal'];
    				$rfid = $row['rfid'];
    				$gps = $row['gps'];
    				$notifSms = $row['notifSms'];
    				$notifAppel = $row['notifAppel'];
    				$notifEmail = $row['notifEmail'];
    				$notifVocal = $row['notifVocal'];
    				$notifVisuelle = $row['notifVisuelle'];
    			}
     
    			//Traitement formulaire
    			if (isset($_POST['valider']))
    			{
    				//include("../includes/db.php");
     
    				//On recupere les valeurs du formulaire
    				$idLogement = $_POST['idLogement'];
    				$idPiece = $_POST['idPiece'];
    				$typeModule = $_POST['typeModule'];
    				$nomModule= $_POST['nomModule'];
    				$securite = $_POST['securite'];
    				$energie = $_POST['energie'];
    				$ouvrant = $_POST['ouvrant'];
     
    				//Ajout informations 
     
    				//creation requete SQL
    				$sql = 'INSERT INTO moduleDomotique (id, nomModule, typeModule, idModeleModule, idPiece, securite, energie, eclairage, ouvrant, multimedia, confort, sante, autre, interaction, idLogement) VALUES (id, "'.$nomModule.'", "'.$typeModule.'", "", "'.$idPiece.'", "'.$securite.'", "'.$energie.'", "", "'.$ouvrant.'", "", "", "", "", "", "'.$idLogement.'")';
     
    				// on envoie la requéte 
    				mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
     
    				//Fermeture connexion SQL
    				mysql_close(); // Connection Closed
     
    				//redirection page contact
    				//header('location: fichepreinstallation.php?id='.$id.'');
    			}
     
    		?>
    		<div id = "principal">
     
    			<div id="Module">
    				<h2>Module</h2>
    				<div id="DetecteurOuverture">
    					<h3>Detecteur Ouverture</h3>
    					<?php
    						if (($securiteOuverture == 1) or ($chauffageOuverture == 1) or ($ouvrantOuverture == 1)) 
    						{
     
    							echo '<table border class="designTable">
    								<tr>
    									<td>Piece</td>
    									<td>Type</td>
    									<!--<td>Modele Module</td>-->
    									<td>Nom</td>
    									<td>Systeme de securite</td>
    									<!--<td>Installé</td>-->
    									<td>Coupure Chauffage</td>
    									<!--<td>Installé</td>-->
    									<td>Verification Ouverture</td>
    									<!--<td>Installé</td>-->
    									<td>Actualiser</td>
    								</tr>';
     
    							//recupere liste des ouvrants par pieces
    							$sql = 'SELECT piece.id as idPiece, piece.nom as nomPiece, ouvrant.id as idOuvrant, ouvrant.ouvrant as typeOuvrant, ouvrant.quantite as quantiteOuvrant
    							FROM ouvrant
    							INNER JOIN piece
    							ON ouvrant.idPiece = piece.id
    							WHERE idLogement = "'.$idLogement.'"'; 
    							$result = mysql_query($sql) or die('Erreur SQL ! '.$sql.'<br>'.mysql_error());	
    							//Id des checkbox pour generer id unique
    							$y=0;
    							while($row = mysql_fetch_assoc($result))
    							{
    								//recupere la quantite de type ouvrant par piece
    								$quantiteOuvrant = $row['quantiteOuvrant'];
    								$i=0;
    								while ($i < $quantiteOuvrant)
    								{
    									//Id des checkbox pour generer id unique
    									$yi = $y.$i;
     
    									//creation du tableau
    									echo '<tr>
    											<!--Debut Formulaire-->
    										<form action="fichepreinstallation.php" method="POST" onsubmit="add(this);"/>
    										<!--Recupere idClient-->
    										<input type="hidden" id="idLogement" name="idLogement" value="'.$idLogement.'" />
    										<!--Formulaire champs cache idPiece-->
    										<input type="hidden" id="idPiece" name="idPiece" value="'.$row["idPiece"].'" />
    											<td>' .$row["nomPiece"]. '</td>
    											<td><input type="hidden" id="typeModule" name="typeModule" value="Détecteur Ouverture"/>'.$row["typeOuvrant"].'</td>
    											<td><input type="text" id="nomModule'.$yi.'" name="nomModule" value="'.nomOuvrant($row["typeOuvrant"], $row['quantiteOuvrant'], $i).'"/></td>';
    									//Colonne Securite
    									echo	'<td>Oui<input type="checkbox" id="ouvrantSecu'.$yi.'" name="securite" value=1 /></td>';
    									//Cocher Automatiquement Securite
    									cocher('ouvrantSecu'.$yi, $securiteOuverture);
     
    									//Colonne Chauffage
    									echo	'<td>Oui<input type="checkbox" id="ouvrantChauffage'.$yi.'" name="energie" value=1 /></td>';
    									//Cocher Automatiquement Chauffage
    									cocher('ouvrantChauffage'.$yi, $chauffageOuverture);
     
    									//Colonne Verification Ouverture
    									echo	'<td>Oui<input type="checkbox" id="ouvrantOuverture'.$yi.'" name="ouvrant" value=1 /></td>';
    									//Cocher Automatiquement Controle Ouverture
    									cocher('ouvrantOuverture'.$yi, $ouvrantOuverture);
     
    									echo	'<td><input type="submit" id="valider'.$yi.'" name="valider'.$yi.'" value="valider'.$yi.'"/></td>
    										</tr>';	
    									$i++;
    								}
    								$y++;
    							}
    							echo '</table>';
    							//Fin Formulaire
    							echo '</form>';
    							echo '</br>';
    							// Total ouvertures (portes/fenetres)
    							$total = $y + $i;
    							echo '<table class="designTable">
    									<tr>
    										<td>Total des ouvertures (portes/fenetres)</td>
    										<td>'.$total.'</td>
    									</td>
    								</table>';
     
    						}		
    					?>
    				</div>
    				<div id="detecteurMouvement">
    					<h3>Detecteur Mouvement</h3>
     
     
    				</div>
    				<div id="securiteNotif">
     
    				</div>
    			</div>
     
    			<div id="energie">
     
    			</div>
     
    			<div id="chaufage">
     
     
    			</div>
     
    			<div id="eclairage">
     
     
    			</div>
     
    			<div id="ouvrant">
     
     
    			</div>
     
    			<div id="multimedia">
     
     
    			</div>
     
    			<div id="confort">
     
     
    			</div>
     
    			<div id="sante">
     
     
    			</div>
     
    			<div id="autre">
     
     
    			</div>
     
    			<div id="interaction">
     
     
    			</div>
     
    		</br>
    			<a href="../ficheclient.php?id= echo $id; ?> ">Retour fiche client</a>
    		</div>
    	</body>
    </html>

  4. #4
    Modérateur
    Avatar de Kreepz
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2011
    Messages : 681
    Billets dans le blog
    1
    Par défaut
    Je serais toi déjà j'aurais plutôt utilisé la variable $idLogement qu'une variable incrémentée par ta boucle.

    Sinon pour ma part sur les différents sites que j'ai pu faire, je met un bouton avec un logo à la place de ton valider et j'y met un menu déroulant, ainsi j'ai un bouton pour n actions.
    Nom : MView  Liste Utilisateurs - Google Chrome.jpg
Affichages : 281
Taille : 8,6 Ko

    Après libre à toi de faire ce que tu veux ^^

    Ou il faut que lors du clique sur le valider tu puisse récupérer l'ID de la ligne pour l'utiliser dans l'action de ton form.
    (Je suis clair? )
    Pensez à regarder nos cours et tutoriels PHP ainsi que notre FAQ PHP avant de poser votre question!
    Un message vous a aidé, n'oubliez pas le

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 21
    Par défaut
    $idLogement est une variable unique elle me sert à faire les INNER JOIN dans la base de donnée.
    Une piece appartient à un Logement et un logement appartient à un client.

    L'idée de ton bouton est super mais je pense que c'est encore trop tot pour moi pour implementé ca. Sinon je l'aurais fais genre (Ajouter/Editer/Supprimer) ca pourrait me simplifier la vie. Mais le POST JS me rend la tache plus compliqué.

    Concernant pour récupéré la ligne du tableau j'y avais pensé, mais comment faire??

    $x = 0;
    while(...)
    {
    echo '<tr>
    <td> <input type="hidden" id="tableRow" name="tableRow" value='.$x.'/></td>
    </tr>;
    $x++;
    }

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Salut,

    Surtout au début je trouve qu'il est bien plus facile et pédagogique de générer un formulaire par bouton valider dans la boucle.

    Faudrait faire plus de tutos avant de commencer à coder.

    Et faire des essais sur certaines parties de code dans des pages séparées. Là tu as beaucoup trop de code pour faire des essais ciblés qui te permettrait de comprendre le fonctionnement. Faut séparer les problèmes.

    Au passage, il n'est pas recommandé aujourd'hui d'utiliser l'extension mysql qui est dépréciée. Utilises plutôt pdo.

    Dans ton cas la balise de fermeture du formulaire se trouve à l'extérieur de ta boucle. Il faudrait qu'elle soit à l'intérieur.

    Sinon quand on écrit du html avec php tu n'es pas obligé d'utiliser systématiquement un echo. C'est souvent plus pratique et lisible de fermer les balises php pour ne les ouvrir que si besoin par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php foreach($toto as $value)
    {?>
        <div id="mon_id">valeur : <?=$value?></div>; 
        <p>permet d'écrire avec la syntaxe html classique sans avoir besoin d'échapper les quotes ou doubles quotes</p>
    <?php } ?>

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 21
    Par défaut
    Bien sur j'ai fais des tutoriels PHP avant mais avec le temps j'ai eu de nouvelles idées plus complexe a mettre en place.

    Je viens de suivre tes conseils et effectivement le code est plus lisible.

    Par contre pour le formulaire je viens de faire le test en mettant la fermeture du formulaire dans la boucle. mais dans le debug de chrome voila ce qu'il me mets


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <form action="fichepreinstallation.php" method="POST" onsubmit="add(this);"></form>
    La c'est sur que ça peut pas fonctionner. Pourtant je ferme le formulaire avant mon $i++;

  8. #8
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Je t'ai déjà indiqué la façon de faire pour progresser. Dans une page séparée tu fais un minimum de code fonctionnel pour comprendre le principe et ensuite tu pourras adapter à ton code final.

    Fais voir un exemple de ce code minimum, on saura plus facilement te conseiller sur les points que tu ne comprendrais pas, et cela permettra de mieux séparer les problèmes.

    Faut pas chercher à aller vite avant d'avoir bien compris - et même plus tard on prend son temps car prendre du recul n'est pas une perte de temps - sinon tu obtiendras l'effet inverse en stagnant.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 21
    Par défaut
    voila ma page avec le code de test.

    Ça fonctionne!!

    y'a plus qu'a l'adapter sur l'autre!!

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    <html>
        <head>
    		<?php 	
    			//include
    			include("../includes/db.php");
    		?>
     
    		<script language='javascript' type='text/javascript'>
    			//Ajout formulaire BDD
    			function add(formulaire)
    			{
    				var id = formulaire.elements['id'].value;
    				var idPiece = formulaire.elements['idPiece'].value;
    				var typeModule = formulaire.elements['typeModule'].value;
    				var nomModule = formulaire.elements['nomModule'].value;
    				var securite = formulaire.elements['securite'].value;
    				var energie = formulaire.elements['energie'].value;
    				var ouvrant = formulaire.elements['ouvrant'].value;
    				$.ajax({
    					url : 'fichepreinstallation.php?id=' + id,
    					type : 'POST',
    					data : 'idPiece=' + idPiece + '&typeModule=' + typeModule + '&nomModule=' + nomModule + '&securite=' + securite + '&energie=' + energie + '&ouvrant=' + ouvrant,
    					dataType : 'html'
    					//success : function(code_html, statut)
    					//{},
    					//error : function(resultat, statut, erreur)
    					//{},
    					//complete : function(resultat, statut)
    					//{}
    				});
    			}
    		</script>
    	</head>
     
    	<body>
    		<!--creation du tableau-->
    		<table border class="designTable">
    			<tr>
    				<td>Piece</td>
    				<td>Type</td>
    				<td>Nom</td>
    				<td>Systeme de securite</td>
    				<td>Coupure Chauffage</td>
    				<td>Verification Ouverture</td>
    				<td>Actualiser</td>
    			</tr>
    			<?php
    				//Boucle 
    				$i = 0;
    				while ($i <= 5)
    				{
    					?>	
    					<tr>
    						<!--Debut Formulaire-->
    						<form action="testtab.php" method="POST" onsubmit="add(this);"/>
    							<!--Formulaire champs cache idPiece-->
    							<input type="hidden" id="idLogement" name="idLogement" value="63" />
    							<input type="hidden" id="idPiece" name="idPiece" value="1" />
     
    							<!--Colonne piece-->
    							<td>Salon <?php echo $i;?></td>
     
    							<!--Colonne type-->
    							<td><input type="text" id="typeModule" name="typeModule" value="Détecteur Ouverture<?php echo $i;?>"/></td>
     
    							<!--Colonne nom-->
    							<td><input type="text" id="nomModule" name="nomModule" value="Fenetre Salon<?php echo $i;?>"/></td>
     
    							<!--Colonne Securite-->
    							<td>Oui<input type="checkbox" id="securite" name="securite" value=1 /></td>
     
    							<!--Colonne Chauffage -->
    							<td>Oui<input type="checkbox" id="energie" name="energie" value=1 /></td>
     
     
    							<!--Colonne Verification Ouverture -->
    							<td>Oui<input type="checkbox" id="ouvrant" name="ouvrant" value=1 /></td>
     
    							<!--Bouton valider -->
    							<td><input type="submit" id="valider" name="valider" value="valider<?php echo $i;?>"/></td>
    						</form>
    					</tr>
    					<?php
    					$i++;
    				}
    			?>
    		</table>
    		<?php
    			//traitement formulaire
    			if (isset($_POST['valider'.$yi]))
    			{
    				//On recupere les valeurs du formulaire
    				$idLogement = $_POST['idLogement'];
    				$idPiece = $_POST['idPiece'];
    				$typeModule = $_POST['typeModule'];
    				$nomModule= $_POST['nomModule'];
    				$securite = $_POST['securite'];
    				$energie = $_POST['energie'];
    				$ouvrant = $_POST['ouvrant'];
     
    				//Ajout informations 
     
    				//creation requete SQL
    				$sql = 'INSERT INTO moduleDomotique (id, nomModule, typeModule, idModeleModule, idPiece, securite, energie, eclairage, ouvrant, multimedia, confort, sante, autre, interaction, idLogement) VALUES (id, "'.$nomModule.'", "'.$typeModule.'", "", "'.$idPiece.'", "'.$securite.'", "'.$energie.'", "", "'.$ouvrant.'", "", "", "", "", "", "'.$idLogement.'")';
     
    				// on envoie la requéte 
    				mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
     
    				//Fermeture connexion SQL
    				mysql_close(); // Connection Closed
    			}
    		?>
    	</body>
    </html>

  10. #10
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Salut,

    N'utilises pas mysql_close(); C'est inutile, php le fais très bien tout seul et surtout cela peut te poser de sérieux problèmes avec du code imbriqué.

    Après tu fais comme tu veux, tu peux continuer d'utiliser l'extension mysql mais c'est indiqué partout que cette extension est dépréciée et qu'elle sera supprimée à terme. Cela pourra te poser des problèmes si dans le futur tu dois utiliser ton code avec les dernières versions de php... C'est quand même dommage de commencer un nouveau projet avec cette extension et pas intéressant non plus pour un débutant d'apprendre du code obsolète, surtout si tu veux continuer par la suite. Actuellement on n'utilise mysql que pour modifier des vieux projets déjà existants. Cela fait déjà plusieurs années maintenant qu'on utilise pdo sinon au minimum mysqli...

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 21
    Par défaut
    ok, merci pour les conseils, je vais modifié ça de suite avant de continuer.

  12. #12
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Si tu cherche un tuto sur pdo il y a une bonne base ici
    Après comme il date un peu, il y a certaines choses qui ont changé. Par exemple à partir de php 5.3.6 on peut mettre le charset dans la connexion.

    Aussi concernant le chapitre "Explication du faux bogue de la clause LIMIT" il y a une manière bien plus pratique que d'être obligé de renseigner le type de la variable qui consiste à désactiver l'émulateur PDO pour utiliser celui du système de base de donnée qui lui va se renseigner sur les types attendu et donc créer la bonne syntaxe. Cela permet aussi par la même occasion de passer un argument de clause limit dans un tableau d'arguments même si par défaut les données sont dans cas formatées en string.

    Donc pour pour résoudre ce problème tu peux faire une connexion de ce type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // mode d'erreurs permet d'intercepter les erreurs dans un bloc try/catch (ne pas utiliser si on ne gère pas les erreurs)
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
     
    // Indispensable pour ne pas avoir execute() qui formate tout en string avec un tableau en paramètre  (incompatible avec la clause limit). Cette option est toujours recommandée car cela permet d'utiliser l'émulateur spécifique de la bdd 
    $pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;
     
    //charset reconnu dans la connexion à partir de php 5.3.6 auquel cas on peut supprimer l'option MYSQL_ATTR_INIT_COMMAND
     
    $connexion  = new PDO('mysql:host='.$hostname.';dbname='.$database.';charset=utf8', $username, $password, $pdo_options);
    Et toujours dans ce tuto le code du chapitre "Comment faire face à un nombre de place holders dynamique ?" est assez maladroit et se termine logiquement avec la mention "Eh non, la perfection n'est toujours pas de ce monde !" Mais c'est une maladresse et pas une fatalité. En utilisant array_fill et en passant le tableau de variables dans le execute() on aurait quelque chose de beaucoup plus léger.

    Enfin bon à part ces petits détails c'est un excellent moyen de commencer avec pdo.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 21
    Par défaut
    merci pour la doc. Je viens de la lire!!

    Mais j'ai un nouveau probleme?

    J'ai modifié en suivant tes conseils le PDO.
    L'ajout de donnée fonctionne peut importe la ligne.
    Par contre j'ai voulu géré les doublons.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    //Traitement formulaire
    if (isset($_POST['valider'.$yi])){
    	//On recupere les valeurs du formulaire
    	$idLogement = $_POST['idLogement'];
    	$idPiece = $_POST['idPiece'];
    	$typeModule = $_POST['typeModule'];
    	$nomModule= $_POST['nomModule'];
    	$securite = $_POST['securite'];
    	$energie = $_POST['energie'];
    	$ouvrant = $_POST['ouvrant'];
    	//On verifie que les données n'existe passthru
    	$sql = 'SELECT *
    		FROM moduleDomotique
    		WHERE idPiece = "'.$idPiece.'"'; 
    	$resultat = $connexion -> query($sql);
    	$resultat -> setFetchMode(PDO::FETCH_ASSOC);
    	print_r ($resultat);
    	while ($row = $resultat -> fetch()){
    		if (($nomModule == $row['nomModule']) and ($idPiece == $row['idPiece'])){
    			echo "Le module existe deja";
    		}
    		else{
    			//Ajout informations 
    			echo "ajout ok";
    			//creation requete SQL
    			$sql = 'INSERT INTO moduleDomotique (id, nomModule, typeModule, idModeleModule, idPiece, securite, energie, eclairage, ouvrant, multimedia, confort, sante, autre, interaction, idLogement) VALUES (id, "'.$nomModule.'", "'.$typeModule.'", "", "'.$idPiece.'", "'.$securite.'", "'.$energie.'", "", "'.$ouvrant.'", "", "", "", "", "", "'.$idLogement.'")';
    			// on envoie la requéte 
    			$connexion -> exec($sql) or die(print_r($connexion -> errorInfo(), true));;
    			//redirection page contact
    			//header('location: fichepreinstallation.php?id='.$idLogement.'');
    		}
    	}
    }
    Je pars avec une table vide, du coup je pense que mon fetch() ne reçoit aucun résultat et donc ne rentre pas dans ma boucle.
    J'ai essayé de déboguer avec print_r ($resultat); mais il me retourne la requête passé.

  14. #14
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Quand on passe des variables dans une requête il est conseillé d'utiliser des requêtes préparées.
    Et puis si tu n'arrives pas toujours dans le while, il suffit de ne pas en être dépendant.
    En plus quand tu fais ce genre de vérif, il te suffit de compter le nombre de lignes, pas la peine de rapatrier des résultats (tu gagne en performances).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    //...
    $message = null;
     
    $sql = "SELECT COUNT(*) FROM moduleDomotique WHERE idPiece = ? AND nomModule = ?"; 
    try
    {
        $resultat = $connexion->prepare($sql);
        $resultat->execute(array($idPiece,$nomModule));
        $count = $resultat->fetchColumn();
     
        if ($count > 0)
        {
    	$message = "Le module existe deja";
        }
        else
       {
            //ce serait bien de faire une requête préparée pour ta requête d'insertion. On écrit JAMAIS des variables ainsi (tel que tu l'a fais) dans une requête. Ou sinon sans requête préparée il faut utiliser la fonction quote()
           //...
           $message = "Insertion_ok";
        }
    }
    catch(\PDOException $e)
    {
    	$message = $e->getMessage();
    }
     
    if(isset($message)) echo $message;

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 21
    Par défaut
    Bon j'applique tes conseils, mais ça me mets des bâtons dans les roues.

    Ça fait plusieurs heures que je me bats avec une requête préparé de type INSERT.
    Je viens de lire plusieurs tutos/articles mais ma requête ne passe pas.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    echo " ajout ok";
    $sql2 = 'INSERT INTO moduleDomotique (id, nomModule, typeModule, idModeleModule, idPiece, securite, energie, eclairage, ouvrant, multimedia, confort, sante, autre, interaction, idLogement) VALUES (:val_id, :val_nomModule, :val_typeModule, :val_idModeleModule, :val_idPiece, :val_securite, :val_energie, :val_eclairage, :val_ouvrant, :val_multimedia, :val_confort, :val_sante, :val_autre, :val_interaction, :val_idLogement)';
    try{
    	$resultat2 = $connexion->prepare($sql2);
    	$resultat2->bindParam(':val_nomModule', $nomModule, PDO::PARAM_STR);
    	$resultat2->bindParam(':val_typeModule', $typeModule, PDO::PARAM_INT);
    	//$resultat->bindParam('val_idModeleModule', "", PDO::PARAM_INT);
    	$resultat2->bindParam(':val_idPiece', $idPiece, PDO::PARAM_INT);
    	$resultat2->bindParam(':val_securite', $securite, PDO::PARAM_INT);
    	$resultat2->bindParam(':val_energie', $energie, PDO::PARAM_INT);
    	//$resultat->bindParam('val_eclairage', "", PDO::PARAM_INT);
    	$resultat2->bindParam(':val_ouvrant', $ouvrant, PDO::PARAM_INT);
    	//$resultat->bindParam('val_multimedia', "", PDO::PARAM_INT);
    	//$resultat->bindParam('val_confort', "", PDO::PARAM_INT);
    	//$resultat->bindParam('val_sante', "", PDO::PARAM_INT);
    	//$resultat->bindParam('val_autre', "", PDO::PARAM_INT);
    	//$resultat->bindParam('val_interaction', "", PDO::PARAM_INT);
    	$resultat2->bindParam(':val_idLogement', $idLogement, PDO::PARAM_INT);
    	print_r ($resultat2);
    	$resultat2->execute();
    Faut t'il déclaré tous les paramétrés correspondant au nombre de champs dans la BDD ou peut on seulement mettre celle qu'on souhaite ajouter? j'ai des variables qui ne sont pas peuplé dans ce formulaire.

    Le print_r ($resultat2); me retourne $sql2. Les paramètres ne sont pas inclus dans la requête. WHY???

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 21
    Par défaut
    Bon voila réussi... en partie.

    déjà j'avais oublié le echo des message d'erreur. Apres les avoirs affichés direct plus facile pour déboguer!

    Ensuite j'ai la réponse a ma question , je ne peux passé en paramètre que les valeurs que je souhaite.

    Par contre PDO complexifie la chose car on ne peut pas envoyé de valeur " ". j'ai des checkbox et si c'est pas coché ben pas de valeur et erreur INSERT.

    Y'a t'il un moyen de pouvoir forcer ça ou je dois faire une vérifie "if isset($var)".

    Je verrais ça après mangé!!!

  17. #17
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Normalement, on fait des vérifications à réception des post et on défini une valeur par défaut si la variable n'est pas renseignée.
    Typiquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $value_checkbox = isset($_POST['value_checkbox']) ? $_POST['value_checkbox'] : 0;
    On fait normalement cela pour chaque variable en définissant une valeur par défaut adaptée pour chaque variable.
    On utilise jamais une variable avant d'avoir au minimum tester son existence, sinon c'est php qui renvoie une erreur ou une notice et pdo n'y est pour rien.

    On peut renforcer cette vérification et définir au passage un type quand c'est possible. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $val_typeModule  = isset($_POST['val_typeModule']) && is_numeric($_POST['val_typeModule']) ? intval($_POST['val_typeModule']) : 0;
    Ainsi cela t'éviterais aussi d'indiquer le type PARAM_INT dans le bindParam...
    Et puis même sans cela tu n'es pas obligé de spécifier le type si tu as fais ta connexion en désactivant l'émulateur pdo comme je t'ai montré plus haut car dans ce cas l'émulateur du système de base de donnée va se renseigner sur le type attendu par ta bdd.

    Enfin dans tous les cas il faut retenir qu'on utilise pas une variable non définie.

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 21
    Par défaut
    j'ai fini par faire ca.

    Je verifie le POST et modifie les valeurs en fonction avant la requete INSERT.

    En tous cas merci pur ces conseils, ça ma simplifié la vie même s'il a fallu que je réadapte des choses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tableaux] Fonction PHP et tableau à 2 dimensions
    Par ponteprimo dans le forum Langage
    Réponses: 3
    Dernier message: 06/09/2006, 14h21
  2. [AJAX][post]tableau
    Par trach.sam dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 11/05/2006, 18h39
  3. Réponses: 8
    Dernier message: 30/04/2006, 15h42
  4. [PHP-JS] Passer un tableau php en tableau JS
    Par dark_vidor dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 22/12/2005, 11h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo