PHP probleme incrémentation de variable session

Siroo
Invité n'ayant pas de compte PHPfrance

13 févr. 2014, 18:30

Bonjour à tous,
je travail sur la réalisation d'une interface et je rencontre un probleme (depuis 5 jours) que je n'arrive pas a résoudre tous seul.

L'idée c'est que jai 9 boutons, 8 representant un pc et un representant une travée (donc un bouton pour representer les 8 autre)
une fois cliqué sur les boutons de positions je récupere la valeur du bouton et je l'envoie au php,
pour le bouton de travée j'ai crée une boucle for pour envoyer 8 fois les valeurs de chaque bouton corespondant a la travée.

Le php devrait a chaque fois qu'il recoit ma variable 'bootajout' incrementer ma variable 'nbclientssel' (tandi que la variable 'bootsuppr' decrémentera la variable 'nbclientssel'),
ce qui marche SAUF la premiere fois si on clique sur mon bouton de travée, il recoit bien 8 fois la variable 'bootajout' mais ne fait aucune incrémentation (il l'a met a 1, 8 fois)
Mais si on reclique dessus plusieurs fois les nouvelles executions ce déroulerons comme prévut.


<?php
	session_start();
	if (isset($_POST['bootajout'])){ // Ici on va ajouter l'adresse mac corespondant a la position		

		if (!isset($_SESSION['nbclientssel'])){
			$_SESSION['nbclientssel'] = 0;
		}
		$_SESSION['nbclientssel']++; // Ici on determine combien de post son selectioné actuelement
		
		echo $_SESSION['nbclientssel'];
		unset($_POST['bootajout']);
	}
	
	if (isset($_POST['bootsuppr'])) {
	
		$_SESSION['nbclientssel']--; 
		
		echo $_SESSION['nbclientssel'];
		unset($_POST['bootsuppr']);
	}
	
	
?>
<HTML>
<HEAD>
	<SCRIPT type="text/javascript" src="jquery.js"></SCRIPT> 	
	<SCRIPT type="text/javascript" src="test.js"></SCRIPT> 	
	<SCRIPT type="text/javascript" src="deploiement/formulaireghost.js"></SCRIPT> 	
	<LINK rel="stylesheet" media="screen" type="text/css" title="Design" href="test.css" />
</HEAD>

	
<BODY>
<?php
	session_start();
?>
	<DIV class="E5traveeE">
			<BUTTON  class="E5travee" id="E5E"  title="Travée E" value='E,off'></BUTTON>
		<DIV class="E5traveeE1">                
			<BUTTON  class="E5position" id="E5E14" title="E 1.4" value='E14,off'></BUTTON>
			<BUTTON  class="E5position" id="E5E13" title="E 1.3" value='E13,off'></BUTTON>
			<BUTTON  class="E5position" id="E5E12" title="E 1.2" value='E12,off'></BUTTON>
			<BUTTON  class="E5position" id="E5E11" title="E 1.1" value='E11,off'></BUTTON>
		</DIV>
		<DIV class="E5traveeE2"> 			
			<BUTTON  class="E5position" id="E5E24" title="E 2.4" value='E24,off'></BUTTON>
			<BUTTON  class="E5position" id="E5E23" title="E 2.3" value='E23,off'></BUTTON>
			<BUTTON  class="E5position" id="E5E22" title="E 2.2" value='E22,off'></BUTTON>
			<BUTTON  class="E5position" id="E5E21" title="E 2.1" value='E21,off'></BUTTON>
		</DIV>
    </DIV>
	
</body>

</html>

[javascript]
$(document).ready(function() {
$('.E5travee').click(function () {
var testonoff = $(this).val(); // recup la value du bouton
var tab = testonoff.split(','); // ici on sépare les informations pour pouvoir les ciblés

if( tab[1] == "off" ){ // ici on regarde si c'est on ou off
if(confirm('Souhaitez vous vraiment ajouter la travee "' + tab[0] + '" a la selection?')) {
testonoff = testonoff.replace('off','on'); // ici on remplace le off par on
$(this).css('background-position', '0 -21px' ); // ici on a mis le changement des positions des boutons
var pos = 11; // on place la premiere positions(a savoir que les positions serons toujours les suivantes :11,12,13,14,21,22,23,24)

for(i=1;i<=8;i++){ // ici on va recuperer toutes les positions, si off les envoyer au php
var testonoff2 = $('#E5'+ tab[0] + pos ).val(); // recup la value du bouton ciblé grace a la var pos
var verifoff = testonoff2.indexOf('off');
var verifon = testonoff2.indexOf('on');

if(verifoff !== -1){

testonoff2 = testonoff2.replace('off','on'); // on passe le off en on
$('#E5'+ tab[0] + pos ).val(testonoff2); // et on l'insert

var bootajout = 'LEV2-5-' + tab[0] + pos ; // ici on recompose le nom total de la position

$.ajax({ // et on l'envoi
url: 'scripts/wolcmd/wolcmd.php',
type : "POST",
data : 'bootajout=' + bootajout,
success: function(repmodif) {
alert(repmodif);
}
});

$('#E5'+ tab[0] + pos ).css('background-position', '0 -53px' ); // ici on a mis le changement des positions des 8 boutons
}
else if(verifon !== -1){
// alert('le bouton' + tab[0] + pos + 'etait up');
}
else{
// ici alert probleme 132
}

if(pos==14){pos = 21;}
else{pos++;}


}
}
}
else{
if(confirm('Souhaitez vous vraiment supprimer la travee "' + tab[0] + '" a la selection?')) {
testonoff = testonoff.replace('on','off'); // ici on remplace le on par off
$(this).css('background-position', '0 0' );
var pos = 11;

for(i=1;i<=8;i++){
var testonoff2 = $('#E5'+ tab[0] + pos ).val();
var verifoff = testonoff2.indexOf('off');
var verifon = testonoff2.indexOf('on');

if(verifon !== -1){

var bootsuppr = 'LEV2-5-' + tab[0] + pos ;

$.ajax({
url: 'scripts/wolcmd/wolcmd.php',
type : "POST",
data : 'bootsuppr=' + bootsuppr,
success: function(repmodif) {
alert(repmodif);
}
});

$('#E5'+ tab[0] + pos ).css('background-position', '0 0' );

testonoff2 = testonoff2.replace('on','off'); // on la change
$('#E5'+ tab[0] + pos ).val(testonoff2); // et on l'insert

}
else if(verifoff !== -1){
// alert('le bouton' + tab[0] + pos + 'etait off');
}
else{

}

if(pos==14){pos = 21;}
else{pos++;} // ici on incrémente le numero de la position


}
}
}
$(this).val(testonoff); // et on l'insert
});


});
[/javascript]


Quelle peut être la solution pour résoudre le problème et quelle est le dit problème?
Par avance merci

ViPHP
xTG
ViPHP | 7331 Messages

13 févr. 2014, 19:02

Tu fais des requêtes asynchrones...
Donc tes 8 requêtes sont envoyées quasiment en même temps.
Il faut que tu ne postes pas la seconde requête POST avant d'avoir reçu la fin d'exécution de la première je dirais.

Vérifier aussi l'entête HTTP de la requête asynchrone pour vérifier que l'identifiant de session est bien toujours le même.

siroo
Invité n'ayant pas de compte PHPfrance

13 févr. 2014, 20:01

Tout d'abord merci xtg pour ta réponse très rapide.

Je te confirme que l'identifiant de session est bien toujours le même.

J'ai pensé que le problème pouvais venir des 8 requêtes envoyer en même temps mais dans ce cas pourquoi quand je relance la function sans recharger la page cela fonctionne?

est-ce a cause du if(!isset qui serait plus long a gérer ?

et si oui il y a t'il un moyen de mettre en place une sorte de file d'attente? Car après de longues recherches cette après midi je n'ai pas trouver de solution pour faire une pause dans ma boucle for en javascript.

Encore merci de m'accorder de ton temps.

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

13 févr. 2014, 20:32

salut,

je n'ai pas décortiqué ton code, mais je pense comme xTG que te le soucis peux venir de l'asynchronisme des requêtes.

asynchronisme cela veux dire que tu maîtrise pas du tout le timing de l’exécution (tu peux le voir dans des outils de dev comme celui de chrome, onglet réseau et onglet timeline).
donc la les requêtes parte dans la nature maistu sais pas quand ni comment).
il y a de forte chance pour qu'elle arrive "en même" ou pas ;)

donc :
- pourquoi faire 8 requêtes pour, au final, ne faire qu'une affectation ? tu ne peux pas faire le calcul en JS et ne faire qu'une seule requête ?
- A tu essayé de forcer en synchrone les requêtes ? (mais le du coup le script va être long).

perso j'opterais pour la première solution n'étant pas super fan des requête serveur multiple (et inutile à mon goût).

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

siroo
Invité n'ayant pas de compte PHPfrance

13 févr. 2014, 20:55

Bonsoir moogli et merci de m'accorder de ton temps.


pourquoi faire 8 requêtes pour, au final, ne faire qu'une affectation ?

ici j'ai alléger au maximum pour ne garder que les élément me posant problème, mais cela n’était que pour donner l'exemple, en dehors de cette affectation j'ai une 100ene de ligne qui suivent (recuperation de variable, interpretation, envoie a la bdd ect...) mais seul cette incrémentation me pose problème.


- A tu essayé de forcer en synchrone les requêtes ? (mais le du coup le script va être long).
Je débute a peine en javascript/php et j'ai vraiment aucune idée de comment gérer cela, si tu avais des noms de fonctions a me donner que j'aille me documenter ca m'aiderais énormément.

Merci d'avance.

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

13 févr. 2014, 21:59

la doc de jQuery sur la fonction Ajax ;) ( async= false)

Tu n'a vraiment pas moyen de multiplier ton traitement ? (En fonction de la valeur fournit par la requête).
Je serais franchement étonné que ce soutien pas possible surtout si ce n'est qu'un nombre ;)
Et même si c'est des références cela doit être possible ;)

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

siroo
Invité n'ayant pas de compte PHPfrance

13 févr. 2014, 22:15

Tu n'a vraiment pas moyen de multiplier ton traitement ?

Si si bien sur c'est possible, c'est simplement que je suis obliger de faire pas mal de modification dans ce que j'ai déjà fait.(si j'était mieux organiser aussi...)

la doc de jQuery sur la fonction Ajax ;) ( async= false)
Merci,j'vais essayer en synchrone et si sa me pause vraiment trop de problème je multiplierais mes fonctions comme tu me le conseil.

En tous cas merci beaucoup vous avez répondu a mes questions et m'avez donner de nouvelle pistes.

Bonne soirée.