Ciao a tutti, ho scritto questo semplice codice per prendere dei dati da un database MySQL con PHP, creare un file XML che verrà poi elaborato da Javascript per la creazione della mappa vera e propria.
allego prima il codice e poi vi espongo il problema:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<?
function parseToXML($htmlStr)
{
$xmlStr=str_replace("<",'<',$htmlStr);
$xmlStr=str_replace(">",'>',$xmlStr);
$xmlStr=str_replace("&",'&',$xmlStr);
return $xmlStr;
}
global $link_connessione;
$link_connessione = mysql_connect("localhost","root","");
//$link_connessione = mysql_connect("xx.xxx.xxx.xx","Sqlxxxxxx","xxxxxxx x");
if(!$link_connessione)
die("Impossibile connettersi a MySql");
//connessione al DB
mysql_select_db("test", $link_connessione);
$query_rsRecordset = "SELECT * FROM markers ORDER BY ID, lat DESC";
$rsRecordset = mysql_query($query_rsRecordset, $link_connessione) or die(mysql_error());
$row_rsRecordset = mysql_fetch_assoc($rsRecordset);
$totalRows_rsRecordset = mysql_num_rows($rsRecordset);
// START STORING DATA IN VARIABLE TO PLACE IN XML FILE
if($totalRows_rsRecordset > 0) {
echo $totalRows_rsRecordset;
// STORE NAME OF TABLE
$strXML="";
$strXML = "<markers>";
echo $strXML;
// STORE FIELD AND FIELD DATA IN ONE HIARCHY, REPEAT FOR MULTIPLE FIELDS
do {
$strXML = $strXML. '<marker ';
$strXML = $strXML. 'name="' . parseToXML(($row_rsRecordset['name'])) . '" ';
$strXML = $strXML. 'address="' . ($row_rsRecordset['address']) . '" ';
$strXML = $strXML. 'lat="' . $row_rsRecordset['lat'] . '" ';
$strXML = $strXML. 'lng="' . $row_rsRecordset['lng'] . '" ';
$strXML = $strXML. 'type="' . $row_rsRecordset['type'] . '" ';
$strXML = $strXML. "/>";
} while ($row_rsRecordset = mysql_fetch_assoc($rsRecordset));
$strXML = $strXML . "</markers>";
// OPEN FILE, WRITE TO FILE, CLOSE FILE, CLOSE RECORDSET
$XMLFile = fopen("finale.xml", "w") or die("can't open file");
fwrite($XMLFile, $strXML);
fclose($XMLFile);
}
?>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Google Maps AJAX + mySQL/PHP Example</title>
<script src="http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAR0TWf73rulOP_SnETQPF KxRj5djmSsmVAgDaRb1psFcJlThRhxSjxifqM96NjrBsBn2XrZ WSE-QQqQ"
type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
var iconBlue = new GIcon();
iconBlue.image = 'ico/2.png';
iconBlue.shadow = 'http://labs.google.com/ridefinder/images/mm_20_shadow.png';
iconBlue.iconSize = new GSize(20, 20);
iconBlue.shadowSize = new GSize(22, 20);
iconBlue.iconAnchor = new GPoint(6, 20);
iconBlue.infoWindowAnchor = new GPoint(5, 1);
var iconRed = new GIcon();
iconRed.image = 'ico/1.png';
iconRed.shadow = 'http://labs.google.com/ridefinder/images/mm_20_shadow.png';
iconRed.iconSize = new GSize(20, 20);
iconRed.shadowSize = new GSize(22, 20);
iconRed.iconAnchor = new GPoint(6, 20);
iconRed.infoWindowAnchor = new GPoint(5, 1);
var customIcons = [];
customIcons["restaurant"] = iconBlue;
customIcons["bar"] = iconRed;
function load() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map"));
map.enableScrollWheelZoom();
map.setMapType(G_SATELLITE_MAP);
map.addControl(new GSmallMapControl());
//map.addControl(new GMapTypeControl());
map.setCenter(new GLatLng(50, 0), 2);
//Test per comportarmi in modo diverso se ci sono le coordinate o no
GDownloadUrl("finale.xml", function(data) {
var xml = GXml.parse(data);
var markers = xml.documentElement.getElementsByTagName("marker") ;
for (var i = 1; i < markers.length; i++) {
var punto = markers[i].getAttribute("lat");
if ((!punto) || (punto == 0.000000))
{
var address = markers[i].getAttribute("address");
var name = markers[i].getAttribute("name");
var type = markers[i].getAttribute("type");
alert (address);
geocoder = new GClientGeocoder();
geocoder.getLatLng(address,function(point)
{
if (!point)
{
// Indirizzo non trovato!
alert(address + " non trovato!");
}
else
{
// Crea il marker
var marker = createMarker(point, name, address, type);
map.addOverlay(marker);
}
})
}
else
{
var name = markers[i].getAttribute("name");
var address = markers[i].getAttribute("address");
var type = markers[i].getAttribute("type");
var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
parseFloat(markers[i].getAttribute("lng")));
var marker = createMarker(point, name, address, type);
map.addOverlay(marker);
}
}
});
}
}
function createMarker(point, name, address, type) {
var marker = new GMarker(point, customIcons[type]);
var html = "" + name + "
" + address;
GEvent.addListener(marker, 'click', function() {
marker.openInfoWindowHtml(html);
});
return marker;
}
</script>
</head>
<body onload="load()" onunload="GUnload()">
<div id="map" style="width: 800px; height: 300px"></div>
</body>
</html>
Ora, i punti sulla mappa vengono TUTTI creati correttamente ma per questi casi (if ((!punto) || (punto == 0.000000))) i punti sono sì corretti ma tengono come informazioni descrittive quelle dell'ultimo record del database.
Ho inserito anche degli alert nella funzione ed "i" quando passa dalla funzione geocoder.getLatLng(address,function(point) è a 13 nonostante io abbia solo 12 record, è come se eseguisse la funzione SOLO DOPO la fine del ciclo for...
qualcuno sa come poter risolvere?
Grazie a tutti

Rispondi quotando