Übergabe Variablen Java-Script -> PHP. Bitte um Hilfe

Hallo zusammen,
Beschäftige mich seit einiger Zeit mit OSM. Nun versuche ich, aus einer Datenbank Koordinaten an das Javascript der OSM-Map zu übergeben.
Folgendes Skript läuft soweit mit einem einzigen Problem: Die Werte aus der Datenbank werdne nicht an Javascript übergeben, oder verschwinden irgendwo in der Versenkung. Kann mir jemand weiterhelfen? Erkennt jemand einen Fehler?

Technische Frage zu JSON: Muss ich für die Nutzung des JSON-Formats eine externe Datei einbinden?


<?php

include ("login/login.txt");

$link = mysql_connect($datenbank, $username, $password);
if (!$link) 
{
    die('Keine Verbindung möglich: ' . mysql_error());
}

if (!mysql_select_db('dasrettung_bb')) 
{
    die('Konnte Schema nicht selektieren: ' . mysql_error());
}

$lat = mysql_query('SELECT Positionlat FROM sichtungen');
if (!$lat) 
{
    die('Konnte Abfrage 1 nicht ausführen:' . mysql_error());
}

$lon = mysql_query('SELECT Positionlon FROM sichtungen');
if (!$lon) 
{
    die('Konnte Abfrage 2 nicht ausführen:' . mysql_error());
}

$datum = mysql_query('SELECT Datum FROM sichtungen');
if (!$datum) 
{
    die('Konnte Abfrage 3 nicht ausführen:' . mysql_error());
}

$uhrzeit = mysql_query('SELECT Uhrzeit FROM sichtungen');
if (!$uhrzeit) 
{
    die('Konnte Abfrage 4 nicht ausführen:' . mysql_error());
}

$meldung = mysql_query('SELECT Meldung FROM sichtungen');
if (!$meldung) 
{
    die('Konnte Abfrage 4 nicht ausführen:' . mysql_error());
}

$neuemeldung = $datum.' - '.$uhrzeit.'Uhr: '.$meldung;






php?>

<script type="text/javascript">
//<![CDATA[

var map;
var layer_mapnik;
var layer_tah;
var layer_markers;

function drawmap() {
     OpenLayers.Lang.setCode('de');
    
    // Position und Zoomstufe der Karte
    var lon = 6.641389;
    var lat = 49.756667;
    var zoom = 7;
    var pinnlat = $.parseJSON('<?php echo json_encode($lat); ?>');
    var pinnlon = $.parseJSON('<?php echo json_encode($lon); ?>');
    var pinnmeldung = $.parseJSON('<?php echo json_encode($neuemeldung); ?>');

    map = new OpenLayers.Map('map', {
        projection: new OpenLayers.Projection("EPSG:900913"),
        displayProjection: new OpenLayers.Projection("EPSG:4326"),
        controls: [
            new OpenLayers.Control.Navigation(),
            new OpenLayers.Control.LayerSwitcher(),
            new OpenLayers.Control.PanZoomBar()],
        maxExtent:
            new OpenLayers.Bounds(-20037508.34,-20037508.34,
                                    20037508.34, 20037508.34),
        numZoomLevels: 18,
        maxResolution: 156543,
        units: 'meters'
    });

    layer_mapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik");
    layer_markers = new OpenLayers.Layer.Markers("Address", { projection: new OpenLayers.Projection("EPSG:4326"), 
    	                                          visibility: true, displayInLayerSwitcher: false });

    map.addLayers([layer_mapnik, layer_markers]);
    jumpTo(lon, lat, zoom);
 
    // Position des Markers
while (lat.length > 0)
{
    addMarker(layer_markers, pinnlon, pinnlat, pinnmeldung);
}
}

//]]>
    </script>

Vielen Dank schonmal für die Hilfe

Hallo vDJan,

Willkommen im Forum! Sehe ich das richtig, das kurz vor dem JavaScript ein php zuviel ist? Und eine Empfehlungen auszusprechen: Verwende besser die mysqli Library Funktionen, das ist zukunftssicherer.

Mit freundlichen Grüßen Georg V. (OSM=user_5359)

