Index: trunk/info/info/alkisn/alkisfsnw.php
===================================================================
--- trunk/info/info/alkisn/alkisfsnw.php	(revision 419)
+++ trunk/info/info/alkisn/alkisfsnw.php	(revision 422)
@@ -7,29 +7,21 @@
 	Version:
 	2016-02-24 Version fuer norGIS-ALKIS-Import
-	2016-03-14 Korrekturen
-	2016-12-01 HTML5, Gemeinsam genutzte Datenbanken ermÃ¶glichen
-	2016-12-05 Nutzungsart-Kategorie ist nun in Text enthalten, nicht mehr aus der Definition ausschneiden
-	2017-06-08 optional "berechtigte Buchungen" anzeigen, Function "eigentuemer" ohne Parameter $con,
-				Validierung Eingabeparameter, Feinkorrekturen
-	2017-10-11 Sauber filtern auf 'endet IS NULL', Ausgabe der BodenschÃ€tzung
-	2017-10-11 Nachbesserung Formatierung der SchÃ€tzungs-Zeilen
-	2017-10-17 Zeitpunkt der Entstehung in deutschen Datumsformat
-	2017-11-03 Wertelisten fÃŒr Arrays in BodenschÃ€tzung ausgeben.
-	2017-12-08 Planung (Kommentare) der Erweiterung fÃŒr Berechtigte GrundbÃŒcher
-	2017-12-20 Links auf Lagebezeichnung verbessert.
-	2018-04-11 Variable "gmlid" an Function "ALKISexport" ÃŒbergeben. Ist beim Schreiben des Headers noch unbekannt, wenn mit "&fskennz=" aufgerufen.
-	2018-04-23 Umfangreiche Ãberarbeitung der "Buchungsstellen"
-	2018-05-03 Anpassung fÃŒr GrundstÃŒcksnachweis
-	2018-11-09 Umstellung Full-Schema
-	2018-11-19 EntschlÃŒsseln "zeigtaufexternes_art" mit function fortfuehrungen().
-	2018-12-18 function fskenn_dbformat
-
-++ToDo:
+	.....
+	2020-02-20 Authentifizierung ausgelagert in Function darf_ich()
+	2020-10-13 debug-infos raus
+	2020-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF']
+	2020-12-09 Verschn. mit "Bau-, Raum- oder Bodenordnungsrecht" korrigiert, Entschl. BodenschÃ€tzung korrigiert
+	2020-12-16 Input-Validation und Strict Comparisation (===)
+	2021-03-09 Link zum GebÃ€udenachweis auch mit "Bauwerke" betiteln
+
+ToDo:
 	- Buchung auf "fiktives Blatt" ist nur mit debug zu sehen: die <tr> in .css grau hinterlegen
-	- Umschalter (gleiches Modul) anders darstellen als Links zu anderen Nachweisen
+	- "Umschalter" (gleiches Modul) anders darstellen als Links zu ANDEREN Nachweisen
 	- Parameter zum Umschalten mit/ohne BodenschÃ€tzung?
 	- Bessere Differenzierung bei den Nutzungsarten (Tabelle dafÃŒr aufbauen) 
 */
+ini_set("session.cookie_httponly", 1);
 session_start();
+
 $eig="n"; $showkey="n"; $nodebug=""; // Var. initalisieren
 $cntget = extract($_GET); // alle Parameter in Variable umwandeln
