Json probleme de boucle

Résolu/Fermé
tomeck Messages postés 12 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 29 octobre 2015 - 9 déc. 2014 à 13:42
tomeck Messages postés 12 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 29 octobre 2015 - 14 déc. 2014 à 23:08
bonjour,

le but: à l'ouverture de la page, une carte google map apparait avec les markers correspondants aux Point GPS entrés dans une Bdd (Markers variable).

Probleme: la carte s'affiche bien mais avec UN seul markers. En l'occurrence le dernier du tableau créé et encodé. Les autres ne s'affichent pas.

voici le code:
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>
		<script type="text/javascript">
		<?php include ("../../base.php");?>
		<?php
$req = $bdd->query('SELECT id, session, pseudo FROM pourvoir WHERE pseudo="subtomek" ORDER BY id  ');

while ($donnees = $req->fetch())
{
?>

				
				<?php
$reponse = $bdd->prepare('SELECT id, id_pseudo, site, latitude, longitude FROM carnet WHERE
id_pseudo = ? ORDER BY id');

$reponse->execute(array($donnees['id']));

while ($donnee = $reponse->fetch())
{
?>	
	<?php
  $plonge = array('lat'=>array($donnee['latitude']), 'lng'=>array($donnee['longitude']));
  $plonge_json = json_encode($plonge);
?>

		var tableauMarqueurs = [	
		<?php print $plonge_json;?> ];
			
			var maCarte;
			var zoneMarqueurs = new google.maps.LatLngBounds();

			function initialisation() {
				var optionsCarte = {
					zoom: 6,
					center: new google.maps.LatLng( 41.389982, 08.688877 ),
					mapTypeId: google.maps.MapTypeId.SATELLITE
				}
				maCarte = new google.maps.Map( document.getElementById("EmplacementDeMaCarte"), optionsCarte );
				for( var i = 0, I = tableauMarqueurs.length; i < I; i++ ) {
					ajouteMarqueur( tableauMarqueurs[i] );
				}
				maCarte.fitBounds( zoneMarqueurs );
			}

			function ajouteMarqueur( latlng ) {
				var latitude = latlng.lat;
				var longitude = latlng.lng;
				var optionsMarqueur = {
					map: maCarte,
					position: new google.maps.LatLng( latitude, longitude )
				};
				var marqueur = new google.maps.Marker( optionsMarqueur );
				zoneMarqueurs.extend( marqueur.getPosition() );
			}
			
			 google.maps.event.addDomListener( window, 'load', initialisation );
			 <?php
}
$reponse->closeCursor();
?>		
<?php
}
$req->closeCursor();
?>
		</script>

je pense que la boucle ne s'effectue pas correctement, mais ne trouve pas de solution pour le moment.

Je continue de chercher mais si quelqu'un peut me mettre sur une piste,

merci

tomeck

5 réponses

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
9 déc. 2014 à 14:31
Bonjour,

Déjà...
Tu sépares le PHP de tes scripts Javascript...
Là .. tu recréé chaque FUNCTION dans ta boucle.... donc à chaque tour .. il remet à nouveau les différentes fonctions.....

Evite aussi de fermer/ouvrir des balises PHP partout.... ( ?> <?php ...)


Ca devrait donner quelque chose de ce genre :

	
<?php 
include ("../../base.php");

$sql = "SELECT id, session, pseudo 
				FROM pourvoir 
				WHERE pseudo='subtomek' 
				ORDER BY id  ";
$req = $bdd->query($sql);
$plonge = array();
while ($donnees = $req->fetch()){
	$sql1 = "SELECT id, id_pseudo, site, latitude, longitude 
						FROM carnet 
						WHERE id_pseudo = ? ORDER BY id";
	$reponse = $bdd->prepare($sql1);
	$reponse->execute(array($donnees['id']));
	while ($donnee = $reponse->fetch()){

		$plonge[]= array('lat'=>array($donnee['latitude']), 'lng'=>array($donnee['longitude']));
		
	}
	$reponse->closeCursor();
}
$req->closeCursor();

//Génération du JSON
$plonge_json = json_encode($plonge);
?>

<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>
<script type="text/javascript">
	
		var tableauMarqueurs = [	
		<?php print $plonge_json;?> ];
			
			var maCarte;
			var zoneMarqueurs = new google.maps.LatLngBounds();

			function initialisation() {
				var optionsCarte = {
					zoom: 6,
					center: new google.maps.LatLng( 41.389982, 08.688877 ),
					mapTypeId: google.maps.MapTypeId.SATELLITE
				}
				maCarte = new google.maps.Map( document.getElementById("EmplacementDeMaCarte"), optionsCarte );
				for( var i = 0, I = tableauMarqueurs.length; i < I; i++ ) {
					ajouteMarqueur( tableauMarqueurs[i] );
				}
				maCarte.fitBounds( zoneMarqueurs );
			}

			function ajouteMarqueur( latlng ) {
				var latitude = latlng.lat;
				var longitude = latlng.lng;
				var optionsMarqueur = {
					map: maCarte,
					position: new google.maps.LatLng( latitude, longitude )
				};
				var marqueur = new google.maps.Marker( optionsMarqueur );
				zoneMarqueurs.extend( marqueur.getPosition() );
			}
			
			 google.maps.event.addDomListener( window, 'load', initialisation );	
</script>	
		
		
		
	



0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
9 déc. 2014 à 14:45
Bonjour,

En effet, ta boucle semble englober beaucoup trop de code, y compris toutes les fonctions javascript.
De plus, à chaque itération de la boucle, la variable tableauMarqueurs est
écrasée par la valeur suivante. Pour ajouter un élément en bout de tableau, il faut utiliser la fonction javascript push().

Du coup ton code deviendrait :

[...]
?>
		var tableauMarqueurs = [];
<?php
while ($donnee = $reponse->fetch())
{
    $plonge = array('lat'=>array($donnee['latitude']), 'lng'=>array($donnee['longitude']));
    $plonge_json = json_encode($plonge);
?>

		tableauMarqueurs.push(<?php print $plonge_json;?>);
<?php
}
?>
			var maCarte;
			var zoneMarqueurs = new google.maps.LatLngBounds();
[...]


En supprimant également l'accolade juste avant
$reponse->closeCursor();


Xavier
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
9 déc. 2014 à 14:50
Autant générer son Array dans le PHP puis de l'utiliser dans son javascript (comme je l'ai proposé juste avant) plutot que d'inclure encore du JS DANS son PHP ... Non ?
Enfin.. ce n'est que mon avis ......(perso.. je préfère séparer le code JS du code PHP ....)
0
tomeck Messages postés 12 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 29 octobre 2015 1
9 déc. 2014 à 15:02
merci pour vos réponse,