Vielen Dank. Ich habe leider keine Rechte auf dem Server um mysqli Library zu installieren.

Ich kann im übrigen kein überschüssiges php finden, ich habe nur den php-Tag geschlossen. Kann man ja entweder mit ?> oder php?> machen.
Trotzdem frage ich mich warum dieses Script nicht funktioniert. Theoretisch müsste php doch die werte übernehmen können
und über JSON weitergeben.

Hallo vDJan!

Darf ich fragen, warum Du $.parseJSON() nimmst, anstatt direkt zuzuweisen? Eigentlich sollte etwas wie

var pinnlat = <?php echo json_encode($lat); ?>;

vollstaendig ausreichen.

ANsonsten sehe ich, dass Du mysql_query() machst, aber nirgendwo mysql_fetch_assoc() oder einen anderen Aufruf, um die Daten auch abzuholen.

Nein, es ist ein reines Datenaustauschformat. Total egal, ob Du das als String einbindest oder als externe Datei.

Wie wäre es mit ein wenige Debugging? Bevor Du mit dem Javascript beginnst kannst Du ja mal die Werte ausspucken und schauen, ob sie korrekt sind.

Ich würde auch da drauf verzichten, erst mit PHP anzufangen, dann zum Javascript zu wechseln und im Javascript wieder PHP zu verwenden und dort dann nochmal wieder Funktionen aufzurufen. Das ist ziemlich Crazy.

Ich würde zu 100% auf PHP wechseln und den Javascript-Code mit echo ausgeben. Auch wenn es ein klein wenig arbeit ist, aber Javascript und PHP so zu mischen funktioniert natürlich, ist aber schon Crazy. Wobei das natürlich Geschmackssache ist, aber PHP läuft auf dem Server und JS im Browser. Das sind zwei verschiedene Standorte, so etwas vermischt man nicht.