@@ -41,19 +33,22 @@
 } else { // Alternativ
 	$gmlid='';
-	if (isset($fskennz)) { // llgggg-fff-11111/222 oder z.B.'052647002001910013__' oder '05264700200012______'
+	if (isset($fskennz)) {
 		if (!preg_match('#^[0-9\-_/]{8,20}$#', $fskennz)) {die ("Eingabefehler fskennz");}
 	} else {
-		$fskennz='';
-	}
-}
-if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
+		die("Fehlender Parameter");
+	}
+}
+if (isset($gkz)) {
+	if (!preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
+} else {
+	die("Fehlender Parameter");
+}
 if (!preg_match('#^[j|n]{0,1}$#', $eig)) {die("Eingabefehler eig");}
 if (!preg_match('#^[j|n]{0,1}$#', $showkey)) {die ("Eingabefehler showkey");}
-if ($showkey == "j") {$showkey=true;} else {$showkey=false;} // "j"/"n" als boolean umwandeln, ist praktischer abzufragen, wird oft gebraucht
+if ($showkey === "j") {$showkey=true;} else {$showkey=false;} // "j"/"n" als bool, ist praktischer, oft gebraucht
 if (!preg_match('#^j{0,1}$#', $nodebug)) {die("Eingabefehler nodebug");}
 
-require_once("alkis_conf_location.php");
-if ($auth == "mapbender") {require_once($mapbender);}
-include("alkisfkt.php");
+include "alkis_conf_location.php";
+include "alkisfkt.php";
 ?>
 <!doctype html>
@@ -73,52 +68,18 @@
 <body>
 <?php
+$erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
+
 // Mit URL-Parameter "&nodebug=j" kann man die Entwicklungsumgebung (in Conf definiert) ausschalten. Blendet z.B. "fiktives Blatt" aus.
 // Manuell an die URL anfÃŒgen, wirkt nur temporÃ€r und wird nicht in Links weiter gereicht.
-if ($nodebug == "j") {$debug=0;} 
+if ($nodebug === "j") {$debug=0;} 
 
 $con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisfsnw.php'");
 if (!$con) echo "\n<p class='err'>Fehler beim Verbinden der DB</p>";
 
-// Ein FlurstÃŒcks-Kennzeichen wurde alternativ zur gml_id ÃŒbermittelt
+// Ein FlurstÃŒcks-Kennzeichen im DB-Format wurde alternativ zur gml_id ÃŒbermittelt
 if ($fskennz != '') {
-/*
-	$arr=explode("-", $fskennz, 4); // zerlegen
-	$zgemkg=trim($arr[0]);
-	if (strlen($zgemkg) == 20 and !isset($arr[1])) {
-		$fskzdb=$zgemkg; // Datenbank-Feldformat
-	} else { // Format "llgggg-fff-nnnn/zz.nn" oder "gggg-ff-nnn/zz"
-		// Das Kennzeichen auseinander nehmen. 
-		if (strlen($zgemkg) == 6) {
-			$land=substr($zgemkg, 0, 2);
-			$zgemkg=substr($zgemkg, 2, 4);
-		} else { // kein schÃ¶ner Land ..
-			$land=$defland; // Default-Land aus config
-		}
-		$zflur=str_pad($arr[1], 3 , "0", STR_PAD_LEFT); // Flur-Nr
-		$zfsnr=trim($arr[2]); // FlurstÃŒcke-Nr
-		$zn=explode("/", $zfsnr, 2); // Bruch?
-		$zzaehler=str_pad(trim($zn[0]), 5 , "0", STR_PAD_LEFT);
-		if (isset($zn[1])) {
-			$znenner=trim($zn[1]);
-		} else {
-			$znenner="";
-		}
-		if (trim($znenner, " 0.") == "") { // kein Bruch oder nur Nullen
-			$znenner="____"; // in DB-Spalte mit Tiefstrich aufgefÃŒllt
-		} else {
-			$zn=explode(".", $znenner, 2); // .00 wegwerfen
-			$znenner=str_pad($zn[0], 4 , "0", STR_PAD_LEFT);
-		}
-		// nun die Teile stellengerecht wieder zusammen setzen		
-		$fskzdb=$land.$zgemkg.$zflur.$zzaehler.$znenner.'__'; // FS-Kennz. Format Datenbank
-	}
-	$v = array($fskzdb);
-*/
-	// Spalte "flurstueckskennzeichen" ist in DB indiziert
-	// Format z.B.'052647002001910013__' oder '05264700200012______'
-	$sql ="SELECT gml_id FROM ax_flurstueck WHERE flurstueckskennzeichen= $1 AND endet IS NULL ;";
-
+	// Spalte "flurstueckskennzeichen" ist in DB indiziert. Format z.B.'052647002001910013__' oder '05264700200012______'
+	$sql ="SELECT gml_id FROM ax_flurstueck WHERE flurstueckskennzeichen= $1 AND endet IS NULL;";
 	$v=array(fskenn_dbformat($fskennz));
-
 	$res = pg_prepare("", $sql);
 	$res = pg_execute("", $v);
@@ -149,5 +110,5 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Flurstuecksdaten</p>";
-	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = gml_id = '".$gmlid."'</p>";}
+	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sql), ENT_QUOTES, "UTF-8")."</p>";}
 }
 if ($row = pg_fetch_assoc($res)) {
@@ -176,5 +137,5 @@
 } else {
 	echo "\n<p class='err'>Fehler! Kein Treffer f&uuml;r Flurst&uuml;ck mit gml_id=".$gmlid."</p>";
-	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = gml_id = '".$gmlid."'</p>";}
+	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sql), ENT_QUOTES, "UTF-8")."</p>";}
 	echo "\n</body>\n</html>";
 	return;
