Json probleme de boucle

Résolu
tomeck Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   -  
tomeck Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   -
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 753
 
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 3672 Date d'inscription   Statut Membre Dernière intervention   1 011
 
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 753
 
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   Statut Membre Dernière intervention   1
 
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 753
 
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   Statut Membre Dernière intervention   1
 
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   Statut Membre Dernière intervention   1
 
ç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