Ich sehe eine ganze Reihe von Problemen in dem Skript, kann es sein, daß Du zum ersten mal mit SQL arbeitest?

  • Du hast 4 Queries, eines für jedes Feld in der Datenbank. Normalerweise würde man alle 4 Felder mit einem einzigen Select abfragen
  • der Datenbankabfrage fehlt eine WHERE-Klausel (Außer es gibt nur einen einzigen Wert in der Datenbank, aber dann wäre die DB sowieso überflüssig :slight_smile:
  • Ein Query gibt Dir die Daten nicht direkt zurück, Du kannst also nicht schreiben “$lat = mysql_query()”. Die Rückgabe ist eine Resource, von der man mit mysql_fetch_assoc() die eigentlichen Daten abragen kann.
  • Was versuchst Du mit JSON zu machen? Das ist für die Übergabe nach Javascript überflüssig. Du schreibst einfach in Deinem Javascript sowas wie “var lat=<?php print $lat; ?>;”

Schau Dir nochmal eines der vielen mysql Tutorials im Netz an wie so ein Query aussehen muß.

bye, Nop

Kenn mich nich soooo mit gehosteten Servern aus, aber ich glaube, dass man in solchen Fällen die Lib “einfach” im eigenen Plattenbereich installiert und dann “nur” mit den Pfaden aufpassen muß.

wie schon gesagt, reine dunkelgraue Theorie.

Gruss
walter

So ist es. Ich kenne MySQLi nicht, aber häufig müssen noch die Schreibrechte gegeben werden und wenn Zugangsdaten erforderlich sind, diese in den Config-Daten eingetragen werden.

Ich vermute hier den Fehler aber ganz wo anders, bzw. vermute ich, daß deutlich mehr als nur 1 Fehler vorliegt. “Nop” hat auch schon diverse Ungereimtheiten aufgelistet. Daher mein Vorschlag mal zwischendrin ein paar Werte auszuspucken und zu schauen, ob die überhaupt so sind, wie sie gewünscht sind.

Also ich kann im Manuel nur die Kurzschreibform <? für <?php und nicht die Langform ?php> für das Ende finden. (*) Aber wenn es so bei Dir funktioniert, dann sag uns doch erstmal die Fehlermeldung oder -falls keine existiert-zeig uns doch den Code, der erzeugt wude und begründe, warum er falsch ist.
Zum OT Thema verwendete Library: Bevor Du planst Libraries selber zu installieren, würde ich erstmal ein phpinfo (**) absetzen, ich glaube kaum, das es Webhoster gibt, die keine Alternativen zur MYSQL Library anbieten.

Georg V.
Fußnoten (*) ich sitze derzeit entwicklungstechnisch in der Pampa und kriege mobil nur selten Internet “rein”, längere Suche auf php.net war deshalb nicht möglich.
(**) zur Zeiten der Ressourcenknappheit würde auf Nachfragen dazu ein RTFM folgen, lese doch bitte hierzu das Manuel oder die PHP Quelle Deines Vertrauens.

Moins,

Ich hab aus Deinen Code mal ans Laufen gebracht. Möglicherweise ist der Quellcode hilfreich als Startpunkt für Dich.

Gruß Wolf

Also wenn du Geld für deinen Server bezahlst und da keine mysqli lib (bzw. besser noch pdo) drauf ist, würde ich nichts mehr bezahlen und wechseln :slight_smile: Ne ehrlich, das ist so als würde man jetzt noch Windows 95 benutzen!

Ersteinmal vielen Dank an alle die mir geholfen haben. Bin somit ein ganze Stückchen weiter. Was die sache mit dem Server angeht: Habe mich etwas falsch ausgedrückt: Ist kein Server sondern gehosteter Webspace mit PHP5 und MySQL ohne root-Rechte etc.

In der Dokumentation von JSON stand, dass encode für Arrays nicht ausreicht, zumindest habe ich das so übersetzt. Deshalb habe ich parse gewählt.

Manchmal sieht man den Wald vor lauter Bäumen nicht. Das dürfte das Problem sein warum die Werte nicht übergeben wurden.

@DennisB: Debugging brachte nix, wurden ja nur keine Werte übergeben.
@Nop: Ich arbeite zwar nicht zum ersten mal mit MySQL, bin aber sehr uneholfen und habe wenig Programmiererfahrung. Bei mir haben sich eine Menge Fehler eingeschlichen.
@Netwolf: Vielen vielen Dank, das sieht deutlich ordentlicher aus als das was ich da gebaut habe.

Zustimmung. Das Vorhandensein von mysqli ist längst Standard, da sollte keine Installation notwendig sein. Dagegen ist die betagte mysql-API schon recht lange deprecated (Juni 2013 mit Erscheinen von PHP5.5) - d.h. Scripte, die damit geschrieben wurden, werden nicht mehr so lange funktionieren… (Erst recht, wenn man nix installieren kann und der Hoster hoffentlich PHP auch mal aktualisiert.) Die Umstellung von mysql_* auf mysqli_* ist auf den zweiten Blick gar nicht so dramatisch, denn man kann die “neue” API (neben dem objektorientierten->Einsatz) auch als Syntax-ähnliche function() einsetzen. Bin gespannt, wie viele kommerzielle Seiten bei dieser Umstellung auf die Nase fliegen werden, weil schlicht keiner Changelogs (oder Warnings in den Error-Logs) liest und kein Entscheider auf den Programmierer hört, ders vielleicht mitbekommen hat und um Resourcen bettelt :wink:

Ich schaffe es leider nicht, sämtliche Datensätze der Datenbank an das Javascript zu übergeben. Mit dem Quellcode von Netzwolf und ein wenig experimentieren habe ich es zumindest geschafft, den ersten Datensatz zu übergeben.

<?php

#===============================================================================
#	Database config
#===============================================================================

// "clean" names only! there is *no* sql-escaping.


include ("login/login.txt");

#===============================================================================
#	Database
#===============================================================================

#-----------------------------------------------------
#	Connect to server
#-----------------------------------------------------

if (!@mysql_connect ($MYSQL_SERVER, $MYSQL_USER, $MYSQL_PASSWORD)) die(mysql_error());

#-----------------------------------------------------
#	Select database
#-----------------------------------------------------

if (!@mysql_select_db ($MYSQL_DATABASE)) die(mysql_error());

#-----------------------------------------------------
#	Select row
#-----------------------------------------------------

# Lese alle Felder in *einem* Request. Dann passen die Werte auch zusammen.
# Und garantiere maximal 1 Ergebnis.

$query = "SELECT positionlat, positionlon, meldung FROM sichtungen LIMIT 1";
$result= @mysql_query ($query);

if (!$result) die(mysql_error());

#-----------------------------------------------------
#	Extrahiere Felder
#-----------------------------------------------------

if (mysql_num_rows($result) !=1)  { die("Nix oder zuviel gefunden."); }

list ($positionlat, $positionlon, $meldung) = mysql_fetch_row($result);

#-----------------------------------------------------
# aus dem Feldern was gebastelt
# ACHTUNG!!! wenn Quotezeichen im Text enthalten sein koennen, quoten!
#-----------------------------------------------------

$text = "{$meldung} ({$positionlat} {$positionlon})";

#-----------------------------------------------------
# und jetzt kommt die lustige Webseite
#-----------------------------------------------------

//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
echo <<<ENDOFPAGE
<html>
<head>
<link href="stylesichtung.css" rel="stylesheet" type="text/css" />
<!--[if IE]>
<link rel="stylesheet" type="text/css" href="stylesichtung_ie.css"></link>
<![endif]-->
<title>Bahnblitze Sichtungen</title>
<meta name="keywords" content="Sichtungen, Sichtungskarte, Live-Map,  Eisenbahnfotografie, Deutschland, Live-Karte, Echtzeitkart, Echtzeitdaten, Eisenbahnfotos, Fotos, Modellbahn, Fotostellen, Historische, Eisenbahngeschichte,  alle, Überblick, Baureihen, DB-Baureihe, EDV-Nummer, Baureihenüberblick, Leistungsdaten, Baureihe, Bahnfotos, Bahnbilder, Eisenbahnbilder, Eisenbahn, Fotografie, Eisenbahnfotografie, Deutschland, DB AG, Deutsche Bahn AG, DB Schenker, DB Regio, DB Fernverkehr, DB Netz, Bundesbahn " />
        <meta name="description" content="Eisenbahnfotos, Webcam, Bahnbilder, Baureihendatenbank. Fotos aus Eisenbahn und Industrie. Bahnfotos aus U-Bahn Berlin, M&uuml;nchen und Hamburg und Stationen" />
        <meta name="google-site-verification" content="AAR8ozhD-3hlIw9jWf5Om0nhWgtG2k6-_qmMGq5LYVY" />
        <meta name="google-site-verification" content="AAR8ozhD-3hlIw9jWf5Om0nhWgtG2k6-_qmMGq5LYVY" />
        <meta name="google-site-verification" content="syzIMAsM3JGvl5h72-177CShcf_ht3MBe2hmsg5c1iU" />
        <meta name="robots" content="index, follow">
        <meta name="language" content="de">
        <meta name="alexaVerifyID" content="6QfMvVyDKZbX_Fa1twVG7-P7kxA" />
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>

	<script>
	$(function() {
	  $('a[href*=#]:not([href=#])').click(function() {
	    if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {

	      var target = $(this.hash);
	      target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
	      if (target.length) {
	        $('html,body').animate({
	          scrollTop: target.offset().top
	        }, 1000);
	        return false;
	      }
	    }
	  });
	});
	</script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<script type="text/javascript" src="http://www.openlayers.org/api/OpenLayers.js"></script>
<script type="text/javascript">
//<![CDATA[
window.onload = function() {

	OpenLayers.Lang.setCode('de');
	
	// Position und Zoomstufe der Karte
	var mapLon = 6.641389;
	var mapLat = 49.756667;
	var mapZoom= 7;

	// Markerwerte eingestanzt vom PHP
	var pinnlat = {$positionlat};				// ******************************
	var pinnlon = {$positionlon};				// ******************************
	var pinnmeldung = "{$text}";			// ******************************

	var map = new OpenLayers.Map('map', {

		projection: new OpenLayers.Projection("EPSG:900913"),
		displayProjection: new OpenLayers.Projection("EPSG:4326"),
		controls: [
			new OpenLayers.Control.Navigation(),
			new OpenLayers.Control.LayerSwitcher(),
			new OpenLayers.Control.PanZoomBar()],
		numZoomLevels: 18
	});

	var layer_mapnik = new OpenLayers.Layer.OSM("Mapnik");

	var layer_markers = new OpenLayers.Layer.Markers("Address", {

		displayInLayerSwitcher: true
	});

	map.addLayers([layer_mapnik, layer_markers]);

	//jumpTo(lon, lat, zoom);
	map.moveTo (new OpenLayers.LonLat(mapLon, mapLat).
		transform(map.displayProjection, map.getProjectionObject()), mapZoom);
 
	// addMarker(layer_markers, pinnlon, pinnlat, pinnmeldung);
	layer_markers.addMarker(new OpenLayers.Marker(
		new OpenLayers.LonLat(pinnlon, pinnlat).
			transform(map.displayProjection, map.getProjectionObject())));
};
//]]>
</script>
</head>

<body>
<div id="top">©2015 by bahnblitze.de&nbsp;&nbsp;</div>
<div id="logo">
<div id="menulogo"><img src="icons/logo.png"></div>
<div id="menuintro"><a href="index.php">Home</a></div>
<div id="menuhome"><a href="sichtungen.php">Bahnblitze Sichtungen</a></div>
<div id="menumenu"><a href="#baureihenmenu">Sichtungsmeldungen</a></div>
<div id="menuimpressum"><a href="impressum.php" target="blank">Impressum</a></div>
</div>
<div id="bild"><div id="osm">© <a href="http://www.openstreetmap.org">OpenStreetMap</a>
     und <a href="http://www.openstreetmap.org/copyright">Mitwirkende</a>,
     <a href="http://creativecommons.org/licenses/by-sa/2.0/deed.de">CC-BY-SA</a>
   </div>
<div id="map"></div>
</div>
<div id="inhalt">
<div id="box1">
<b><h2>Herzlich Willkommen auf der Sichtungsseite von Bahnblitze</b></h2>
<br><br>
Auf diesen Seiten finden Sie die aktuellen Sichtungsmeldungen, dargstellt in Listenform und auf einer 
Live-karte.
</div>

<div id="box2">
Anbei finden Sie in Kürze einige Angebote von bahnblitze zum Thema Eisenbahnfotografie
</div>




</div></div>
<div id="menu">
<div id="menuallgemein" align="center">
<h2><a name="baureihenmenu">Sichtungsmeldungen<br><br></a></h2></div>



<div id="lp1">
<h2 align="center">Sichtungen aus dem Bahnblitzeforum</h2>
<?php 
   $ENABLE_CACHING = true; //Before you enable caching set the CACHE_FILE correctly...
 $CACHE_FILE = 'bbnews1.rdf'; //Where to store the cache file. HAVE TO BE WRITEABLE FOR THE USER-ACCOUNT OF THE WEBSERVER
   $CACHE_REFRESH_TIME = 20; //Cache timeout in minutes
   $MAX_NEWS = 10; //If you want to restrict the headlines you can do it here
   
   
   if ($ENABLE_CACHING){
       $cache_diff :(time() - @filemtime($CACHE_FILE))/60;
       if (!file_exists($CACHE_FILE) or ($cache_diff > 20) ){
           $fcontents = join ('', @file ('http://www.bahnblitze.de/bahnblitzeforum/external.php?action=RSS20'));
           @unlink($CACHE_FILE);
           $handle = @fopen($CACHE_FILE, 'x+');
           @fwrite($handle, $fcontents);
           @fclose($handle);
       }
       $fcontents = join ('', @file ($CACHE_FILE));
   } else {
       $fcontents = join ('', @file ('http://www.bahnblitze.de/bahnblitzeforum/external.php?action=RSS20'));
   }
   $fcontents = str_replace ("</item>", "", $fcontents);
   $fcontents = str_replace ("</link>", "", $fcontents);
   
   $splices = explode ("<item>", $fcontents);
   
   if (count($splices) > $MAX_NEWS){
       $stop_at = $MAX_NEWS+1;
   } else {
       $stop_at = count($splices);
   }
   
   $out_buffer = '<span class="heisenews">';
   for ($i = 1; $i < $stop_at; $i++){
       $link = explode("<link>",$splices[$i]);
       $link[1] = strip_tags($link[1]);
 $headline = str_replace ("<title>", '<li><a href="' . trim($link[1]) . '" target="_blank" class="heiseheadline" style="color:#D8D8D8; font-size:1em; text-align: center;">', $splices[$i]);
       $headline = str_replace ("</title>", "</a><br></li>", $headline);
       $headline = explode ("<link>", $headline);
       $headline = $headline[0];
       $out_buffer = $out_buffer . $headline . '<img src="1.gif" height="20" width="1" border="0" align="top" alt="" />';
   }
   $out_buffer = $out_buffer . "</span>";
   print $out_buffer;
   php?>
                                

</div>

<div id="lp3">
<h2 align="center">Neuste Tourberichte vom Bahnblitze-Team</h2> 

<?php 
   $ENABLE_CACHING = true; //Before you enable caching set the CACHE_FILE correctly...
 $CACHE_FILE = 'bbnews.rdf'; //Where to store the cache file. HAVE TO BE WRITEABLE FOR THE USER-ACCOUNT OF THE WEBSERVER
   $CACHE_REFRESH_TIME = 20; //Cache timeout in minutes
   $MAX_NEWS = 10; //If you want to restrict the headlines you can do it here
   
   
   if ($ENABLE_CACHING){
       $cache_diff :(time() - @filemtime($CACHE_FILE))/60;
       if (!file_exists($CACHE_FILE) or ($cache_diff > 20) ){
           $fcontents = join ('', @file ('http://bahnblitze.de/test/?feed=rss2'));
           @unlink($CACHE_FILE);
           $handle = @fopen($CACHE_FILE, 'x+');
           @fwrite($handle, $fcontents);
           @fclose($handle);
       }
       $fcontents = join ('', @file ($CACHE_FILE));
   } else {
       $fcontents = join ('', @file ('http://bahnblitze.de/test/?feed=rss2'));
   }
   $fcontents = str_replace ("</item>", "", $fcontents);
   $fcontents = str_replace ("</link>", "", $fcontents);
   
   $splices = explode ("<item>", $fcontents);
   
   if (count($splices) > $MAX_NEWS){
       $stop_at = $MAX_NEWS+1;
   } else {
       $stop_at = count($splices);
   }
   
   $out_buffer = '<span class="heisenews">';
   for ($i = 1; $i < $stop_at; $i++){
       $link = explode("<link>",$splices[$i]);
       $link[1] = strip_tags($link[1]);
 $headline = str_replace ("<title>", '<li><a href="' . trim($link[1]) . '" target="_blank" class="heiseheadline" style="color:#D8D8D8; font-size:1em; text-align: center;">', $splices[$i]);
       $headline = str_replace ("</title>", "</a><br></li>", $headline);
       $headline = explode ("<link>", $headline);
       $headline = $headline[0];
       $out_buffer = $out_buffer . $headline . '<img src="1.gif" height="20" width="1" border="0" align="top" alt="" />';
   }
   $out_buffer = $out_buffer . "</span>";
   print $out_buffer;
   php?>
                     
</div>







</div>
<div id="copyright"></div>


</body>
</html>
ENDOFPAGE;
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
?>

Unter anderem habe ich versucht, diesen Abschnitt in eine while-Schleife zu schreiben, und sämtliche Datensätze als Array darzustellen. Interessanterweise komt dabei die Fehlermeldung, dass das Zwischenspeicherlimit überschritten ist,
was aber bei zwei Datensätzen mit jeweils 5 Werten nicht sein kann.

if (mysql_num_rows($result) !=1)  { die("Nix oder zuviel gefunden."); }

list ($positionlat, $positionlon, $meldung) = mysql_fetch_row($result);

wurde ersetzt gegen:


while($row = mysql_fetch_array($result)) {

list ($positionlat, $positionlon, $meldung) = $row;
}