@@ -182,9 +143,9 @@
 pg_free_result($res);
 
-if ($eig=="j") { // Balken
-	echo "<p class='fsei'>ALKIS Flurst&uuml;ck ".$gmkgnr."-".$flurnummer."-".$flstnummer."&nbsp;</p>"
+if ($eig==="j") { // Balken
+	echo "<p class='balken fsei'>ALKIS Flurst&uuml;ck ".$gmkgnr."-".$flurnummer."-".$flstnummer."&nbsp;</p>"
 	."\n\n<h2>Flurst&uuml;ck mit Eigent&uuml;mer</h2>";
 } else {
-	echo "<p class='fskennz'>ALKIS Flurst&uuml;ck ".$gmkgnr."-".$flurnummer."-".$flstnummer."&nbsp;</p>"
+	echo "<p class='balken fskennz'>ALKIS Flurst&uuml;ck ".$gmkgnr."-".$flurnummer."-".$flstnummer."&nbsp;</p>"
 	."\n\n<h2>Flurst&uuml;ck</h2>";
 }
@@ -263,5 +224,5 @@
 	if ($debug > 1) {
 		echo "\n<p class='dbg'>Fehler:".pg_last_error()."</p>";
-		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = gml_id = '".$gmlid."'</p>";}
+		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sql), ENT_QUOTES, "UTF-8")."</p>";}
 	}
 } else {
@@ -270,5 +231,5 @@
 	while($row = pg_fetch_assoc($res)) {
 		$sname=htmlentities($row["bezeichnung"], ENT_QUOTES, "UTF-8"); // Str.-Name
-		if (substr($sname, strlen($sname) -3, 3) == 'weg') { // Versuch fuer korrekten Satzbau
+		if (substr($sname, strlen($sname) -3, 3) === 'weg') { // Versuch fuer korrekten Satzbau
 			$slink=" am ".$sname;
 		} else {
@@ -277,5 +238,5 @@
 		$hsnr=$row["hausnummer"];
 		echo "\n<tr>";
-			if ($j == 0) { // 1
+			if ($j === 0) { // 1
 				echo "\n\t<td class='ll'><img src='ico/Lage_mit_Haus.png' width='16' height='16' alt=''> Adresse:</td>";
 			} else {
@@ -321,12 +282,12 @@
 	echo "\n<p class='err'>Fehler bei Lagebezeichnung ohne Hausnummer</p>";
 	//if ($debug > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($res)."</p>";}
-	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = gml_id = '".$gmlid."'</p>";}
+	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
 }
 $j=0;
 while($row = pg_fetch_assoc($res)) {
 	$skey=$row["lage"]; // Strassenschl.
-	$lgml=$row["gml_id"]; // key der Lage
+	$lgml=$row["gml_id"]; // Key der Lage
 	$gewann = htmlentities($row["unverschluesselt"], ENT_QUOTES, "UTF-8");
-	if ($gewann != "") {
+	if ($gewann != '') {
 		echo "\n<tr>"
 			."\n\t<td class='ll' title='unverschl&uuml;sselte Lagebezeichnung'><img src='ico/Lage_Gewanne.png' width='16' height='16' alt=''> Gewanne:</td>" // 1
@@ -341,5 +302,5 @@
 	} elseif ($skey > 0) {
 		$sname=htmlentities($row["bezeichnung"], ENT_QUOTES, "UTF-8"); // Str.-Name
-		if (substr($sname, strlen($sname) -3, 3) == 'weg') { // Versuch fuer korrekten Satzbau
+		if (substr($sname, strlen($sname) -3, 3) === 'weg') { // Versuch fuer korrekten Satzbau
 			$slink=" am ".$sname;
 		} else {
@@ -392,5 +353,5 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Suche tats. Nutzung</p>";
-	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = FS-Kennz = '".$fskennzalb."'</p>";}
+	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$fskennzalb."'",$sql), ENT_QUOTES, "UTF-8")."'</p>";}
 }
 $j=0;
@@ -402,5 +363,5 @@
 	$title=htmlentities($defi, ENT_QUOTES, "UTF-8"); // .. fÃŒr Anzeige aufbereitet
 	echo "\n<tr>\n\t";
-		if ($j == 0) { // 1
+		if ($j === 0) { // 1
 			echo "<td class='ll' title='Abschnitt der tats&auml;chlichen Nutzung'><img src='ico/Abschnitt.png' width='16' height='16' alt=''> Nutzung:</td>";
 		} else {
@@ -444,7 +405,7 @@
 		if ($showkey) {echo "&amp;showkey=j";}
 		if ($cnt_adressen > 0) { // wenn Adresse vorgekommen ist
-			echo "' title='Geb&auml;ude auf oder an dem Flurst&uuml;ck'>Geb&auml;ude ";
+			echo "' title='Geb&auml;ude oder Bauwerke auf oder an dem Flurst&uuml;ck'>Geb&auml;ude/Bauw.";
 		} else { // GebÃ€ude mit Adresse gibt es NICHT, das ist klar
-			echo "' title='Suche Geb&auml;ude ohne Adresse auf dem Flurst&uuml;ck oder angrenzende Geb&auml;ude'>Suche ";
+			echo "' title='Suche Geb&auml;ude (ohne Adresse) oder Bauwerke auf dem Flurst&uuml;ck'>Geb&auml;ude/Bauw.";
 		}
 		echo "<img src='ico/Haus.png' width='16' height='16' alt=''></a>"
@@ -480,7 +441,6 @@
 	while ($row = pg_fetch_assoc($res)) {
 		$kulturartk=$row['kulturartk']; // Key	-
-		$kulturartv=$row['kulturartv']; //		- Value
-		// 1000="Ackerland (A)", 2000="Acker-GrÃŒnland (AGr)", 3000="GrÃŒnland (Gr)", 4000="GrÃŒnland-Acker (GrA)" 		
-		if (substr($kulturartv, 0, 3) == 'Ack') { // A
+		$kulturartv=$row['kulturartv']; // - Value		
+		if (substr($kulturartv, 0, 3) === 'Ack') { // A
 			$kbez1="Bodenzahl";
 			$kbez2="Ackerzahl";
@@ -494,22 +454,20 @@
 		$ertragszahl = intval($absbuchflae * $row['ackerzahl'] / 100);
 		$gesertragsmz+=$ertragszahl;
-	//	$absflaedis = number_format($absflae,0,",",".")." m&#178;";  // als Tool-Tip ?
+	//	$absflaedis = number_format($absflae,0,",",".")." m&#178;"; // als Tool-Tip ?
 		$absbuchflaedis = number_format($absbuchflae,0,",",".")." m&#178;";
 		$boedenzahl=ltrim($row['bodenzahl'], '0');
 		$ackerzahl=ltrim($row['ackerzahl'], '0');
 		$jahr=$row['jahreszahl'];
-
-		// 2x Array mit SchlÃŒsseln. PostNAS fÃŒllt es nicht, wenn als "integer[]" definiert.
 		$entsteh=$row['entsteh'];
 		$sonst=$row['sonstigeangaben'];
-		if ($j == 0) { // 1
+		if ($j === 0) { // 1
 			echo "\n<tr>\n\t<td class='ll' title='Abschnitt Bodensch&auml;tzung'><img src='ico/Landwirt.png' width='16' height='16' alt=''> Bodensch&auml;tzung:</td>";
 		} else {
 			echo "\n<tr>\n\t<td>&nbsp;</td>";
 		}
-		echo "\n\t<td class='fla' title='Ertragsmesszahl: Produkt von ".$kbez2."/100 und Fl&auml;che.'>EMZ ".$ertragszahl."</td>"; // 2
-		echo "\n\t<td class='re' title='Fl&auml;che des Sch&auml;tzungsabschnitts'>".$absbuchflaedis."</td>"; // 3
-		echo "\n\t<td class='lr'><span title='".$kbez1."'>".$boedenzahl."</span>/<span title='".$kbez2."'>".$ackerzahl."</span></td>"; // 4
-		echo "\n\t<td class='lr'>"; // 5
+		echo "\n\t<td class='fla' title='Ertragsmesszahl: Produkt von ".$kbez2."/100 und Fl&auml;che.'>EMZ ".$ertragszahl."</td>"
+		."\n\t<td class='re' title='Fl&auml;che des Sch&auml;tzungsabschnitts'>".$absbuchflaedis."</td>"
+		."\n\t<td class='lr'><span title='".$kbez1."'>".$boedenzahl."</span>/<span title='".$kbez2."'>".$ackerzahl."</span></td>"
+		."\n\t<td class='lr'>";
 
 			if ($showkey) {echo "\n\t\t<span class='key'>(".$kulturartk.")</span> ";}
@@ -521,25 +479,24 @@
 			echo "\n\t\t<span title='Zustandsstufe'>".$row['zustbodv']."</span> ";
 
-			// ARRAYs auflÃ¶sen ohne den SchÃ€tzungs-Abschnitt mehrfach aufzulisten
-			if ($entsteh <> '') {
-				$ent="'".str_replace(",", "','", trim($entsteh, "{}"))."'"; // als Liste fÃŒr SQL "WHERE IN ()"
+			// 2 ARRAYs auflÃ¶sen
+			if (isset($entsteh)) {
+				$ent=trim($entsteh, "{}");
 				echo "\n\t\t <span title='Enststehungsart oder Klimastufe, Wasserverh&auml;ltnisse'>";
 					if ($showkey) {echo "\n\t\t <span class='key'>(".$ent.")</span> ";}
-					werteliste ('ax_bodenschaetzung', 'entstehungsartoderklimastufewasserverhaeltnisse', $ent);
+					werteliste ('e', $ent);
 				echo "</span>";
 			}
-			if ($sonst <> '') {
-				$son="'".str_replace(",", "','", trim($sonst, "{}"))."'";
+			if (isset($sonst)) {
+				$son=trim($sonst, "{}");
 				echo "\n\t\t <span title='Sonstige Angaben'>";
 					if ($showkey) {echo "\n\t\t <span class='key'>(".$son.")</span> ";}
-					werteliste ('ax_bodenschaetzung', 'sonstigeangaben', $son);
+					werteliste ('s', $son);
 				echo "</span>";
 			}
-
-			if ($jahr <> '') {
+			if (isset($jahr)) {
 				echo "\n\t\t<span title='Jahreszahl'>".$jahr."</span>";
 			}
-		echo "\n\t</td>"; // 5
-		echo "\n\t<td>&nbsp;</td>\n</tr>"; // 6
+		echo "\n\t</td>"
+		."\n\t<td>&nbsp;</td>\n</tr>";
 		$j++;
 	}
@@ -552,13 +509,15 @@
 }
 
-// H i n w e i s  auf Bodenneuordnung oder eine strittige Grenze
-$sql_boden ="SELECT b.artderfestlegung AS wert, a.beschreibung AS art_verf, b.gml_id AS verf_gml, b.bezeichnung AS verf_bez, 
+// H i n w e i s 
+// auf  "Bau-, Raum- oder Bodenordnungsrecht" (Baulast, Flurbereinigung) oder eine "strittige Grenze"
+
+// Gemeinsame FlÃ€che suchen: entweder (ST_Intersects and not ST_Touches) oder (2xST_Within OR ST_Overlaps), ST_Intersects liefert auch angrenzende
+$sql_boden="SELECT b.artderfestlegung AS wert, a.beschreibung AS art_verf, b.gml_id AS verf_gml, b.bezeichnung AS verf_bez, 
 b.name AS verf_name, d.bezeichnung AS stelle_bez, d.stelle AS stelle_key 
-FROM ax_bauraumoderbodenordnungsrecht b 
-LEFT JOIN ax_artderfestlegung_bauraumoderbodenordnungsrecht a ON b.artderfestlegung = a.wert
+FROM ax_flurstueck f 
+JOIN ax_bauraumoderbodenordnungsrecht b ON ST_Within(b.wkb_geometry, f.wkb_geometry) OR ST_Within(f.wkb_geometry, b.wkb_geometry) OR ST_Overlaps(b.wkb_geometry, f.wkb_geometry)
+LEFT JOIN ax_artderfestlegung_bauraumoderbodenordnungsrecht a ON b.artderfestlegung=a.wert 
 LEFT JOIN ax_dienststelle d ON b.stelle=d.stelle 
-WHERE b.endet IS NULL AND d.endet IS NULL  
-AND (ST_Within((SELECT wkb_geometry FROM ax_flurstueck WHERE gml_id = $1 AND endet IS NULL ), wkb_geometry)
- OR ST_Overlaps((SELECT wkb_geometry FROM ax_flurstueck WHERE gml_id = $1 AND endet IS NULL), wkb_geometry));";
+WHERE f.gml_id = $1 AND f.endet IS NULL AND b.endet IS NULL AND d.endet IS NULL";
 
 pg_prepare($con, "bodeneuordnung", $sql_boden);
@@ -566,5 +525,5 @@
 if (!$res_bodeneuordnung) {
 	echo "\n<p class='err'>Fehler bei Bau-, Raum- oder Bodenordnungsrecht</p>";
-	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sql_boden."<br>$1 = gml_id = '".$gmlid."'</p>";}
+	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1", "'".$gmlid."'", $sql_boden)."</p>";}
 }
 $sql_str="SELECT gml_id FROM ax_besondereflurstuecksgrenze WHERE endet IS NULL AND 1000 = ANY(artderflurstuecksgrenze) 
@@ -575,5 +534,5 @@
 if (!$res_strittigeGrenze) {
 	echo "\n<p class='err'>Fehler bei strittige Grenze</p>";
-	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sql_str."<br>$1 = gml_id = '".$gmlid."'</p>";}
+	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1", "'".$gmlid."'", $sql_str)."</p>";}
 }
 if (pg_num_rows($res_bodeneuordnung) > 0 OR pg_num_rows($res_strittigeGrenze) > 0) {
@@ -599,5 +558,5 @@
 			."\n</tr>";
 			$dstell=$row['stelle_key']; // Zeile 2
-			if ($dstell != "") { // Kann auch leer sein
+			if ($dstell != '') {
 				echo "\n<tr title='Flurbereinigungsbeh&ouml;rde'>"
 					."\n\t<td>&nbsp;</td>" // 1
@@ -612,5 +571,5 @@
 			$vbez=$row['verf_bez']; // Zeile 3, ist nicht immer gefÃŒllt
 			$vnam=$row['verf_name']; // noch seltener
-			if ($vbez != "") {
+			if ($vbez != '') {
 				echo "\n<tr title='Verfahrensbezeichnung'>"
 					."\n\t<td>&nbsp;</td>"
@@ -619,5 +578,5 @@
 						if ($vnam == "") {
 							echo $vbez; // nur die Nummer
-						} else {	// Name oder beides
+						} else { // Name oder beides
 							if ($showkey) {echo "<span class='key'>(".$vbez.")</span> ";}
 							echo $vnam;
@@ -640,12 +599,15 @@
 $bartgrp="";	// Buchungsart
 $barttypgrp="";	// Buchungsart Typ
-if ($gml_buchungsstelle == '') {echo "\n<p class='err'>Keine Buchungstelle zum Flurst&uuml;ck gefunden.</p>";}
-echo "\n<table class='outer'>"; // ALLE Buchungen und EigentÃŒmer in 4 Spalten EINER Tabelle ausgeben
+if ($gml_buchungsstelle === '') {
+		echo "\n<p class='err'>Keine Buchungstelle zum Flurst&uuml;ck gefunden.</p>"; // keine Verweis vorhanden?
+} else {
+	echo "\n<table class='outer'>"; // ALLE Buchungen und EigentÃŒmer in 4 Spalten EINER Tabelle ausgeben
+	
 	$stufe=1; // SchleifenzÃ€hler Tiefe
-	$gezeigt=buchung_anzg($gml_buchungsstelle, $eig, false, $gmlid, 1); // die ("dienende") Buchung anzeigen, wenn nicht fiktiv. Liefert true/false
-
-	$anzber=ber_bs_zaehl($gml_buchungsstelle); // Anzahl berechtigte Buchungen (nÃ€chste Stufe) zu dieser Buchung ermitteln
-	$verf_next = array($gml_buchungsstelle); // Start Recursion mit einem Element
-	//if ($debug > 2) {echo "<p class='dbg'>Nach Stufe ".$stufe.", Anzahl: ". $anzber ."</p>";}
+	$gezeigt=buchung_anzg($gml_buchungsstelle, $eig, false, $gmlid, 1); // die ("dienende") Buchung anzeigen, wenn nicht fiktiv. Liefert 1/0
+
+	$anzber=ber_bs_zaehl($gml_buchungsstelle);	// Anzahl berechtigte Buchungen (nÃ€chste Stufe) zu dieser Buchung ermitteln
+	$verf_next = array($gml_buchungsstelle);	// Start Recursion mit einem Element
+	//if ($debug > 1) {echo "<p class='dbg'>Nach Stufe ".$stufe.", Anzahl: ". $anzber ."</p>";}
 
 	while ($anzber > 0 ) { // Stufe - recursiv in die Tiefe, solange es was zu verfolgen gibt
@@ -666,7 +628,25 @@
 		} // Ende Buchungs-Array in der Stufe
 		$anzber=count($verf_next); // Sammlung auf Stufe zÃ€hlen, Steuert die Schleife.
-		//if ($debug > 2) {echo "<p class='dbg'>Nach Stufe ".$stufe.", Anzahl: ". $anzber ."</p>";}
+		//if ($debug > 1) {echo "<p class='dbg'>Nach Stufe ".$stufe.", Anzahl: ". $anzber ."</p>";}
 	} // Ende Stufe
-echo "\n</table>\n\n";
+
+	echo "\n</table>\n\n";
+	//if ($debug > 1) {echo "<p class='dbg'>Buchung gezeigt = ".$gezeigt."</p>";}
+
+	// Fehler aus "ModellschwÃ€che" erkennen.
+	// Wenn der Verweis der Buchungsstelle auf ein Grundbuch ins Leere lÃ€uft, weil das Grundbuch 
+	//  nicht im SekundÃ€rbestand vorhanden ist, dann kÃ¶nnte das am NBA-Verfahren liegen.
+	if ( $gezeigt === 0 and $stufe === 1 ) { // and $anzber === 0
+	//	Fehlt die Buchung oder das Grundbuch?
+		echo "<p class='err'>Das Grundbuch zur Buchung '".$gml_buchungsstelle."' fehlt in der Datenbank.</p>";
+		
+		if ($debug > 1) { // fehlt die Buchung??
+			echo "<p class='dbg'>Suchen mit SQL: SELECT * FROM ax_buchungsstelle WHERE gml_id='".$gml_buchungsstelle."'; </p>";
+		}
+	// Buchung verlinken fÃŒr weitere Suche:	alkisgsnw.php?gkz=320&gmlid=DENW18AL0000SEbl
+	// Aber das Modul zeigt nichts an (inner join ?)
+	// +++ ZunÃ€chst: Auch im Modul alkisgsnw.php den Fall berÃŒcksichtigen, dass die Buchung vorhanden ist, aber das GB nicht ?!
+	}
+}
 
 pg_close($con);
@@ -679,5 +659,5 @@
 echo "\n\t<a title='Export als CSV' href='javascript:ALKISexport(\"" . $gmlid . "\")'><img src='ico/download_fs.png' width='32' height='16' alt='Export'></a>&nbsp;\n</div>";
 
-footer($gmlid, $_SERVER['PHP_SELF']."?", "&amp;eig=".$eig);
+footer($gmlid, selbstverlinkung()."?", "&amp;eig=".$eig);
 ?>
 </body>