avec le code de Reivax962 cela fonctionne.

j'admet volontiers que mon encodage n'est pas très conventionnels ou lisible.

jordane45, avec ton code ma carte s'affiche en gris, je regarde cela car effectivement je dois peut etre prendre l'habitude de séparer mes code PHP et Java.

en tout cas un grand merci, cela fonctionne .
il me reste pas mal de chemin pour comprendre le javascript.

Merci

tomeck
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
9 déc. 2014 à 15:26
J'ai fait le code sans le tester.. il peut y avoir des erreurs en effet...
A la limite.. ajoute un print_r histoire de voir la tête de l'array PHP ...

//Génération du JSON
$plonge_json = json_encode($plonge);

// Un petit Print.. histoire de voir ce que contient l'array ...
print_r($plonge_json);
0
tomeck Messages postés 12 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 29 octobre 2015 1
14 déc. 2014 à 22:03
bonjour,

je me permet de revenir vers vous, car après plusieurs jours sur internet et forums je suis de nouveau dans une impasse.
Cette fois c'est sur les info bulles des marqueurs que sa bloque.

voici le code (qui fonctionne), ou l'info bulle est le même pour tous les marqueurs:
<script type="text/javascript">
		
	
			function initialisation() {
			
<?php include ("../../base.php");?>
<?php
$req = $bdd->query('SELECT id, session, pseudo FROM pourvoir WHERE pseudo="'.$pseudo.'"  ORDER BY id  ');

while ($donnees = $req->fetch())
{
?>
			
<?php
$reponse = $bdd->prepare('SELECT id, id_pseudo, site, latitude, longitude FROM carnet WHERE
id_pseudo = ? ORDER BY id');

$reponse->execute(array($donnees['id']));
?>

			var tableauMarqueurs = [];	
			
<?php	
while ($donnee = $reponse->fetch())
{
	
  $plonge = array('lat'=>array($donnee['latitude']), 'lng'=>array($donnee['longitude']), 'site'=>array($donnee['site']));
  $plonge_json = json_encode($plonge);
?>

			tableauMarqueurs.push(<?php print $plonge_json;?>);
<?php
}
?>	
				var marqueur, infoBulle, maCarte, i, nb = tableauMarqueurs.length;
		
				maCarte = new google.maps.Map( document.getElementById("EmplacementDeMaCarte"), {
				'zIndexBulle':1,
					'zoom': 8,
					'center': new google.maps.LatLng( 41.389982, 08.688877 ),
					'mapTypeId': google.maps.MapTypeId.SATELLITE

				});
								
				for (i=0; i < nb; i++) {
				marqueur = new google.maps.Marker( {
				'position': new google.maps.LatLng( tableauMarqueurs[i].lat, tableauMarqueurs[i].lng),
				'map' : maCarte,
      
				'icon' : "http://localhost/new_page_index/espace membre/carnet/pavillon.png"
				 });
		
				 infoBulle = new google.maps.InfoWindow({
						'content' : 'essai'
					});
				(
				function( bulle){
				google.maps.event.addListener(marqueur, 'click', function() {
					var map = this.getMap();
					var index = map.zIndexBulle ++;    // incrémentation et récupération
					bulle.setZIndex( index);  
					bulle.open(map, this);
				});
				})(infoBulle);
			}
			}
		
			 google.maps.event.addDomListener( window, 'load', initialisation );

<?php
}
$reponse->closeCursor();
?>		

		</script>



Mais lorsque je change le code pour récupérer ma variable à afficher dans l'info bulle,
seulement 1 marqueurs s'affiche (et en plus sans info bulle!)
voici ce que je change:

infoBulle = new google.maps.InfoWindow({
						'content' : tableauMarqueurs[i].site
					});


A la place de :
 infoBulle = new google.maps.InfoWindow({
						'content' : 'essai'
					});


Une nouvelle fois un probleme de boucle (je pense), mais je n'arrive pas trouver l'endroit.

merci de votre aide,

tomeck
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tomeck Messages postés 12 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 29 octobre 2015 1
14 déc. 2014 à 23:08
ça y est!!!!!!!!
j'ai trouver, c'était dans ma création de tableau array.

il fallait noter:
 $plonge = array('lat'=>array($donnee['latitude']), 'lng'=>array($donnee['longitude']), 'site'=> ''.$donnee['site'].'' );
  $plonge_json = json_encode($plonge);


merci et à bientot,
en espérant qu'un jours se soit moi qui vous aident.

tomeck
0