Index: trunk/info/info/alkisn/alkisinlaybaurecht.php
===================================================================
--- trunk/info/info/alkisn/alkisinlaybaurecht.php	(revision 419)
+++ trunk/info/info/alkisn/alkisinlaybaurecht.php	(revision 422)
@@ -2,22 +2,32 @@
 /*	alkisinlaybaurecht.php - Inlay fuer Template: Baurecht
 	ALKIS-Buchauskunft, Kommunales Rechenzentrum Minden-Ravensberg/Lippe (Lemgo).
-	Ähnlich alkisbaurecht, aber nur Basisdaten, kein Footer und keine Flurstücks-Verschneidung.
+	Ãhnlich alkisbaurecht, aber nur Basisdaten, kein Footer und keine FlurstÃŒcks-Verschneidung.
 
 	Version:
 	2016-02-24 Version fuer norGIS-ALKIS-Import
-	2016-11-29 HTML5, Gemeinsam genutzte Datenbanken ermöglichen
-	2017-06-08 Validierung Eingabeparameter, Feinkorrekturen
-	2017-10-09 Sauber filtern auf endet IS NULL
-	2018-11-09 Umstellung Full-Schema
-	2018-11-15 Nachkorrektur
+	....
+	2020-02-03 Fenster-Weite
+	2020-02-20 Authentifizierung ausgelagert in Function darf_ich()
+	2020-12-15 Input-Validation und Strict Comparisation (===)
 */
+ini_set("session.cookie_httponly", 1);
 session_start();
 $cntget = extract($_GET); // Parameter in Variable umwandeln
 // strikte Validierung aller Parameter
-if (!isset($gmlid) or !preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
-if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
+if (isset($gmlid)) {
+	if (!preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
+} else {
+	die("Fehlender Parameter");
+}
+if (isset($gkz)) {
+	if (!preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
+} else {
+	die("Fehlender Parameter");
+}
 
-require_once("alkis_conf_location.php");
-if ($auth == "mapbender") {require_once($mapbender);}
+include "alkis_conf_location.php";
+include "alkisfkt.php";
+
+// Wert fÃŒr "width=" aus der Function "imFenster" synchron halten mit "@media screen body width" aus "alkisauszug.css"
 echo <<<END
 <!doctype html>
@@ -32,14 +42,18 @@
 	function imFenster(dieURL) {
 		var link = encodeURI(dieURL);
-		window.open(link,'','left=30,top=30,width=680,height=800,resizable=yes,menubar=no,toolbar=no,location=no,status=no,scrollbars=yes');
+		window.open(link,'','left=30,top=30,width=750,height=800,resizable=yes,menubar=no,toolbar=no,location=no,status=no,scrollbars=yes');
 	}
 	</script>
 </head>
-<body>
+<body style='width: 98%;'>
 END;
+
+$erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
+
+// Body des Inlay muss in Mapbender-Feature-Info-PopUp passen. Kleiner als 750 aus css.
 $con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisinlaybaurecht.php'");
 if (!$con) echo "\n<p class='err'>Fehler beim Verbinden der DB</p>";
 
-// Keine Spalten, die eine Berechtigungsprüfung nach Gemeinde ermöglichen:
+// Keine Spalten, die eine BerechtigungsprÃŒfung nach Gemeinde ermÃ¶glichen:
 $sql ="SELECT r.ogc_fid, r.name, r.stelle, r.bezeichnung AS rechtbez, a.beschreibung AS adfbez, d.bezeichnung AS stellbez, round(st_area(r.wkb_geometry)::numeric,0) AS flae 
 FROM ax_bauraumoderbodenordnungsrecht r 
@@ -54,5 +68,5 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Baurecht.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".$sql."<br>$1 = ".$gmlid."</p>";}
+	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1", "'".$gmlid."'", $sql)."</p>";}
 }
 echo "\n<h2><img src='ico/Gericht.png' width='16' height='16' alt=''> Bau-, Raum- oder Bodenordnungsrecht</h2>";
Index: trunk/info/info/alkisn/alkisbaurecht.php
===================================================================
--- trunk/info/info/alkisn/alkisbaurecht.php	(revision 419)
+++ trunk/info/info/alkisn/alkisbaurecht.php	(revision 422)
@@ -5,10 +5,10 @@
 	Version:
 	2016-02-24 Version fuer norGIS-ALKIS-Import
-	2016-11-29 HTML5, Gemeinsam genutzte Datenbanken ermöglichen
-	2017-06-08 Validierung Eingabeparameter, Feinkorrekturen
-	2017-10-09 Sauber filtern auf endet IS NULL
-	2018-04-23 &nodebug
-	2018-11-09 Umstellung Full-Schema
+	....
+	2020-02-20 Authentifizierung ausgelagert in Function darf_ich()
+	2020-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF']
+	2020-12-15 Input-Validation und Strict Comparisation (===)
 */
+ini_set("session.cookie_httponly", 1);
 session_start();
 $showkey="n"; $nodebug=""; // Var. aus Parameter initalisieren
@@ -16,13 +16,21 @@
 
 // strikte Validierung aller Parameter
-if (!isset($gmlid) or !preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
-if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
+if (isset($gmlid)) {
+	if (!preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
+} else {
+	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}$#', $showkey)) {die ("Eingabefehler showkey");}
-if ($showkey == "j") {$showkey=true;} else {$showkey=false;}
+if ($showkey === "j") {$showkey=true;} else {$showkey=false;}
 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"); // f. Footer
+include "alkis_conf_location.php";
+include "alkisfkt.php";
+
 echo <<<END
 <!doctype html>
@@ -38,7 +46,9 @@
 END;
 
+$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.
-// Manuell an die URL anfügen, wirkt nur temporär und wird nicht in Links weiter gereicht.
-if ($nodebug == "j") {$debug=0;} 
+// Manuell an die URL anfÃŒgen, wirkt nur temporÃ€r und wird nicht in Links weiter gereicht.
+if ($nodebug === "j") {$debug=0;} 
 
 $con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisbaurecht.php'");
@@ -59,5 +69,5 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Baurecht.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = ".$gmlid."</p>";}
+	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
 }
 if ($row = pg_fetch_assoc($res)) {
@@ -67,7 +77,9 @@
 	$stellb=$row["stellbez"];
 	$stella=$row["stellenart"];
+	$behb=$row["beschreibung"];
+	$behd=$row["dokumentation"];
 
 	// Balken
-	echo "<p class='recht'>ALKIS Bau-, Raum- oder Bodenordnungsrecht ".$artfest."-".$verfnr."&nbsp;</p>";
+	echo "<p class='balken recht'>ALKIS Bau-, Raum- oder Bodenordnungsrecht ".$artfest."-".$verfnr."&nbsp;</p>";
 
 	echo "\n<h2><img src='ico/Gericht.png' width='16' height='16' alt=''> Bau-, Raum- oder Bodenordnungsrecht</h2>";
@@ -102,6 +114,6 @@
 					."\n\t<td class='li'>Art der Dienststelle:</td>"
 					."\n\t<td>";
-						if ($showkey) {echo " <span class='key'>(".$stella.")</span>";}
-						echo "<span title='".$row["d"]."'>".$row["v"]."</span>"; 
+						if ($showkey) {echo " <span class='key'>(".$stella.")</span>&nbsp;";}
+						echo "<span title='".$behd."'>".$behb."</span>";
 					echo "</td>"
 				."\n</tr>";
@@ -124,13 +136,13 @@
 FROM ax_flurstueck f, ax_bauraumoderbodenordnungsrecht r
 WHERE r.gml_id= $1 AND f.endet IS NULL AND r.endet IS NULL ";
-if ($filtgem == '' ) { // ungefiltert
+if ($filtgem === '' ) { // ungefiltert
 	$v=array($gmlid);
 } else {
-	$sql.="AND f.gemeindezugehoerigkeit_kreis = $2 AND f.gemeindezugehoerigkeit_gemeinde = $3 "; // Zuständiges Gebiet
+	$sql.="AND f.gemeindezugehoerigkeit_kreis = $2 AND f.gemeindezugehoerigkeit_gemeinde = $3 "; // ZustÃ€ndiges Gebiet
 	$v=array($gmlid, $filtkreis, $filtgem);
 }
 $sql.="AND st_intersects(r.wkb_geometry,f.wkb_geometry) = true 
 AND st_area(st_intersection(r.wkb_geometry,f.wkb_geometry)) > 0.05 
-ORDER BY schnittflae DESC LIMIT 50;"; 
+ORDER BY schnittflae DESC LIMIT 100;"; 
 // > 0.0 ist gemeint, Ungenauigkeit durch st_simplify
 // Limit: Flurbereinig. kann gross werden!
@@ -140,6 +152,6 @@
 $res=pg_execute("", $v);
 if (!$res) {
-	echo "\n<p class='err'>Keine Flurst&uuml;cke ermittelt.<br>\nSQL=<br></p>";
-//	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = ".$gmlid."</p>";}
+	echo "\n<p class='err'>Keine Flurst&uuml;cke ermittelt.<br></p>";
+	//if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";} // ggf. mehrere Parameter!
 }
 
@@ -172,6 +184,6 @@
 echo "\n</table>";
 
-if ($fscnt == 0) { // nicht gefunden
-	if ($filtgem == '' ) { // ungefiltert
+if ($fscnt === 0) { // nicht gefunden
+	if ($filtgem === '' ) { // ungefiltert
 		echo "\n<p class='err'>Kein Flurst&uuml;ck gefunden.</p>";
 	} else { // Wahrscheinliche Ursache = Filter
@@ -179,6 +191,6 @@
 	//	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = ".$gmlid." $2 = ".$filtkreis." $3 = ".$filtgem."</p>";}
 	}
-} elseif ($fscnt == 50) {
-	echo "<p>... und weitere Flurst&uuml;cke (Limit 50 erreicht).</p>";
+} elseif ($fscnt === 100) {
+	echo "<p>... und weitere Flurst&uuml;cke (Limit 100 erreicht).</p>";
 }
 
@@ -193,5 +205,5 @@
 END;
 
-footer($gmlid, $_SERVER['PHP_SELF']."?", "");
+footer($gmlid, selbstverlinkung()."?", "");
 
 ?>
Index: trunk/info/info/alkisn/alkisbauwerk.php
===================================================================
--- trunk/info/info/alkisn/alkisbauwerk.php	(revision 422)
+++ trunk/info/info/alkisn/alkisbauwerk.php	(revision 422)
@@ -0,0 +1,595 @@
+<?php
+/*	alkisbauwerk.php - Bauwerksdaten
+	ALKIS-Buchauskunft, Kommunales Rechenzentrum Minden-Ravensberg/Lippe (Lemgo).
+
+	1 Bauwerk im Verkehrsbereich
+	2 Bauwerk im GewÃ€sserbereich
+	3 Sonstiges Bauwerk oder sonstige Einrichtung
+	4 Bauwerk oder Anlage fÃŒr Industrie und Gewerbe
+	5 Bauwerk oder Anlage fÃŒr Sport, Freizeit und Erholung
+	6 Leitung
+	7 Transportanlage
+	8 Turm
+	9 VorratsbehÃ€lter, Speicherbauwerk
+
+	Version:
+	2021-03-11 Neues Modul
+	2021-03-17 Korrekturen
+
+*/
+
+// Bauwerk (bw) gehÃ¶rt zu (gz) Lage
+// Ein Bauwerk "gehÃ¶rt zu" (Relation) einem GebÃ€ude. Zu diesem GebÃ€ude die Adresse(n) als Tabellen-Zeile ausgeben
+function bw_gz_lage($gmlgz) {
+	global $gkz, $debug, $showkey;
+	
+	// HAUPTgebÃ€ude  Geb >zeigtAuf> lage (mehrere)
+	$sqlgz="SELECT 'm' AS ltyp, l.gml_id AS lgml, s.lage, s.bezeichnung, l.hausnummer, '' AS laufendenummer "
+	."FROM ax_gebaeude g JOIN ax_lagebezeichnungmithausnummer l ON l.gml_id=ANY(g.zeigtauf) "
+	."JOIN ax_lagebezeichnungkatalogeintrag s ON l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage=s.lage "
+	."WHERE g.gml_id= $1 AND g.endet IS NULL AND l.endet IS NULL AND s.endet IS NULL ";
+
+	// ++ evtl. keine NEBEN-GebÃ€ude mÃ¶glich, nur Haupt-?
+	// UNION - oder NEBENgebÃ€ude  Geb >hat> Pseudo
+	$sqlgz.="UNION SELECT 'p' AS ltyp, l.gml_id AS lgml, s.lage, s.bezeichnung, l.pseudonummer AS hausnummer, l.laufendenummer "
+	."FROM ax_gebaeude g JOIN ax_lagebezeichnungmitpseudonummer l ON l.gml_id=g.hat "
+	."JOIN ax_lagebezeichnungkatalogeintrag s ON l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage=s.lage "
+	."WHERE g.gml_id= $1 AND g.endet IS NULL AND l.endet IS NULL AND s.endet IS NULL "; // ID des Hauses"
+
+	$sqlgz.="ORDER BY bezeichnung, hausnummer, laufendenummer;";
+	$v = array($gmlgz);
+	$resgz = pg_prepare("", $sqlgz);
+	$resgz = pg_execute("", $v);
+	if (!$resgz) {
+		echo "\n<p class='err'>Fehler bei Lage mit HsNr. zum Bauwerk</p>";
+		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1", "'".$gmlgz."'", $sqlgz)."</p>";}
+		if ($debug > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($resgz)."</p>";}
+	} else {
+		echo "\n<tr>";
+		echo "\n\t<td class='li'>Lage</td>";
+		echo "\n\t<td class='fett'>";
+		while($rowgz = pg_fetch_assoc($resgz)) { // LOOP: Lagezeilen
+			$ltyp=$rowgz["ltyp"];
+			$skey=$rowgz["lage"];
+			$snam=htmlentities($rowgz["bezeichnung"], ENT_QUOTES, "UTF-8");
+			$hsnr=$rowgz["hausnummer"];
+			$hlfd=$rowgz["laufendenummer"];
+			$gmllag=$rowgz["lgml"];
+
+			if ($ltyp === "p") {
+				$lagetitl="NebengebÃ€ude Nr. ".$hlfd;
+			//	$lagetxt="Nebengeb&auml;ude Nr. ".$hlfd; // alt
+				$lagetxt=$snam."&nbsp;".$hsnr." (".$hlfd.")";
+			} else {
+				$lagetitl="HauptgebÃ€ude - Hausnummer ".$hsnr;
+				$lagetxt=$snam."&nbsp;".$hsnr;
+			}
+
+			echo "\n\t\t<a title='".$lagetitl."' href='alkislage.php?gkz=".$gkz."&amp;gmlid=".$gmllag."&amp;ltyp=".$ltyp;
+				if ($showkey) {echo "&amp;showkey=j";}
+				echo "'>";
+				if ($showkey) {echo "<span class='key'>(".$skey.")</span>&nbsp;";}
+			echo $lagetxt."&nbsp;<img src='ico/Lage_mit_Haus.png' width='16' height='16' alt=''></a>&nbsp;";
+		}
+		echo "</td>";
+		echo "\n\t<td>";
+		echo "\n\t\t<p class='erkli'>Das Haus hat die Adresse ".$lagetitl."</p>";
+		echo "\n\t</td>\n</tr>";
+		pg_free_result($resgz);
+	}
+}
+
+// Eine Zeile der HTML-Tabelle ausgeben
+function tab_zeile($titel, $key, $inhalt, $ea, $ei) {
+	global $showkey, $allefelder, $debug;
+	if ($inhalt != "" OR $allefelder) {
+		echo "\n<tr>\n\t<td class='li'>".$titel."</td>\n\t<td class='fett'>";
+		if ($showkey and $key != '') {echo "<span class='key'>(".$key.")</span> ";}
+		echo $inhalt."</td>\n\t<td>";
+		if ($ea != '') {echo "\n\t\t<p class='erklk'>".$ea."</p>";}	// Erkl. Attribut (allgemein)
+		if ($ei != '') {echo "\n\t\t<p class='erkli'>".$ei."</p>";}	// Erkl. Inhalt (speziell)
+		echo "\n\t</td>\n</tr>";
+	}
+}
+
+// Eine zusÃ€tzliche Daten-Spalte der Datenbank-Tabelle in eine Zeile der HTML-Tabelle ausgeben (Key|Value|ErklÃ€rung)
+// Anwendung fÃŒr die DB-Spalten, die nicht bei jeder Bauwerks-Tabelle vorkommen
+function zusatz_spalte($col, $inhalt) { // Spalten-Name, Value
+	global $debug;
+	$einh='';
+	switch ($col) {	
+		case 'objekthoehe':
+			$titel='Objekth&ouml;he';
+			$einh=' m';
+		break;
+		case 'breitedesobjekts':
+			$titel='Breite des Objekts';
+			$einh=' m';
+		break;
+		case 'bezeichnung':
+			$titel='Bezeichnung';
+		break;	
+	// 1 Verk.
+		case 'durchfahrtshoehe':
+			$titel='Durchfahrtsh&ouml;he';
+			$einh=' m';
+		break;	
+	// 6 Leitung
+		case 'spannungsebene':
+			$titel='Spannungsebene';
+			$einh=' KV';
+		break;
+	// 7 Transport
+		case 'produkt':
+			$titel='Produkt';
+		break;
+	// Fehler
+		default: // noch nicht berÃŒcksichtigt
+			if ($debug > 1) {echo "<p class='dbg'>Der Feldname ".$col." ist in function zusatz_spalte noch nicht ber&uuml;cksichtigt.</p>";}
+			$titel=$col;
+	}
+
+	if ($inhalt != '') {$inhalt.=$einh;}
+	tab_zeile($titel, '', $inhalt, '', '');
+}
+
+// Eine Zeile der HTML-Tabelle ausgeben, die einen Objektverweis (Relation) enthÃ€lt
+function verweis_zeile($zieltyp, $link, $info) {
+	echo "\n<tr>\n\t<td class='li'>".$zieltyp."</td>\n\t<td class='fett'>".$link."</td>\n\t<td>";
+	echo "\n\t\t<p class='erkli'>".$info."</p>\n\t</td>\n</tr>";
+}
+
+// Ein Relationen-Feld anzeigen
+// col = Name der DB-Spalte
+// inhalt = gml_id oder Array mit gml_id's
+function objektverweis($col, $inhalt) {
+	global $gkz, $showkey, $debug;
+//	if ($debug > 1) {echo "<p>Verweis Typ '".$col."' auf Objekt(e): '".$inhalt."'.</p>";}
+	switch ($col) {
+		case 'hatdirektunten': // [] ++ Wie kann man dies Objekt finden?
+			$olist='';
+			$arrhdu=explode(",", trim($inhalt, "{}"));
+			foreach($arrhdu AS $hdugml) {$olist.=$hdugml."<br>";}
+			tab_zeile('Hat direkt Unten', '', $olist, '', 'Verweis auf ein Objekt unter diesem Bauwerk, Typ unbekannt.');
+		break;
+
+		case 'gehoertzu': // Assoziation zu: FeatureType AX_Gebaeude (ax_gebaeude) 0..1'
+			if ($inhalt == '') {
+				verweis_zeile('Haus', '', 'Das Bauwerk geh&ouml;rt zum Haus');
+			} else {
+				$link="\n\t\t<a title='geh&ouml;rt zu' href='alkishaus.php?gkz=".$gkz."&amp;gmlid=".$inhalt;
+				if ($showkey) {$link.="&amp;showkey=j";}
+				$link.="'>Haus&nbsp;<img src='ico/Haus.png' width='16' height='16' alt=''></a>";
+				verweis_zeile('Haus', $link, 'Das Bauwerk geh&ouml;rt zum Haus');
+				bw_gz_lage($inhalt);				
+			}
+		break;
+
+	// 'istabgeleitetaus';  'traegtbeizu': 'istteilvon': // -> Keine FÃ€lle vorhanden
+		default:
+			if ($debug > 1) {echo "<p class='dbg'>Der Feldname ".$col." ist in function 'objektverweis' noch nicht ber&uuml;cksichtigt.</p>";}
+	}
+}
+// alle leer:
+//  SELECT * FROM bauwerke_zusammenfassung WHERE NOT istabgeleitetaus IS NULL;
+//  SELECT * FROM bauwerke_zusammenfassung WHERE NOT traegtbeizu IS NULL;
+//  SELECT * FROM bauwerke_zusammenfassung WHERE NOT istteilvon IS NULL;
+// SELECT gml_id, hatdirektunten, st_asewkt( wkb_geometry ) as wkt FROM ax_bauwerkimgewaesserbereich WHERE NOT hatdirektunten IS NULL;
+//  1 Fall  in 290: 2 / DENW15AL360000N7 , 
+// SELECT gml_id, hatdirektunten, st_asewkt( wkb_geometry ) as wkt FROM ax_bauwerkimgewaesserbereich WHERE gml_id = 'DENW15AL360000N7';
+// 34 FÃ€lle in 200: 
+// 16 FÃ€lle in 300:
+
+// S T A R T
+
+ini_set("session.cookie_httponly", 1);
+session_start();
+$allfld = "n"; $showkey="n"; $nodebug=""; // Var. aus Parameter initalisieren
+$cntget = extract($_GET);	// Parameter in Variable umwandeln
+
+// strikte Validierung aller Parameter
+if (isset($gmlid)) {
+	if (!preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
+} else {
+	die("Fehlender Parameter");
+}
+if (isset($gkz)) {
+	if (!preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
+} else {
+	die("Fehlender Parameter");
+}
+if (!preg_match('#^[1-9]{1}$#', $btyp)) {die("Eingabefehler btyp");} // Bauwerks-Typ = Tabelle
+if (!preg_match('#^[j|n]{0,1}$#', $showkey)) {die ("Eingabefehler showkey");}
+if ($showkey === "j") {$showkey=true;} else {$showkey=false;}
+if (!preg_match('#^[j|n]{0,1}$#', $allfld)) {die ("Eingabefehler allfld");}
+if ($allfld === "j") {$allefelder=true;} else {$allefelder=false;}
+if (!preg_match('#^j{0,1}$#', $nodebug)) {die("Eingabefehler nodebug");}
+
+include "alkis_conf_location.php";
+include "alkisfkt.php";
+
+echo <<<END
+<!doctype html>
+<html lang="de">
+<head>
+	<meta charset="utf-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<title>ALKIS Bauwerksdaten</title>
+	<link rel="stylesheet" type="text/css" href="alkisauszug.css">
+	<link rel="shortcut icon" type="image/x-icon" href="ico/Haus.ico">
+</head>
+<body>
+
+END;
+
+$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.
+// Manuell an die URL anfÃŒgen, wirkt nur temporÃ€r und wird nicht in Links weiter gereicht.
+if ($nodebug === "j") {$debug=0;} 
+
+$con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisbauwerk.php'");
+if (!$con) echo "\n<p class='err'>Fehler beim Verbinden der DB</p>\n";
+
+// Konstanten fÃŒr Sortierung und Gruppierung
+$btyp_verkehr=1; $btyp_gewaesser=2; $btyp_sonst=3; $btyp_indu=4; $btyp_sport=5;
+$btyp_leitg=6; $btyp_trans=7; $btyp_turm=8; $btyp_vorrat=9;
+
+/* in ALLEN Bauwerks-Typen folgende Spalten, bisher NICHT verwendet:
+    processstep_ax_li_processstep_mitdatenerhebung_description[] processstep_rationale[]
+    processstep_datetime[] processstep_individualname[] processstep_organisationname[] processstep_positionname[]
+    processstep_phone[] processstep_address[] processstep_onlineresource[] processstep_hoursofservice[]
+    processstep_contactinstructions[] processstep_role[] processstep_ax_datenerhebung[]
+    processstep_scaledenominator[] processstep_sourcereferencesystem[] processstep_sourceextent[] processstep_sourcestep[]
+
+    herkunft_source_source_ax_datenerhebung[] herkunft_source_source_scaledenominator[] herkunft_source_source_sourcereferencesystem[]
+    herkunft_source_source_sourceextent[]     herkunft_source_source_sourcestep[] */
+
+/* Fallunterscheidung: B a u w e r k s - T y p
+Nacheinander werden folgende Abfragen je Objekt ausgefÃŒhrt:
+	1. sqlb: Standard-Spalten, die bei jedem Typ vorhanden sind 
+	2. sqlk: ZusÃ€tzliche Key-Value-Beziehungen (mit Key und ErklÃ€rung)
+	3. sqlz: ZusÃ€tzliche Spalten, individuell je Objektart (einfache Werte-Darstellung)
+	4. sqlr: Relationen zu anderen Objektarten */
+switch ($btyp) {
+	
+case $btyp_verkehr:	// 1 - V e r k e h r
+	$btyptitle='Bauwerk im Verkehrsbereich';
+	$sqlb="SELECT b1.bauwerksfunktion, k1.beschreibung, k1.dokumentation, b1.name, b1.statement, GeometryType(b1.wkb_geometry) as bgeotyp, round(st_area(b1.wkb_geometry)::numeric,2) AS flae
+ FROM ax_bauwerkimverkehrsbereich b1 LEFT JOIN ax_bauwerksfunktion_bauwerkimverkehrsbereich k1 ON b1.bauwerksfunktion=k1.wert 
+ WHERE b1.gml_id = $1 AND b1.endet IS NULL;";
+	$sqlk="SELECT b1.zustand, k1.beschreibung, k1.dokumentation
+ FROM ax_bauwerkimverkehrsbereich b1 LEFT JOIN ax_zustand_bauwerkimverkehrsbereich k1 ON b1.zustand=k1.wert 
+ WHERE b1.gml_id = $1 AND b1.endet IS NULL;";
+	$sqlz="SELECT b1.bezeichnung, b1.breitedesobjekts, b1.durchfahrtshoehe FROM ax_bauwerkimverkehrsbereich b1 WHERE b1.gml_id = $1 AND b1.endet IS NULL;";
+	$sqlr="SELECT b1.hatdirektunten FROM ax_bauwerkimverkehrsbereich b1 WHERE b1.gml_id = $1 AND b1.endet IS NULL;";
+break;
+
+case $btyp_gewaesser:	// 2 - G e w Ã€ s s e r
+	$btyptitle='Bauwerk im GewÃ€sserbereich';
+	$sqlb="SELECT b2.bauwerksfunktion, ug.beschreibung, ug.dokumentation, b2.name, b2.statement, GeometryType(b2.wkb_geometry) as bgeotyp, round(st_area(b2.wkb_geometry)::numeric,2) AS flae
+ FROM ax_bauwerkimgewaesserbereich b2 LEFT JOIN ax_bauwerksfunktion_bauwerkimgewaesserbereich ug ON b2.bauwerksfunktion=ug.wert 
+ WHERE b2.gml_id = $1 AND b2.endet IS NULL;";
+	$sqlk="SELECT b2.zustand, k2.beschreibung, k2.dokumentation
+ FROM ax_bauwerkimgewaesserbereich b2 LEFT JOIN ax_zustand_bauwerkimgewaesserbereich k2 ON b2.zustand=k2.wert 
+ WHERE b2.gml_id = $1 AND b2.endet IS NULL;";
+	$sqlz="SELECT b2.bezeichnung FROM ax_bauwerkimgewaesserbereich b2 WHERE b2.gml_id = $1 AND b2.endet IS NULL;";
+	$sqlr="SELECT b2.hatdirektunten FROM ax_bauwerkimgewaesserbereich b2 WHERE b2.gml_id = $1 AND b2.endet IS NULL;";
+break;
+
+case $btyp_sonst:	// 3 - S o n s t i g e  Bauwerke
+	$btyptitle='Sonstiges Bauwerk oder sonstige Einrichtung';
+	$sqlb="SELECT b3.bauwerksfunktion, k3.beschreibung, k3.dokumentation, b3.name, b3.statement,
+ GeometryType(b3.wkb_geometry) as bgeotyp, round(st_area(b3.wkb_geometry)::numeric,2) AS flae
+ FROM ax_sonstigesbauwerkodersonstigeeinrichtung b3 LEFT JOIN ax_bauwerksfunktion_sonstigesbauwerkodersonstigeeinrichtun k3 ON b3.bauwerksfunktion=k3.wert 
+ WHERE b3.gml_id = $1 AND b3.endet IS NULL;";
+	$sqlk="SELECT b3.funktion, k3.beschreibung AS beschr, k3.dokumentation AS doku, b3.hydrologischesmerkmal, hm.beschreibung AS hmbeschr, hm.dokumentation AS hmdoku
+ FROM ax_sonstigesbauwerkodersonstigeeinrichtung b3 
+ LEFT JOIN ax_funktion_bauwerk k3 ON b3.funktion=k3.wert 
+ LEFT JOIN ax_hydrologischesmerkmal_sonstigesbauwerkodersonstigeeinri hm ON b3.hydrologischesmerkmal=hm.wert 
+ WHERE b3.gml_id = $1 AND b3.endet IS NULL;";
+	$sqlz="SELECT b3.bezeichnung, b3.objekthoehe FROM ax_sonstigesbauwerkodersonstigeeinrichtung b3 WHERE b3.gml_id = $1 AND b3.endet IS NULL;";
+ 	$sqlr="SELECT b3.hatdirektunten, b3.gehoertzu FROM ax_sonstigesbauwerkodersonstigeeinrichtung b3 WHERE b3.gml_id = $1 AND b3.endet IS NULL;";
+	
+/*  gehoertzubauwerk_ax_sonstigesbauwerkodersonstigeeinrichtun 
+    gehoertzubauwerk_ax_bauwerkoderanlagefuersportfreizeitunde 
+    gehoertzubauwerk_ax_leitung 
+    gehoertzubauwerk_ax_bauwerkoderanlagefuerindustrieundgewer 
+    gehoertzubauwerk_ax_einrichtunginoeffentlichenbereichen 
+    gehoertzubauwerk_ax_heilquellegasquelle 
+    gehoertzubauwerk_ax_historischesbauwerkoderhistorischeeinr 
+    gehoertzubauwerk_ax_turm 
+    gehoertzubauwerk_ax_vorratsbehaelterspeicherbauwerk 
+    gehoertzubauwerk_ax_transportanlage 
+    gehoertzubauwerk_ax_wegpfadsteig 
+    gehoertzubauwerk_ax_gleis 
+    gehoertzubauwerk_ax_bahnverkehrsanlage 
+    gehoertzubauwerk_ax_bauwerkimgewaesserbereich 
+    gehoertzubauwerk_ax_strassenverkehrsanlage 
+    gehoertzubauwerk_ax_seilbahnschwebebahn 
+    gehoertzubauwerk_ax_einrichtungenfuerdenschiffsverkehr 
+    gehoertzubauwerk_ax_bauwerkimverkehrsbereich 
+    gehoertzubauwerk_ax_flugverkehrsanlage 
+    gehoertzubauwerk_ax_gewaesserstationierungsachse 
+    gehoertzubauwerk_ax_sickerstrecke 
+    gehoertzubauwerk_ax_schifffahrtsliniefaehrverkehr 
+    gehoertzubauwerk_ax_wasserspiegelhoehe 
+    gehoertzubauwerk_ax_abschnitt 
+    gehoertzubauwerk_ax_ast 
+    gehoertzubauwerk_ax_netzknoten 
+    gehoertzubauwerk_ax_nullpunkt 
+    gehoertzubauwerk_ax_hafen 
+    gehoertzubauwerk_ax_testgelaende 
+    gehoertzubauwerk_ax_schleuse 
+    gehoertzubauwerk_ax_ortslage 
+    gehoertzubauwerk_ax_grenzuebergang 
+    gehoertzubauwerk_ax_polder 
+    gehoertzubauwerk_ax_gewaessermerkmal 
+    gehoertzubauwerk_ax_untergeordnetesgewaesser 
+    gehoertzubauwerk_ax_vegetationsmerkmal */ 
+break;
+
+case $btyp_indu:	// 4 - Bauwerk oder Anlage fÃŒr  I n d u s t r i e  und Gewerbe
+	$btyptitle="Bauwerk oder Anlage fÃŒr Industrie und Gewerbe";
+	$sqlb="SELECT b4.bauwerksfunktion, k4.beschreibung, k4.dokumentation, b4.name, b4.statement, GeometryType(b4.wkb_geometry) as bgeotyp, round(st_area(b4.wkb_geometry)::numeric,2) AS flae
+ FROM ax_bauwerkoderanlagefuerindustrieundgewerbe b4 LEFT JOIN ax_bauwerksfunktion_bauwerkoderanlagefuerindustrieundgewer k4 ON b4.bauwerksfunktion=k4.wert 
+ WHERE b4.gml_id = $1 AND b4.endet IS NULL;";
+	$sqlk="SELECT b4.zustand, k4.beschreibung, k4.dokumentation
+ FROM ax_bauwerkoderanlagefuerindustrieundgewerbe b4 LEFT JOIN ax_zustand_bauwerkoderanlagefuerindustrieundgewerbe k4 ON b4.zustand=k4.wert 
+ WHERE b4.gml_id = $1 AND b4.endet IS NULL;";
+	$sqlz="SELECT b4.bezeichnung, b4.objekthoehe FROM ax_bauwerkoderanlagefuerindustrieundgewerbe b4 WHERE b4.gml_id = $1 AND b4.endet IS NULL;";
+ 	$sqlr="SELECT b4.hatdirektunten FROM ax_bauwerkoderanlagefuerindustrieundgewerbe b4 WHERE b4.gml_id = $1 AND b4.endet IS NULL;";
+break;
+
+case $btyp_sport:	// 5 - Bauwerk oder Anlage fÃŒr  S p o r t , Freizeit und Erholung
+	$btyptitle="Bauwerk oder Anlage fÃŒr Sport, Freizeit und Erholung";
+	$sqlb="SELECT b5.bauwerksfunktion, k5.beschreibung, k5.dokumentation, b5.name, b5.statement, GeometryType(b5.wkb_geometry) as bgeotyp, round(st_area(b5.wkb_geometry)::numeric,2) AS flae
+ FROM ax_bauwerkoderanlagefuersportfreizeitunderholung b5 LEFT JOIN ax_bauwerksfunktion_bauwerkoderanlagefuersportfreizeitunde k5 ON b5.bauwerksfunktion=k5.wert 
+ WHERE b5.gml_id = $1 AND b5.endet IS NULL;";
+	$sqlk="SELECT b5.sportart, k5.beschreibung, k5.dokumentation
+ FROM ax_bauwerkoderanlagefuersportfreizeitunderholung b5 LEFT JOIN ax_sportart_bauwerkoderanlagefuersportfreizeitunderholung k5 ON b5.sportart=k5.wert 
+ WHERE b5.gml_id = $1 AND b5.endet IS NULL;";
+	$sqlz="SELECT b5.breitedesobjekts FROM ax_bauwerkoderanlagefuersportfreizeitunderholung b5 WHERE b5.gml_id = $1 AND b5.endet IS NULL;";
+ 	$sqlr="SELECT b5.hatdirektunten FROM ax_bauwerkoderanlagefuersportfreizeitunderholung b5 WHERE b5.gml_id = $1 AND b5.endet IS NULL;";
+break;
+
+case $btyp_leitg:	// 6 - L e i t u n g
+	$btyptitle="Leitung";
+	$sqlb="SELECT b6.bauwerksfunktion, k6.beschreibung, k6.dokumentation, b6.name, b6.statement, GeometryType(b6.wkb_geometry) as bgeotyp, round(st_area(b6.wkb_geometry)::numeric,2) AS flae
+ FROM ax_leitung b6 LEFT JOIN ax_bauwerksfunktion_leitung k6 ON b6.bauwerksfunktion=k6.wert 
+ WHERE b6.gml_id = $1 AND b6.endet IS NULL;";	
+	$sqlk="";
+	$sqlz="SELECT b6.spannungsebene FROM ax_leitung b6 WHERE b6.gml_id = $1 AND b6.endet IS NULL;";
+ 	$sqlr="SELECT b6.hatdirektunten FROM ax_leitung b6 WHERE b6.gml_id = $1 AND b6.endet IS NULL;";
+break;
+
+case $btyp_trans:	// 7 - T r a n s p o r t a n l a g e
+	$btyptitle="Transportanlage";
+	$sqlb="SELECT b7.bauwerksfunktion, k7.beschreibung, k7.dokumentation, NULL AS name, b7.statement, GeometryType(b7.wkb_geometry) as bgeotyp, round(st_area(b7.wkb_geometry)::numeric,2) AS flae
+ FROM ax_transportanlage b7 LEFT JOIN ax_bauwerksfunktion_transportanlage k7 ON b7.bauwerksfunktion=k7.wert 
+ WHERE b7.gml_id = $1 AND b7.endet IS NULL;";
+	$sqlk="SELECT b7.lagezurerdoberflaeche, k7.beschreibung, k7.dokumentation
+ FROM ax_transportanlage b7 LEFT JOIN ax_lagezurerdoberflaeche_transportanlage k7 ON b7.lagezurerdoberflaeche=k7.wert 
+ WHERE b7.gml_id = $1 AND b7.endet IS NULL;";
+	$sqlz="SELECT b7.produkt FROM ax_transportanlage b7 WHERE b7.gml_id = $7 AND b7.endet IS NULL;";
+ 	$sqlr="SELECT b7.hatdirektunten FROM ax_transportanlage b7 WHERE b7.gml_id = $1 AND b7.endet IS NULL;";
+break;
+
+case $btyp_turm:	// 8 - T u r m  (Sonderfall Array)
+	$btyptitle="Turm";
+	$sqlb="SELECT k8.wert AS bauwerksfunktion, k8.beschreibung, k8.dokumentation, b8.name, b8.statement, GeometryType(b8.wkb_geometry) as bgeotyp, round(st_area(b8.wkb_geometry)::numeric,2) AS flae
+ FROM ax_turm b8 LEFT JOIN ax_bauwerksfunktion_turm k8 ON k8.wert =ANY(b8.bauwerksfunktion)
+ WHERE b8.gml_id = $1 AND b8.endet IS NULL;";
+	$sqlk="SELECT b8.zustand, k8.beschreibung, k8.dokumentation
+ FROM ax_turm b8 LEFT JOIN ax_zustand_turm k8 ON b8.zustand=k8.wert 
+ WHERE b8.gml_id = $1 AND b8.endet IS NULL;";
+	$sqlz="SELECT b8.objekthoehe FROM ax_turm b8 WHERE b8.gml_id = $1 AND b8.endet IS NULL;";
+ 	$sqlr="SELECT b8.hatdirektunten, b8.zeigtauf FROM ax_turm b8 WHERE b8.gml_id = $1 AND b8.endet IS NULL;";
+break;
+
+case $btyp_vorrat:	// 9 -  V o r r a t s b e h Ã€ l t e r ,  S p e i c h e r b a u w e r k
+	$btyptitle="VorratsbehÃ€lter, Speicherbauwerk";
+	$sqlb="SELECT b9.bauwerksfunktion, k9.beschreibung, k9.dokumentation, b9.name, b9.statement, GeometryType(b9.wkb_geometry) as bgeotyp, round(st_area(b9.wkb_geometry)::numeric,2) AS flae
+ FROM ax_vorratsbehaelterspeicherbauwerk b9 LEFT JOIN ax_bauwerksfunktion_vorratsbehaelterspeicherbauwerk k9 ON b9.bauwerksfunktion=k9.wert 
+ WHERE b9.gml_id = $1 AND b9.endet IS NULL;";
+	$sqlk="SELECT b9.lagezurerdoberflaeche, k9.beschreibung, k9.dokumentation, 
+	 b9.speicherinhalt, sp9.beschreibung AS spbes, sp9.dokumentation AS spdok
+ FROM ax_vorratsbehaelterspeicherbauwerk b9 
+ LEFT JOIN ax_lagezurerdoberflaeche_vorratsbehaelterspeicherbauwerk k9 ON b9.lagezurerdoberflaeche=k9.wert 
+ LEFT JOIN ax_speicherinhalt_vorratsbehaelterspeicherbauwerk sp9 ON b9.speicherinhalt=sp9.wert 
+ WHERE b9.gml_id = $1 AND b9.endet IS NULL;";
+	$sqlz="SELECT b9.objekthoehe FROM ax_vorratsbehaelterspeicherbauwerk b9 WHERE b9.gml_id = $1 AND b9.endet IS NULL;";
+ 	$sqlr="SELECT b9.hatdirektunten FROM ax_vorratsbehaelterspeicherbauwerk b9 WHERE b9.gml_id = $1 AND b9.endet IS NULL;";
+break;
+
+default:
+	die('<p class="stop1">Fehler showkey</p></body>');
+break;
+}
+
+// 1. sqlb: Standard-Spalten, die bei jedem Typ vorhanden sind
+$v=array($gmlid);
+$resb=pg_prepare("", $sqlb);
+$resb=pg_execute("", $v);
+if (!$resb) {
+	echo "\n<p class='err'>Fehler bei Bauwerksdaten Standardfelder.</p>";
+	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlb)."'</p>";}
+	if ($debug > 1) {echo "\n<p class='dbg'>Fehler:".pg_result_error($resb)."</p>";}
+} else {
+	if (!$rowb = pg_fetch_assoc($resb)) {
+		echo "\n<p class='err'>Fehler! Kein Treffer f&uuml;r gml_id=".$gmlid."</p>";
+		die('<p class="stop1">Abbruch</p></body>'); // Das wÃŒrde sich sonst 2x wiederholen
+	} else {
+	// Treffer
+		// Seitenkopf
+		echo "<p class='balken bauwerk".$btyp."'>ALKIS Bauwerk ".$btyp." - ".$gmlid."&nbsp;</p>"; // Balken, Farbe wie WMS
+		echo "\n<h2>".$btyptitle."</h2>";
+		echo "\n<p class='nwlink noprint'>"; // Umschalter: auch leere Felder
+		echo "Umschalten: <a class='nwlink' href='".selbstverlinkung()."?gkz=".$gkz."&amp;btyp=".$btyp."&amp;gmlid=".$gmlid;
+			if ($showkey) {echo "&amp;showkey=j";} else {echo "&amp;showkey=n";}
+			if ($allefelder) {
+				echo "&amp;allfld=n'>nur Felder mit Inhalt";
+			} else {
+				echo "&amp;allfld=j'>auch leere Felder";
+			}
+		echo "</a></p>";
+
+		echo "\n<table class='geb'>"
+		."\n<tr>"
+			."\n\t<td class='head' title=''>Attribut</td>"
+			."\n\t<td class='head mittelspalte' title=''>Wert</td>"
+			."\n\t<td class='head' title=''>"
+				."\n\t\t<p class='erklk'>Erkl&auml;rung zum Attribut</p>"
+				."\n\t\t<p class='erkli'>Erkl&auml;rung zum Inhalt</p>"
+			."\n\t</td>"
+		."\n</tr>";
+
+		tab_zeile('Bauwerksfunktion', $rowb["bauwerksfunktion"], htmlentities($rowb["beschreibung"], ENT_QUOTES, "UTF-8"), '', htmlentities($rowb["dokumentation"], ENT_QUOTES, "UTF-8"));
+		tab_zeile('Name',        '', htmlentities($rowb["name"], ENT_QUOTES, "UTF-8"), '', '');
+		tab_zeile('Statement',   '', htmlentities($rowb["statement"], ENT_QUOTES, "UTF-8"), '', '');
+
+		// G e o m e t r i e  und FlÃ€che
+		$geotyp=$rowb["bgeotyp"];
+		switch ($geotyp) {
+			case "POINT":
+				$geodeutsch=$geotyp." bedeutet 'Punkt', einzelne Koordinate.";
+			break;
+			case "LINESTRING":
+				$geodeutsch=$geotyp." bedeutet 'Linie'.";
+			break;
+			case "POLYGON":
+				$geodeutsch=$geotyp." bedeutet eine einzelne 'Fl&auml;che'.";
+			break;
+			case "MULTIPOLYGON":
+				$geodeutsch=$geotyp." bedeutet eine 'Fl&auml;che', die aus mehreren Teilen bestehen kann oder die Aussparungen haben kann.";	
+			break;
+			default: $geodeutsch="";
+		}
+		tab_zeile('Geometrietyp', '', $geotyp, '', $geodeutsch);
+
+		if ($geotyp == "POLYGON" or $geotyp == "MULTIPOLYGON") {
+			$flaeche=$rowb["flae"]." m&#178;";
+			tab_zeile('Fl&auml;che', '', $flaeche, '', "Die 'Fl&auml;che' des Bauwerks wird aus der Geometrie berechnet, aber nur bei POLYGON.");
+		}
+	}
+	pg_free_result($resb);
+}
+
+// 2. sqlk:  Z u s Ã€ t z l i c h e   K e y - V a l u e - B e z i e h u n g e n
+// Andere Art der Darstellung als die schlichten Zusatzfelder, Key optional anzeigen, ErklÃ€rung zum Wert aus SchlÃŒsseltabelle
+if ($sqlk != '') {
+	$v=array($gmlid);
+	$resk=pg_prepare("", $sqlk);
+	$resk=pg_execute("", $v);	
+	if (!$resk) {
+		echo "\n<p class='err'>Fehler bei Schl&uuml;sseltabelle ".$btyp."</p>";
+		if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlk)."'</p>";}
+		if ($debug > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($resk)."</p>";}
+	} else {
+		if (!$rowk = pg_fetch_array($resk)) {
+			echo "\n<p class='err'>Fehler! Kein Treffer f&uuml;r gml_id=".$gmlid."</p>";
+		} else {
+		// Treffer
+			switch ($btyp) {  // individuell je Typ
+			case $btyp_verkehr: // 1
+				tab_zeile('Zustand', $rowk["zustand"], htmlentities($rowk["beschreibung"], ENT_QUOTES, "UTF-8"), '', htmlentities($rowk["dokumentation"], ENT_QUOTES, "UTF-8"));
+			break;
+			case $btyp_gewaesser: // 2
+				tab_zeile('Zustand', $rowk["zustand"], htmlentities($rowk["beschreibung"], ENT_QUOTES, "UTF-8"), '', htmlentities($rowk["dokumentation"], ENT_QUOTES, "UTF-8"));
+			break;
+			case $btyp_sonst: // 3
+				tab_zeile('Funktion', $rowk["funktion"], htmlentities($rowk["beschr"], ENT_QUOTES, "UTF-8"), '', htmlentities($rowk["doku"], ENT_QUOTES, "UTF-8"));
+				tab_zeile('Hydrologisches Merkmal', $rowk["hydrologischesmerkmal"], htmlentities($rowk["hmbeschr"], ENT_QUOTES, "UTF-8"), '', htmlentities($rowk["hmdoku"], ENT_QUOTES, "UTF-8"));
+			break;
+			case $btyp_indu: // 4
+				tab_zeile('Zustand', $rowk["zustand"], htmlentities($rowk["beschreibung"], ENT_QUOTES, "UTF-8"), '', htmlentities($rowk["dokumentation"], ENT_QUOTES, "UTF-8"));
+			break;
+			case $btyp_sport: // 5
+				tab_zeile('Sportart', $rowk["sportart"], htmlentities($rowk["beschreibung"], ENT_QUOTES, "UTF-8"), '', htmlentities($rowk["dokumentation"], ENT_QUOTES, "UTF-8"));
+			break;
+			case $btyp_trans: // 7
+				tab_zeile('Lage zur Erdoberfl&auml;che', $rowk["lagezurerdoberflaeche"], htmlentities($rowk["beschreibung"], ENT_QUOTES, "UTF-8"), '', htmlentities($rowk["dokumentation"], ENT_QUOTES, "UTF-8"));
+			break;
+			case $btyp_turm: // 8
+				tab_zeile('Zustand', $rowk["zustand"], htmlentities($rowk["beschreibung"], ENT_QUOTES, "UTF-8"), '', htmlentities($rowk["dokumentation"], ENT_QUOTES, "UTF-8"));
+			break;
+			case $btyp_vorrat: // 9
+				tab_zeile('Lage zur Erdoberfl&auml;che', $rowk["lagezurerdoberflaeche"], htmlentities($rowk["beschreibung"], ENT_QUOTES, "UTF-8"), '', htmlentities($rowk["dokumentation"], ENT_QUOTES, "UTF-8"));
+				tab_zeile('Speicherinhalt', $rowk["speicherinhalt"], htmlentities($rowk["spbes"], ENT_QUOTES, "UTF-8"), '', htmlentities($rowk["spdok"], ENT_QUOTES, "UTF-8"));
+			break;
+			}
+		}
+		pg_free_result($resk);
+	}
+}
+
+// 3. sqlz: Individuelle Z u s a t z - Spalten je Bauwerks-Art
+// einfache Werte-Anzeige, ohne SchlÃŒsseltabelle
+if ($sqlz != '') {
+	$v=array($gmlid);
+	$resz=pg_prepare("", $sqlz);
+	$resz=pg_execute("", $v);
+	if (!$resz) {
+		echo "\n<p class='err'>Fehler bei Bauwerk Relation.</p>";
+		if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlz)."'</p>";}
+		if ($debug > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($resz)."</p>";}
+	} else {
+		if (!$rowz = pg_fetch_array($resz)) {
+			echo "\n<p class='err'>Fehler! Kein Treffer f&uuml;r gml_id=".$gmlid."</p>";
+		} else {
+			// Die Spalten im Row abarbeiten
+			$anzcol=pg_num_fields($resz);
+		//	if ($debug > 1) {echo "<p class='dbg'>".$anzcol." Zusatz-Spalten vorhanden"."</p>";}
+			for ($i = 0; $i < $anzcol; $i++) {
+				$k=pg_field_name($resz, $i);
+				$v=$rowz[$i];
+				if ($v != "" OR $allefelder) {
+					zusatz_spalte($k, $v);
+				}
+			}
+		}	
+		pg_free_result($resz);
+	}
+}
+
+// 4. sqlr: R e l a t i o n e n  zu anderen Objektarten
+if ($sqlr != '') {
+	$v=array($gmlid);
+	$resr=pg_prepare("", $sqlr);
+	$resr=pg_execute("", $v);
+	if (!$resr) {
+		echo "\n<p class='err'>Fehler bei Bauwerksdaten Zusatzfelder.</p>";
+		if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlr)."'</p>";}
+		if ($debug > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($resr)."</p>";}
+	} else {
+		if (!$rowr = pg_fetch_array($resr)) {
+			echo "\n<p class='err'>Fehler! Kein Treffer f&uuml;r gml_id=".$gmlid."</p>";
+		} else { // Die Spalten im Row abarbeiten
+			$anzcol=pg_num_fields($resr);
+		//	if ($debug > 1) {echo "<p class='dbg'>".$anzcol." Relationen-Spalten vorhanden"."</p>";}
+			for ($i = 0; $i < $anzcol; $i++) {
+				$k=pg_field_name($resr, $i);
+				$v=$rowr[$i]; // Array mit gml_id anderer Objekte
+				if ($v != "" OR $allefelder) {
+					objektverweis($k, $v);
+				}
+			}
+		}	
+		pg_free_result($resr);
+	}
+}
+
+echo "\n</table>\n";
+// +++ Test, ob ein zweiter Satz zum Bauwerk gefunden wird? Das sollte nicht sein.
+?>
+ 
+<div class='buttonbereich noprint'>
+	<hr>
+	<a title="zur&uuml;ck" href='javascript:history.back()'><img src="ico/zurueck.png" width="16" height="16" alt="zur&uuml;ck"></a>&nbsp;
+	<a title="Drucken" href='javascript:window.print()'><img src="ico/print.png" width="16" height="16" alt="Drucken"></a>
+</div>
+
+<?php footer($gmlid, selbstverlinkung()."?", "&amp;btyp=".$btyp); ?>
+
+</body>
+</html>
Index: trunk/info/info/alkisn/alkisfshist.php
===================================================================
--- trunk/info/info/alkisn/alkisfshist.php	(revision 419)
+++ trunk/info/info/alkisn/alkisfshist.php	(revision 422)
@@ -6,12 +6,8 @@
 	Version:
 	2016-02-24 Version fuer norGIS-ALKIS-Import
-	2016-11-29 HTML5, Gemeinsam genutzte Datenbanken ermÃ¶glichen (Filter Gemeinde)
-	2017-06-06 Validierung Eingabeparameter, Feinkorrekturen
-	2017-10-09 Sauber filtern auf NOT endet IS NULL
-	2017-10-17 Deutsches Datumsformat fÃŒr Zeitpunkt der Entstehung
-	2018-03-16 NULL-Werte in gemeinde und kreis in ax_historischesflurstueck berÃŒcksichtigen
-	2018-04-23 &nodebug
-	2018-11-19 Full-Schema: EntschlÃŒsseln "zeigtaufexternes_art" mit function fortfuehrungen(). Tab. "ax_historischesflurstueck" hat kein "vorgaengerflurstueckskennzeichen" mehr.
-	2018-12-18 function fskenn_dbformat
+	....
+	2020-02-20 Authentifizierung ausgelegert in Function darf_ich()
+	2020-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF']
+	2020-12-15 Input-Validation und Strict Comparisation (===)
 */
 
@@ -40,5 +36,5 @@
 		$arr = explode(",",$stri);
 		foreach($arr AS $val){
-			echo "Flurst&uuml;ck <a title=' zur Flurst&uuml;ck Historie' href='".$_SERVER['PHP_SELF']."?gkz=".$gkz."&amp;fskennz=".$val;
+			echo "Flurst&uuml;ck <a title=' zur Flurst&uuml;ck Historie' href='".selbstverlinkung()."?gkz=".$gkz."&amp;fskennz=".$val;
 			if ($showkey)   {echo "&amp;showkey=j";}
 			echo "'>".fzerleg($val)."</a><br>";
@@ -61,5 +57,5 @@
 		$zgmk++;
 	}
-	if ($zgmk == 0) {
+	if ($zgmk === 0) {
 		echo "\n<p class='err'>Gemarkung ".$gkey." ist unbekannt.</p>";
 		return;
@@ -83,5 +79,5 @@
 	if (!$resv) {
 		echo "\n<p class='err'>Fehler bei Vorg&auml;nger-FS.</p>";
-		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqlv."<br>$1='".$fsk."'</p>";}
+		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1", "'".$fsk."'", $sqlv)."</p>";}
 	}
 	$zv=0;
@@ -90,10 +86,10 @@
 		$gmlv=$rowv["gml_id"];
 		$vfsk=$rowv["flurstueckskennzeichen"];
-		echo "Flurst&uuml;ck <a title='Historie des Vorg&auml;ngerflurst&uuml;cks' href='".$_SERVER['PHP_SELF']."?gkz=".$gkz."&amp;fskennz=".$vfsk."&amp;gmlid=".$gmlv;
+		echo "Flurst&uuml;ck <a title='Historie des Vorg&auml;ngerflurst&uuml;cks' href='".selbstverlinkung()."?gkz=".$gkz."&amp;fskennz=".$vfsk."&amp;gmlid=".$gmlv;
 			if ($showkey) {echo "&amp;showkey=j";}
 		echo "'>".fzerleg($vfsk)."</a><br>";
 		$zv++;
 	}
-	if ($zv == 0) {
+	if ($zv === 0) {
 		echo "(keine)";
 	}
@@ -101,4 +97,5 @@
 }
 
+ini_set("session.cookie_httponly", 1);
 session_start();
 $showkey="n"; $nodebug=""; // Var. aus Parameter initalisieren
@@ -115,14 +112,19 @@
 	} 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}$#', $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 boolean umwandeln, ist praktischer abzufragen, wird 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";
+
 echo <<<END
 <!doctype html>
@@ -137,7 +139,10 @@
 <body>
 END;
+
+$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.
 // 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_alkisfshist.php'");
@@ -157,5 +162,5 @@
 } else { // Pfui!
 		$parmtyp="";
-		die("<p class='err'>Parameter 'gmlid' oder 'fskennz' fehlt.</p>"); // Weitermachen sinnlos
+		die("Fehlender Parameter"); // bereits geprÃŒft
 }
 
@@ -164,5 +169,5 @@
 	$felder="gml_id, flurnummer, cast(zaehler AS character varying), cast(nenner AS character varying), flurstueckskennzeichen, amtlicheflaeche, to_char(cast(zeitpunktderentstehung AS date),'DD.MM.YYYY') AS zeitpunktderentstehung, gemarkungsnummer, ";
 
-	if ($filtgem == '') { // Filter Gemeinde ?
+	if ($filtgem === '') { // Filter Gemeinde ?
 		$wheref='';
 		$whereh='';
@@ -224,5 +229,5 @@
 			echo "<br><p class='err'>Fehler! Kein Treffer f&uuml;r ".$parmtyp." = '".$parmval."'</p><br>";
 			if ($debug > 2) {
-				echo "<p class='dbg'>SQL=<br>".$sqlu."<br>$1=".$parmtyp." = '".$parmval."'</p>";
+				echo "<p class='dbg'>SQL=<br>".str_replace("$1", "'".$v[0]."'", $sqlu)."</p>";
 			}
 		}
@@ -231,5 +236,5 @@
 
 // Balken
-echo "<p class='fshis'>ALKIS Flurst&uuml;ck ".$gmkgnr."-".$flurnummer."-".$flstnummer."&nbsp;</p>";
+echo "<p class='balken fshis'>ALKIS Flurst&uuml;ck ".$gmkgnr."-".$flurnummer."-".$flstnummer."&nbsp;</p>";
 echo "\n<h2>Flurst&uuml;ck Historie</h2>";
 
@@ -249,5 +254,5 @@
 echo "\n\t</td>\n</tr>\n</table>";
 
-if ($ftyp == "a") { // Aktuell -> Historie
+if ($ftyp === "a") { // Aktuell -> Historie
 	echo "\n<p class='nwlink noprint'>weitere Auskunft: "
 		."<a href='alkisfsnw.php?gkz=".$gkz."&amp;gmlid=".$gmlid."&amp;eig=n";
@@ -308,5 +313,5 @@
 </div>
 
-<?php footer($gmlid, $_SERVER['PHP_SELF']."?", ""); ?>
+<?php footer($gmlid, selbstverlinkung()."?", ""); ?>
 
 </body>
Index: trunk/info/info/alkisn/alkishaus.php
===================================================================
--- trunk/info/info/alkisn/alkishaus.php	(revision 419)
+++ trunk/info/info/alkisn/alkishaus.php	(revision 422)
@@ -5,22 +5,13 @@
 	Version:
 	2016-02-24 Version fuer norGIS-ALKIS-Import
-	2016-11-29 HTML5, Gemeinsam genutzte Datenbanken ermÃ¶glichen
-	2016-12-05 Array-Behandlung ax_gebaeude.name
-	2017-06-08 Validierung Eingabeparameter, Feinkorrekturen
-	2017-06-09 Tool-Tip GebÃ€udefunktion, ErklÃ€rung 2 getrennte p.Styles
-	2017-10-09 Sauber filtern auf endet IS NULL
-	2018-04-23 &nodebug
-	2018-11-09 Umstellung Full-Schema
-
-	ToDo:
-	- Die im Modul 'Lage' als Tooltip vorhandene lange Beschreibung der GebÃ€ude-Funktion (Inhalt) hier auch anzeigen.
-	- sinnvolle Sortierung und Gruppierung der Felder
-	- geometrische Suche nach FS, auf denen das Haus steht
+	....
+	2020-12-01 Darstellung der Datenerhebung, Klammern um SchlÃŒsselwerte
+	2020-12-02 Verschnitt GebÃ€ude / FlurstÃŒcke
+	2020-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF']
+	2020-12-15 Input-Validation und Strict Comparisation (===)
+ToDo:
 	- Template im WMS auf Ebene GebÃ€ude hierhin verknÃŒpfen.
-	- Relationen abbilden:
-		ax_gebaeude >gehoertZu> ax_gebaeude  (ringfÃ¶rmige Verbindung GebÃ€udekomplex)
-		ax_gebaeude (umschliesst) ax_bauteil
-		ax_gebaeude >gehoert> ax_person (Ausnahme)
 */
+ini_set("session.cookie_httponly", 1);
 session_start();
 $allfld = "n"; $showkey="n"; $nodebug=""; // Var. aus Parameter initalisieren
@@ -28,15 +19,23 @@
 
 // strikte Validierung aller Parameter
-if (!isset($gmlid) or !preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
-if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
+if (isset($gmlid)) {
+	if (!preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
+} else {
+	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}$#', $showkey)) {die ("Eingabefehler showkey");}
-if ($showkey == "j") {$showkey=true;} else {$showkey=false;}
+if ($showkey === "j") {$showkey=true;} else {$showkey=false;}
 if (!preg_match('#^[j|n]{0,1}$#', $allfld)) {die ("Eingabefehler allfld");}
-if ($allfld == "j") {$allefelder=true;} else {$allefelder=false;}
+if ($allfld === "j") {$allefelder=true;} else {$allefelder=false;}
 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";
+
 echo <<<END
 <!doctype html>
@@ -52,7 +51,10 @@
 <body>
 END;
+
+$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.
 // 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_alkishaus.php'");
@@ -85,13 +87,9 @@
 
 // Balken
-echo "\n<p class='geb'>ALKIS Haus ".$gmlid."&nbsp;</p>"; // ++ Kennzeichen?
-echo "\n<h2><img src='ico/Haus.png' width='16' height='16' alt=''> Haus (Geb&auml;ude)</h2>";
-
-// Kennzeichen in Rahmen 
-// - Welches Kennzeichen zum Haus ?
-echo "\n<hr>";
-// Umschalter: auch leere Felder ausgeben?
-echo "<p class='nwlink noprint'>";
-echo "Umschalten: <a class='nwlink' href='".$_SERVER['PHP_SELF']."?gkz=".$gkz."&amp;gmlid=".$gmlid;
+echo "\n<p class='balken geb'>ALKIS Haus ".$gmlid."&nbsp;</p>";
+echo "\n<h2><img src='ico/Haus.png' width='16' height='16' alt=''> Haus (Geb&auml;ude)</h2>\n<hr>";
+
+echo "<p class='nwlink noprint'>"; // Umschalter: auch leere Felder
+echo "Umschalten: <a class='nwlink' href='".selbstverlinkung()."?gkz=".$gkz."&amp;gmlid=".$gmlid;
 	if ($showkey) {echo "&amp;showkey=j";} else {echo "&amp;showkey=n";}
 	if ($allefelder) {
@@ -102,346 +100,439 @@
 echo "</a></p>";
 
-$gebnr = 0;
-
-while($rowg = pg_fetch_assoc($resg)) { // Schleife, kann aber nur EIN Haus sein.
-	$gebnr++;
-	echo "\n<table class='geb'>"
-	."\n<tr>\n"
-		."\n\t<td class='head' title=''>Attribut</td>"
-		."\n\t<td class='head mittelspalte' title=''>Wert</td>"
-		."\n\t<td class='head' title=''>"
-			."\n\t\t<p class='erklk'>Erkl&auml;rung Kategorie</p>"
-			."\n\t\t<p class='erkli'>Erkl&auml;rung Inhalt</p>"
-		."\n\t</td>"
-	."\n</tr>";
-
-	$aog=$rowg["aog"];
-	$aug=$rowg["aug"];
-	$hoh=$rowg["hochhaus"];
-	$nam=trim(trim($rowg["name"], "{}"), '"'); // Gebaeude-Name ist ein Array in der DB: '{"A","B"}'
-	// Mehrfachbelegung nur theoretisch. Entklammern reicht. Mal mit und mal ohne "" drum !?
-	/* SELECT name FROM ax_gebaeude WHERE NOT name IS NULL AND array_length(name, 1) > 1; */
-	$kfunk=$rowg["gebaeudefunktion"];
-	$bfunk=$rowg["bfunk"];
-	$dfunk=$rowg["dfunk"];
-
-	$baw=$rowg["bauweise"];
-	$bbauw=$rowg["bbauw"];
-	$dbauw=$rowg["dbauw"];
-
-	$ofl=$rowg["lagezurerdoberflaeche"];
-	$oflv=$rowg["oflv"];
-	$ofld=$rowg["ofld"];
-
-	$dga=$rowg["dachgeschossausbau"]; // Key
-	$dgav=$rowg["dgaus"]; // Value
-
-	$zus=$rowg["zustand"]; // Key
-	$zusv=$rowg["zustandv"]; // Value
-	$zusd=$rowg["zustandd"]; // Description
-
-	$wgf=$rowg["wgf"]; // Array-> kommagetrennte Liste
-
-	$daf=$rowg["dachform"]; // Key
-	$dach=$rowg["bdach"]; // Value
-
-	$hho=$rowg["objekthoehe"];
-	$gfl=$rowg["geschossflaeche"];
-	$grf=$rowg["grundflaeche"];
-	$ura=$rowg["umbauterraum"];
-	$bja=$rowg["baujahr"];
-	$daa=$rowg["dachart"];
-//	$qag=$rowg["qualitaetsangaben"];
-
-	if (($nam != "") OR $allefelder) {
+if (!($rowg = pg_fetch_assoc($resg))) {
+	echo "\n<p class='err'><br>Kein Geb&auml;ude gefunden</p>";
+	die ("Abbruch");
+}
+
+echo "\n<table class='geb'>"
+."\n<tr>\n"
+	."\n\t<td class='head' title=''>Attribut</td>"
+	."\n\t<td class='head mittelspalte' title=''>Wert</td>"
+	."\n\t<td class='head' title=''>"
+		."\n\t\t<p class='erklk'>Erkl&auml;rung Kategorie</p>"
+		."\n\t\t<p class='erkli'>Erkl&auml;rung Inhalt</p>"
+	."\n\t</td>"
+."\n</tr>";
+
+$aog=$rowg["aog"];
+$aug=$rowg["aug"];
+$hoh=$rowg["hochhaus"];
+$nam=trim(trim($rowg["name"], "{}"), '"'); // Gebaeude-Name ist ein Array.
+// Mehrfachbelegung theoretisch. Entklammern reicht. Mal mit und mal ohne "" drum.
+$kfunk=$rowg["gebaeudefunktion"];
+$bfunk=$rowg["bfunk"];
+$dfunk=$rowg["dfunk"];
+
+$baw=$rowg["bauweise"];
+$bbauw=$rowg["bbauw"];
+$dbauw=$rowg["dbauw"];
+
+$ofl=$rowg["lagezurerdoberflaeche"];
+$oflv=$rowg["oflv"];
+$ofld=$rowg["ofld"];
+
+$dga=$rowg["dachgeschossausbau"]; // Key
+$dgav=$rowg["dgaus"];		// Value
+
+$zus=$rowg["zustand"];		// Key
+$zusv=$rowg["zustandv"];	// Value
+$zusd=$rowg["zustandd"];	// Description
+
+$wgf=$rowg["wgf"];			// Array-> kommagetr. Liste
+
+$daf=$rowg["dachform"];		// Key
+$dach=$rowg["bdach"];		// Value
+
+$hho=$rowg["objekthoehe"];
+$gfl=$rowg["geschossflaeche"];
+$grf=$rowg["grundflaeche"];
+$ura=$rowg["umbauterraum"];
+$bja=$rowg["baujahr"];
+$daa=$rowg["dachart"];
+
+if (($nam != "") OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Name</td>"
+		."\n\t<td>".$nam."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'Name' ist der Eigenname oder die Bezeichnung des Geb&auml;udes."
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// 0 bis N   L a g e bezeichnungen mit Haus- oder Pseudo-Nummer
+
+// HAUPTgebÃ€ude
+$sqll ="SELECT 'm' AS ltyp, lh.gml_id AS gmllag, sh.lage, sh.bezeichnung, lh.hausnummer, '' AS laufendenummer FROM ax_gebaeude gh
+JOIN ax_lagebezeichnungmithausnummer lh ON lh.gml_id=ANY(gh.zeigtauf)
+JOIN ax_lagebezeichnungkatalogeintrag sh ON lh.kreis=sh.kreis AND lh.gemeinde=sh.gemeinde AND lh.lage=sh.lage
+WHERE gh.gml_id= $1 AND gh.endet IS NULL AND lh.endet IS NULL AND sh.endet IS NULL";
+// oder NEBENgebÃ€ude
+$sqll.=" UNION 
+SELECT 'p' AS ltyp, ln.gml_id AS gmllag, sn.lage, sn.bezeichnung, ln.pseudonummer AS hausnummer, ln.laufendenummer
+FROM ax_gebaeude gn
+JOIN ax_lagebezeichnungmitpseudonummer ln ON ln.gml_id=gn.hat
+JOIN ax_lagebezeichnungkatalogeintrag sn ON ln.kreis=sn.kreis AND ln.gemeinde=sn.gemeinde AND ln.lage=sn.lage
+WHERE gn.gml_id= $1 AND gn.endet IS NULL AND ln.endet IS NULL AND sn.endet IS NULL ";
+
+$sqll.="ORDER BY bezeichnung, hausnummer ;";
+
+$v = array($gmlid);
+$resl = pg_prepare("", $sqll);
+$resl = pg_execute("", $v);
+if (!$resl) {
+	echo "\n<p class='err'>Fehler bei Lage mit HsNr.</p>";
+	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqll."<br>$1 = gml_id = '".$gmlid."'</p>";}
+}
+$zhsnr=0;
+while($rowl = pg_fetch_assoc($resl)) { // LOOP: Lagezeilen
+	$zhsnr++;
+	$ltyp=$rowl["ltyp"]; // Lagezeilen-Typ
+	$skey=$rowl["lage"]; // Str.-Schluessel
+	$snam=htmlentities($rowl["bezeichnung"], ENT_QUOTES, "UTF-8"); // -Name
+	$hsnr=$rowl["hausnummer"];
+	$hlfd=$rowl["laufendenummer"];
+	$gmllag=$rowl["gmllag"];
+
+	if ($zhsnr === 1) {
 		echo "\n<tr>"
-			."\n\t<td class='li'>Name</td>"
-			."\n\t<td>".$nam."</td>"
+			."\n\t<td class='li' title='Lage mit Hausnummer oder Pseudonummer'>Adresse</td>"
+			."\n\t<td class='fett'>";
+	}
+	echo "\n\t\t<img src='ico/Lage_mit_Haus.png' width='16' height='16' alt=''>&nbsp;";
+	if ($showkey) {echo "<span class='key'>(".$skey.")</span>&nbsp;";}			
+	echo "\n\t\t<a title='Hausnummer' href='alkislage.php?gkz=".$gkz."&amp;gmlid=".$gmllag."&amp;ltyp=".$ltyp;
+		if ($showkey) {echo "&amp;showkey=j";}
+		echo "'>".$snam."&nbsp;".$hsnr;
+		if ($ltyp === "p") {echo ", lfd.Nr ".$hlfd;}
+	echo "</a><br>";
+} // Ende Loop Lagezeilen m.H.
+if ($zhsnr > 0) {echo "\n\t</td>\n\t<td>&nbsp;</td>\n</tr>";}
+pg_free_result($resl);
+
+// GebÃ€udefunktion
+echo "\n<tr>"
+	."\n\t<td class='li'>Geb&auml;udefunktion</td>"
+	."\n\t<td class='fett'>";
+	if ($showkey and $kfunk != '') {echo "<span class='key'>(".$kfunk.")</span>&nbsp;";}
+	echo $bfunk."</td>"
+	."\n\t<td>"
+		."\n\t\t<p class='erklk'>'Geb&auml;udefunktion' ist die zum Zeitpunkt der Erhebung vorherrschend funktionale Bedeutung des Geb&auml;udes'</p>"
+		."\n\t\t<p class='erkli'>".$dfunk."</p>"
+	."</td>"
+."\n</tr>";
+
+// Bauweise
+if ($baw != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Bauweise</td>"
+		."\n\t<td class='fett'>";
+		if ($showkey and $baw != '') {echo "<span class='key'>(".$baw.")</span>&nbsp;";}
+		echo $bbauw."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'Bauweise' ist die Beschreibung der Art der Bauweise.</p>"
+			."\n\t\t<p class='erkli'>".$dbauw."</p>"
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// Geschosse
+if ($aog != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Geschosse</td>"
+		."\n\t<td class='fett'>".$aog."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>Anzahl oberirdischer Geschosse.</p>"
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// U-Geschosse
+if ($aug != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>U-Geschosse</td>"
+		. "\n\t<td class='fett'>".$aug."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>Anzahl unterirdischer Geschosse.</p>"
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// Hochhaus
+if ($hoh != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Hochhaus</td>"
+		."\n\t<td class='fett'>".$hoh."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'Hochhaus' ist ein Geb&auml;ude, das nach Geb&auml;udeh&ouml;he und Auspr&auml;gung als Hochhaus zu bezeichnen ist. F&uuml;r Geb&auml;ude im Geschossbau gilt dieses i.d.R. ab 8 oberirdischen Geschossen, f&uuml;r andere Geb&auml;ude ab einer Geb&auml;udeh&ouml;he von 22 m."
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// Lage zur ErdoberflÃ€che
+if ($ofl != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Lage zur Erdoberfl&auml;che</td>"
+		."\n\t<td class='fett'>";
+		if ($showkey and $ofl != '') {echo "<span class='key'>(".$ofl.")</span>&nbsp;";}
+		echo $oflv."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'Lage zur Erdoberfl&auml;che' ist die Angabe der relativen Lage des Geb&auml;udes zur Erdoberfl&auml;che. Diese Attributart wird nur bei nicht ebenerdigen Geb&auml;uden gef&uuml;hrt.<br>"
+			."\n\t\t<p class='erkli'>".$ofld."</p>"
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// Dachgeschossausbau, Spalte dokumentation ist immer leer
+if ($dga != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Dachgeschossausbau</td>"
+		."\n\t<td class='fett'>";
+		if ($showkey and $dga != '') {echo "<span class='key'>(".$dga.")</span>&nbsp;";}
+		echo $dgav."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'Dachgeschossausbau' ist ein Hinweis auf den Ausbau bzw. die Ausbauf&auml;higkeit des Dachgeschosses."
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// Zustand
+if ($zus != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Zustand</td>"
+		."\n\t<td class='fett'>";
+		if ($showkey and $zus != '') {echo "<span class='key'>(".$zus.")</span>&nbsp;";}
+		echo $zusv."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'Zustand' beschreibt die Beschaffenheit oder die Betriebsbereitschaft von 'Geb&auml;ude'. Diese Attributart wird nur dann optional gef&uuml;hrt, wenn der Zustand des Geb&auml;udes vom nutzungsf&auml;higen Zustand abweicht.</p>"
+			."\n\t\t<p class='erkli'>".$zusd."</p>"
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// Weitere GebÃ€udefunktionen
+// Suche Testfall: SELECT gml_id, gebaeudefunktion, weiteregebaeudefunktion FROM ax_gebaeude WHERE (NOT weiteregebaeudefunktion IS NULL) AND cardinality(weiteregebaeudefunktion) > 1 liMIT 10;
+if ($wgf != "" OR $allefelder) { // ... ist ein Array
+	echo "\n<tr>"
+		."\n\t<td class='li'>Weitere Geb&auml;udefunktionen</td>"
+		."\n\t<td>";
+		if ($wgf != "") { // Kommagetrennte Liste aus Array
+			$sqlw="SELECT wert, beschreibung, dokumentation FROM ax_gebaeudefunktion WHERE wert IN ( $1 ) ORDER BY wert;";
+			$v = array($wgf);
+			$resw = pg_prepare("", $sqlw);
+			$resw = pg_execute("", $v);
+			if (!$resw) {
+				echo "\n<p class='err'>Fehler bei Geb&auml;ude - weitere Funktion.</p>";
+				if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqlw."<br>$1 = Werteliste = '".$wgf."'</p>";}
+			}
+			$zw=0;
+			while($roww = pg_fetch_assoc($resw)) { // LOOP Funktion
+				if ($zw > 0) {echo "<br>";}
+				if ($showkey and $roww["wert"] != '') {echo "<span class='key'>(".$roww["wert"].")</span>&nbsp;";}
+				echo "<span title='".$roww["dokumentation"]."'>".$roww["beschreibung"]."</span>";
+				$zw++;
+		   }
+		   pg_free_result($resw);
+		}
+		echo "</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'Weitere Geb&auml;udefunktion' ist die Funktion, die ein Geb&auml;ude neben der dominierenden Geb&auml;udefunktion hat."
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// Dachform, Spalte dokumentation ist immer leer
+if ($daf != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Dachform</td>"
+		."\n\t<td class='fett'>";
+		if ($showkey and $daf != '') {echo "<span class='key'>(".$daf.")</span>&nbsp;";}
+		echo $dach."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'Dachform' beschreibt die charakteristische Form des Daches."
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// ObjekthÃ¶he
+if ($hho != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Objekth&ouml;he</td>"
+		."\n\t<td class='fett'>".$hho."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'Objekth&ouml;he' ist die H&ouml;hendifferenz in [m] zwischen dem h&ouml;chsten Punkt der Dachkonstruktion und der festgelegten Gel&auml;ndeoberfl&auml;che des Geb&auml;udes."
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// GeschossflÃ€che
+if ($gfl != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Geschossfl&auml;che</td>"
+		."\n\t<td class='fett'>";
+		if ($gfl != "") {echo $gfl." m&#178;";}
+		echo "</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'Geschossfl&auml;che' ist die Geb&auml;udegeschossfl&auml;che in [qm]."
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// GrundflÃ€che
+if ($grf != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Grundfl&auml;che</td>"
+		."\n\t<td class='fett'>";
+		if ($grf != "") {echo $grf." m&#178;";}
+		echo "\n\t<td>"
+			."\n\t\t<p class='erklk'>'Grundfl&auml;che' ist die Geb&auml;udegrundfl&auml;che in [qm]."
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// Umbauter Raum
+if ($ura != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Umbauter Raum</td>"
+		."\n\t<td class='fett'>".$ura."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'Umbauter Raum' ist der umbaute Raum [Kubikmeter] des Geb&auml;udes."
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// Baujahr
+if ($bja != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Baujahr</td>"
+		."\n\t<td class='fett'>".$bja."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'Baujahr' ist das Jahr der Fertigstellung oder der baulichen Ver&auml;nderung des Geb&auml;udes."
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// Dachart
+if ($daa != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Dachart</td>"
+		."\n\t<td class='fett'>".$daa."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'Dachart' gibt die Art der Dacheindeckung (z.B. Reetdach) an."
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// D a t e n e r h e b u n g  (QualitÃ€t der Einmessung)
+$sqle ="SELECT g.gml_id, e.wert, e.beschreibung, e.dokumentation FROM ax_gebaeude g 
+LEFT JOIN ax_datenerhebung e ON cast(e.wert AS varchar) = any(g.herkunft_source_source_ax_datenerhebung) 
+WHERE g.gml_id= $1 AND g.endet IS NULL;";
+$v = array($gmlid);
+$rese = pg_prepare("", $sqle);
+$rese = pg_execute("", $v);
+if (!$rese) {
+	echo "\n<p class='err'>Fehler bei Datenerhebung.<br>".pg_last_error()."</p>";
+	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqle."<br>$1 = gml_id = '".$gmlid."'</p>";}
+}
+while($rowe = pg_fetch_assoc($rese)) { // Schleife weil array-Feld, meist aber leer
+	$erheb =$rowe["wert"];
+	$berheb=$rowe["beschreibung"];
+	$derheb=$rowe["dokumentation"]; // immer leer, oder
+	if ($derheb == '' AND $erheb != '') { // Wert ohne Doku
+		if ( $erheb >= 2000) { // selbst was dazu sagen
+			$derheb = 'nicht eingemessenes Geb&auml;ude'; // so hieÃ das in der ALK
+		}
+	}
+	if ($erheb != "" OR $allefelder) {
+		echo "\n<tr>"
+			."\n\t<td class='li'>Datenerhebung</td>"
+			."\n\t<td class='fett'>";
+			if ($showkey) {echo "<span class='key'>(".$erheb.")</span>&nbsp;";}
+			echo $berheb."</td>"
 			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'Name' ist der Eigenname oder die Bezeichnung des Geb&auml;udes."
-			."\n\t</td>"
+				."\n\t\t<p class='erklk'>'Datenerhebung' beschreibt Qualit&auml;tsangaben, Herkunft.</p>"
+				."\n\t\t<p class='erkli'>".$derheb."</p>"
+			."</td>"
 		."\n</tr>";
 	}
-
-	// 0 bis N   L a g e bezeichnungen mit Haus- oder Pseudo-Nummer
-
-	// HAUPTgebÃ€ude
-	$sqll ="SELECT 'm' AS ltyp, lh.gml_id AS gmllag, sh.lage, sh.bezeichnung, lh.hausnummer, '' AS laufendenummer FROM ax_gebaeude gh
-	JOIN ax_lagebezeichnungmithausnummer lh ON lh.gml_id=ANY(gh.zeigtauf)
-	JOIN ax_lagebezeichnungkatalogeintrag sh ON lh.kreis=sh.kreis AND lh.gemeinde=sh.gemeinde AND lh.lage=sh.lage
-	WHERE gh.gml_id= $1 AND gh.endet IS NULL AND lh.endet IS NULL AND sh.endet IS NULL";
-	// oder NEBENgebÃ€ude
-	$sqll.=" UNION 
-	SELECT 'p' AS ltyp, ln.gml_id AS gmllag, sn.lage, sn.bezeichnung, ln.pseudonummer AS hausnummer, ln.laufendenummer
-	FROM ax_gebaeude gn
-	JOIN ax_lagebezeichnungmitpseudonummer ln ON ln.gml_id=gn.hat
-	JOIN ax_lagebezeichnungkatalogeintrag sn ON ln.kreis=sn.kreis AND ln.gemeinde=sn.gemeinde AND ln.lage=sn.lage
-	WHERE gn.gml_id= $1 AND gn.endet IS NULL AND ln.endet IS NULL AND sn.endet IS NULL ";
-
-	$sqll.="ORDER BY bezeichnung, hausnummer ;";
-
-	$v = array($gmlid);
-	$resl = pg_prepare("", $sqll);
-	$resl = pg_execute("", $v);
-	if (!$resl) {
-		echo "\n<p class='err'>Fehler bei Lage mit HsNr.</p>";
-		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqll."<br>$1 = gml_id = '".$gmlid."'</p>";}
+}
+echo "\n</table>";
+pg_free_result($rese);
+
+$gfla=$rowg["gebflae"]; // bei Flurstck. gebraucht
+pg_free_result($resg);
+
+echo "\n\n<h3><img src='ico/Flurstueck.png' width='16' height='16' alt=''> Flurst&uuml;cke</h3>"
+."\n<p>.. auf dem das Geb&auml;ude steht. Ermittelt durch Verschneidung der Geometrie.</p>";
+
+// F l u r s t ÃŒ c k
+$sqlf ="SELECT f.gml_id, round(st_area(ST_Intersection(g.wkb_geometry,f.wkb_geometry))::numeric,2) AS schnittflae, 
+st_within(g.wkb_geometry,f.wkb_geometry) as drin, o.gemarkungsnummer, o.bezeichnung, f.flurnummer, f.zaehler, f.nenner 
+FROM ax_gebaeude g, ax_flurstueck f LEFT JOIN ax_gemarkung o ON f.land=o.land AND f.gemarkungsnummer=o.gemarkungsnummer
+WHERE g.gml_id= $1 AND f.endet IS NULL and g.endet IS NULL 
+AND st_intersects(g.wkb_geometry,f.wkb_geometry) = true ORDER BY schnittflae DESC;";
+
+$v=array($gmlid);
+$resf=pg_prepare("", $sqlf);
+$resf=pg_execute("", $v);
+if (!$resf) {
+	echo "\n<p class='err'>Fehler bei FS-Verschneidung.</p>";
+	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".$sqlf."<br>$1 = gml_id = '".$gmlid."'</p>";}
+}
+
+echo "\n<hr>\n<table class='geb'>"
+."\n<tr>"
+	."\n\t<td class='heads fla' title='Schnittfl&auml;che zwischen Flurst&uuml;ck und Geb&auml;ude'><img src='ico/sortd.png' width='10' height='10' alt='' title='Sortierung (absteigend)'>Fl&auml;che</td>"
+	."\n\t<td class='head' title='Verh&auml;ltnis Geb&auml;udefl&auml;che zur FlurstÃŒcksfl&auml;che'>Verh&auml;ltnis</td>"
+	."\n\t<td class='head' title='Flurst&uuml;ckskennzeichen Ortsteil'>Gemarkung</td>"
+	."\n\t<td class='head' title='Flurst&uuml;ckskennzeichen Flur-Nummer'>Flur</td>"
+	."\n\t<td class='heads fsnr' title='Flurst&uuml;ckskennzeichen Flurst&uuml;cks-Nummer'>Flurst&uuml;ck</td>"
+	."\n\t<td class='head nwlink' title='Flurst&uuml;cks-Nachweis'>weitere Auskunft</td>"
+."\n</tr>";
+
+while($rowf = pg_fetch_assoc($resf)) {
+	$fgml=$rowf["gml_id"];
+	$drin=$rowf["drin"];
+	$schni=$rowf["schnittflae"];
+	$flur= $rowf["flurnummer"];
+	$fskenn=$rowf["zaehler"];
+	if ($rowf["nenner"] != "") { $fskenn.="/".$rowf["nenner"];}
+
+	// 3 FÃ€lle:
+	if ($drin === "t") { // GebÃ€ude liegt komplett in FlurstÃŒck
+		$gstyle="gin"; // siehe .css	
+		$f1=number_format($schni,2,",",".") . " m&#178;";
+		$f2="vollst&auml;ndig";
+	} else {
+		if ($schni === "0.00") { // GebÃ€ude angrenzend (Grenzbebauung)
+			$gstyle="gan";
+			$f1="&nbsp;";
+			$f2="angrenzend";
+		} else { // Teile des GebÃ€udes stehen auf dem FlurstÃŒck
+			$gstyle="gtl";
+			$f1=number_format($schni,2,",",".") . " m&#178;";
+			$f2="teilweise";
+		}
 	}
-	$zhsnr=0;
-	while($rowl = pg_fetch_assoc($resl)) { // LOOP: Lagezeilen
-		$zhsnr++;
-		$ltyp=$rowl["ltyp"]; // Lagezeilen-Typ
-		$skey=$rowl["lage"]; // Str.-Schluessel
-		$snam=htmlentities($rowl["bezeichnung"], ENT_QUOTES, "UTF-8"); // -Name
-		$hsnr=$rowl["hausnummer"];
-		$hlfd=$rowl["laufendenummer"];
-		$gmllag=$rowl["gmllag"];
-
-		if ($zhsnr == 1) {
-			echo "\n<tr>"
-				."\n\t<td class='li' title='Lage mit Hausnummer oder Pseudonummer'>Adresse</td>"
-				."\n\t<td class='fett'>";
-		}
-		echo "\n\t\t<img src='ico/Lage_mit_Haus.png' width='16' height='16' alt=''>&nbsp;";
-		if ($showkey) {echo "<span class='key'>(".$skey.")</span>&nbsp;";}			
-		echo "\n\t\t<a title='Hausnummer' href='alkislage.php?gkz=".$gkz."&amp;gmlid=".$gmllag."&amp;ltyp=".$ltyp;
-			if ($showkey) {echo "&amp;showkey=j";}
-			echo "'>".$snam."&nbsp;".$hsnr;
-			if ($ltyp == "p") {echo ", lfd.Nr ".$hlfd;}
-		echo "</a><br>";
-	} // Ende Loop Lagezeilen m.H.
-	if ($zhsnr > 0) {echo "\n\t</td>\n\t<td>&nbsp;</td>\n</tr>";}
-
-// In der 3. Spalte:
-// p.erklk = ErklÃ€rungen zur Kategorie
-// p.erkli = .. zum Inhalt
-
-	// GebÃ€udefunktion
-	echo "\n<tr>"
-		."\n\t<td class='li'>Geb&auml;udefunktion</td>"
-		."\n\t<td class='fett'>";
-		if ($showkey) {echo "<span class='key'>".$kfunk."</span>&nbsp;";}
-		echo $bfunk."</td>"
-		."\n\t<td>"
-			."\n\t\t<p class='erklk'>'Geb&auml;udefunktion' ist die zum Zeitpunkt der Erhebung vorherrschend funktionale Bedeutung des Geb&auml;udes'</p>"
-			."\n\t\t<p class='erkli'>".$dfunk."</p>"
-		."</td>"
-	."\n</tr>";
-
-	// Bauweise
-	if ($baw != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Bauweise</td>"
-			."\n\t<td class='fett'>";
-			if ($showkey) {echo "<span class='key'>".$baw."</span>&nbsp;";}
-			echo $bbauw."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'Bauweise' ist die Beschreibung der Art der Bauweise.</p>"
-				."\n\t\t<p class='erkli'>".$dbauw."</p>"
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// Geschosse
-	if ($aog != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Geschosse</td>"
-			."\n\t<td class='fett'>".$aog."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>Anzahl oberirdischer Geschosse.</p>"
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// U-Geschosse
-	if ($aug != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>U-Geschosse</td>"
-			. "\n\t<td class='fett'>".$aug."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>Anzahl unterirdischer Geschosse.</p>"
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// Hochhaus
-	if ($hoh != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Hochhaus</td>"
-			."\n\t<td class='fett'>".$hoh."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'Hochhaus' ist ein Geb&auml;ude, das nach Geb&auml;udeh&ouml;he und Auspr&auml;gung als Hochhaus zu bezeichnen ist. F&uuml;r Geb&auml;ude im Geschossbau gilt dieses i.d.R. ab 8 oberirdischen Geschossen, f&uuml;r andere Geb&auml;ude ab einer Geb&auml;udeh&ouml;he von 22 m."
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// Lage zur ErdoberflÃ€che
-	if ($ofl != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Lage zur Erdoberfl&auml;che</td>"
-			."\n\t<td class='fett'>";
-			if ($showkey) {echo "<span class='key'>".$ofl."</span>&nbsp;";}
-			echo $oflv."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'Lage zur Erdoberfl&auml;che' ist die Angabe der relativen Lage des Geb&auml;udes zur Erdoberfl&auml;che. Diese Attributart wird nur bei nicht ebenerdigen Geb&auml;uden gef&uuml;hrt.<br>"
-				."\n\t\t<p class='erkli'>".$ofld."</p>"
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// Dachgeschossausbau, Spalte dokumentation ist immer leer
-	if ($dga != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Dachgeschossausbau</td>"
-			."\n\t<td class='fett'>";
-			if ($showkey) {echo "<span class='key'>".$dga."</span>&nbsp;";}
-			echo $dgav."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'Dachgeschossausbau' ist ein Hinweis auf den Ausbau bzw. die Ausbauf&auml;higkeit des Dachgeschosses."
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// Zustand
-	if ($zus != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Zustand</td>"
-			."\n\t<td class='fett'>";
-			if ($showkey) {echo "<span class='key'>".$zus."</span>&nbsp;";}
-			echo $zusv."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'Zustand' beschreibt die Beschaffenheit oder die Betriebsbereitschaft von 'Geb&auml;ude'. Diese Attributart wird nur dann optional gef&uuml;hrt, wenn der Zustand des Geb&auml;udes vom nutzungsf&auml;higen Zustand abweicht.</p>"
-				."\n\t\t<p class='erkli'>".$zusd."</p>"
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// Weitere GebÃ€udefunktionen
-	// Suche Testfall: SELECT gml_id, gebaeudefunktion, weiteregebaeudefunktion FROM ax_gebaeude WHERE (NOT weiteregebaeudefunktion IS NULL) AND cardinality(weiteregebaeudefunktion) > 1 liMIT 10;
-	if ($wgf != "" OR $allefelder) { // ... ist ein Array
-		echo "\n<tr>"
-			."\n\t<td class='li'>Weitere Geb&auml;udefunktionen</td>"
-			."\n\t<td>";
-			if ($wgf != "") { // Kommagetrennte Liste aus Array
-				$sqlw="SELECT wert, beschreibung, dokumentation FROM ax_gebaeudefunktion WHERE wert IN ( $1 ) ORDER BY wert;";
-				$v = array($wgf);
-				$resw = pg_prepare("", $sqlw);
-				$resw = pg_execute("", $v);
-				if (!$resw) {
-					echo "\n<p class='err'>Fehler bei Geb&auml;ude - weitere Funktion.</p>";
-					if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqlw."<br>$1 = Werteliste = '".$wgf."'</p>";}
-				}
-				$zw=0;
-				while($roww = pg_fetch_assoc($resw)) { // LOOP Funktion
-					if ($zw > 0) {echo "<br>";}
-					if ($showkey) {echo "<span class='key'>".$roww["wert"]."</span>&nbsp;";}
-					echo "<span title='".$roww["dokumentation"]."'>".$roww["beschreibung"]."</span>";
-					$zw++;
-			   }
-			}
-			echo "</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'Weitere Geb&auml;udefunktion' ist die Funktion, die ein Geb&auml;ude neben der dominierenden Geb&auml;udefunktion hat."
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// Dachform, Spalte dokumentation ist immer leer
-	if ($daf != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Dachform</td>"
-			."\n\t<td class='fett'>";
-			if ($showkey) {echo "<span class='key'>".$daf."</span>&nbsp;";}
-			echo $dach."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'Dachform' beschreibt die charakteristische Form des Daches."
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// ObjekthÃ¶he
-	if ($hho != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Objekth&ouml;he</td>"
-			."\n\t<td class='fett'>".$hho."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'Objekth&ouml;he' ist die H&ouml;hendifferenz in [m] zwischen dem h&ouml;chsten Punkt der Dachkonstruktion und der festgelegten Gel&auml;ndeoberfl&auml;che des Geb&auml;udes."
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// GeschossflÃ€che
-	if ($gfl != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Geschossfl&auml;che</td>"
-			."\n\t<td class='fett'>";
-			if ($gfl != "") {echo $gfl." m&#178;";}
-			echo "</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'Geschossfl&auml;che' ist die Geb&auml;udegeschossfl&auml;che in [qm]."
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// GrundflÃ€che
-	if ($grf != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Grundfl&auml;che</td>"
-			."\n\t<td class='fett'>";
-			if ($grf != "") {echo $grf." m&#178;";}
-			echo "\n\t<td>"
-				."\n\t\t<p class='erklk'>'Grundfl&auml;che' ist die Geb&auml;udegrundfl&auml;che in [qm]."
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// Umbauter Raum
-	if ($ura != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Umbauter Raum</td>"
-			."\n\t<td class='fett'>".$ura."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'Umbauter Raum' ist der umbaute Raum [Kubikmeter] des Geb&auml;udes."
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// Baujahr
-	if ($bja != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Baujahr</td>"
-			."\n\t<td class='fett'>".$bja."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'Baujahr' ist das Jahr der Fertigstellung oder der baulichen Ver&auml;nderung des Geb&auml;udes."
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// Dachart
-	if ($daa != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Dachart</td>"
-			."\n\t<td class='fett'>".$daa."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'Dachart' gibt die Art der Dacheindeckung (z.B. Reetdach) an."
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// QualitÃ€tsangaben
-/*	if ($qag != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Qualit&auml;tsangaben</td>"
-			."\n\t<td class='fett'>".$qag."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>Angaben zur Herkunft der Informationen (Erhebungsstelle). Die Information ist konform zu den Vorgaben aus ISO 19115 zu repr&auml;sentieren."
-			."\n\t</td>"
-		."\n</tr>";
-	} */
-	echo "\n</table>";
-}
-if ($gebnr == 0) {echo "\n<p class='err'><br>Kein Geb&auml;ude gefunden<br>&nbsp;</p>";}
-
-// ++ ToDo:  -Verschnitt mit FS?  -Ausgeben ax_georeferenziertegebaeudeadresse dazz, wenn gefÃŒllt.
+	echo "\n<tr>"
+		."\n\t<td class='fla'>".$f1."</td>"
+		."\n\t<td class='".$gstyle."'>".$f2."</td>";
+	echo "\n\t<td>";
+	if ($showkey) {echo "<span class='key'>(".$rowf["gemarkungsnummer"].")</span> ";}
+	echo $rowf["bezeichnung"]."</td>"
+	."\n\t<td>".$flur."</td>"
+	."\n\t<td class='fsnr'><span class='wichtig'>".$fskenn."</span></td>";
+
+	echo "\n\t<td class='nwlink noprint'>" // Link FS
+		."\n\t\t<a title='Flurst&uuml;ck' href='alkisfsnw.php?gkz=".$gkz."&amp;gmlid=".$fgml;
+		if ($showkey) {echo "&amp;showkey=j";}
+		echo "'>Flurst&uuml;ck&nbsp;<img src='ico/Flurstueck_Link.png' width='16' height='16' alt=''></a>"
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+$gfla=number_format($gfla,2,",",".") . " m&#178;";
+echo "\n<tr>\n\t<td class='fla sum'>".$gfla."</td>\n\t<td>Geb&auml;udefl&auml;che</td>\n\t<td></td>\n</tr>";
+echo "\n</table>"; // Ende FlurstÃŒcke
 ?>
 
@@ -452,5 +543,5 @@
 </div>
 
-<?php footer($gmlid, $_SERVER['PHP_SELF']."?", ""); ?>
+<?php footer($gmlid, selbstverlinkung()."?", ""); ?>
 
 </body>
Index: trunk/info/info/alkisn/alkisinlayausk.php
===================================================================
--- trunk/info/info/alkisn/alkisinlayausk.php	(revision 419)
+++ trunk/info/info/alkisn/alkisinlayausk.php	(revision 422)
@@ -11,25 +11,31 @@
 	Version:
 	2016-02-24 Version fuer norGIS-ALKIS-Import
-	2016-11-29 HTML5, Gemeinsam genutzte Datenbanken ermÃ¶glichen (Berechtigung fÃŒr Gemeinde prÃŒfen)
-	2017-06-01 Function "eigentuemer" ohne Parameter $con
-	2017-06-08 Validierung Eingabeparameter, Feinkorrekturen
-	2017-10-09 Sauber filtern auf endet IS NULL
-	2017-12-20 Fehlerkorrektur: Link StraÃe ohne gml_id, Bessere Title fÃŒr Links, Icon an Lage.
-	2018-04-23 FÃŒr GB-Teil Function benutzen
-	2018-04-24 Feinschliff
-	2018-05-03 neuer GrundstÃŒcksnachweis
-	2018-11-09 Umstellung Full-Schema
+	....
+	2020-02-03 Fenster-Weite
+	2020-02-20 Authentifizierung ausgelagert in Function darf_ich()
+	2020-10-14 include ohne Klammer
+	2020-12-15 Input-Validation und Strict Comparisation (===)
+	2021-03-09 Link zum GebÃ€udenachweis auch mit "Bauwerke" betiteln
 */
+ini_set("session.cookie_httponly", 1);
 session_start();
 $cntget = extract($_GET); // Parameter in Variable umwandeln
 
 // strikte Validierung aller Parameter
-if (!isset($gmlid) or !preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
-if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
-
-require_once("alkis_conf_location.php");
-if ($auth == "mapbender") {require_once($mapbender);}
-include("alkisfkt.php");
-
+if (isset($gmlid)) {
+	if (!preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
+} else {
+	die("Fehlender Parameter");
+}
+if (isset($gkz)) {
+	if (!preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
+} else {
+	die("Fehlender Parameter");
+}
+
+include "alkis_conf_location.php";
+include "alkisfkt.php";
+
+// Wert fÃŒr "width=" aus der Function "imFenster" synchron halten mit "@media screen body width" aus "alkisauszug.css"
 echo <<<END
 <!doctype html>
@@ -41,5 +47,5 @@
 	<link rel="shortcut icon" type="image/x-icon" href="ico/Flurstueck.ico">
 	<title>ALKIS-Auskunft</title>
-	<script>
+	<script type="text/javascript" language="JavaScript">
 		function imFenster(dieURL) {
 			var link = encodeURI(dieURL);
@@ -48,6 +54,10 @@
 	</script>
 </head>
-<body>
+<body class ="mbfi">
 END;
+// <body style='width: 98%;'>
+$erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
+
+// Body des Inlay muss in Mapbender-Feature-Info-PopUp passen. Kleiner als 750 aus css.
 $con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisinlayausk.php'");
 if (!$con) {echo "<br>Fehler beim Verbinden der DB.\n<br>";}
@@ -63,5 +73,5 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Flurstuecksdaten.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = gml_id = '".$gmlid."'</p>";}
+	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
 }
 
@@ -122,5 +132,5 @@
 // Gebaeude-NW zum FS
 echo "\n\t\t\t\t<a href='javascript:imFenster(\"alkisgebaeudenw.php?gkz=".$gkz."&amp;gmlid=".$gmlid."\")' "
-	."title='Geb&auml;udenachweis'>Geb&auml;ude&nbsp;"
+	."title='Geb&auml;ude oder Bauwerke'>Geb&auml;ude/Bauw.&nbsp;"
 	."<img src='ico/Haus.png' width='16' height='16' alt=''>"
 ."</a>";
@@ -139,5 +149,5 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Lagebezeichnung mit Hausnummer.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = gml_id = '".$gmlid."'</p>";}
+	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
 }
 $j=0;
@@ -145,5 +155,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 {
@@ -153,5 +163,5 @@
 	echo "\n\t<tr>"
 		."\n\t\t<td class='ll'>";
-		if ($j == 0) {echo "<img src='ico/Lage_mit_Haus.png' width='16' height='16' alt='MIT'> Lage:";}
+		if ($j === 0) {echo "<img src='ico/Lage_mit_Haus.png' width='16' height='16' alt='MIT'> Lage:";}
 		echo "</td>"
 		."\n\t\t<td class='lr'>".$sname."&nbsp;".$hsnr."</td>"
@@ -182,5 +192,5 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Lagebezeichnung ohne Hausnummer.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = gml_id = '".$gmlid."'</p>";}
+	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
 }
 $kgmlalt='';
@@ -188,5 +198,5 @@
 	$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 {
Index: trunk/info/info/alkisn/alkisbestnw.php
===================================================================
--- trunk/info/info/alkisn/alkisbestnw.php	(revision 419)
+++ trunk/info/info/alkisn/alkisbestnw.php	(revision 422)
@@ -7,13 +7,10 @@
 	Version:
 	2016-02-24 Version fuer norGIS-ALKIS-Import
-	2016-11-29 HTML5, Gemeinsam genutzte Datenbanken ermÃ¶glichen, Markierung der Sortierung
-	2017-06-01 Function "eigentuemer" ohne Parameter $con
-	2017-06-08 Validierung Eingabeparameter, Farbwechsel der Tabelle je GrundstÃŒck, Feinschliff und HTML-Profilierung
-	2017-10-09 SchlÃŒssel der Blattart bei berechtigten BlÃ€ttern, sauber filtern auf endet IS NULL
-	2018-04-23 Blatt und EigentÃŒmer in eine Tabelle.
-	2018-05-03 Anpassung an GrundstÃŒcksnachweis, kein Export fÃŒr fiktives Blatt
-	2018-11-09 Umstellung Full-Schema
-	2018-11-14 Korrektur zu Full-Schema
+	....
+	2020-02-20 Authentifizierung ausgelegert in Function darf_ich()
+	2020-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF']
+	2020-12-15 Input-Validation und Strict Comparisation (===)
 */
+ini_set("session.cookie_httponly", 1);
 session_start();
 $showkey="n"; $nodebug=""; // Var. initalisieren
@@ -21,13 +18,21 @@
 
 // strikte Validierung aller Parameter
-if (!isset($gmlid) or !preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
-if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
+if (isset($gmlid)) {
+	if (!preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
+} else {
+	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}$#', $showkey)) {die ("Eingabefehler showkey");}
-if ($showkey == "j") {$showkey=true;} else {$showkey=false;}
+if ($showkey === "j") {$showkey=true;} else {$showkey=false;}
 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>
@@ -47,7 +52,10 @@
 <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.
 // 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_alkisbestnw.php'");
@@ -69,5 +77,5 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Grundbuchdaten.</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)) {
@@ -76,5 +84,5 @@
 	$blatt=ltrim($row["blatt"], "0");
 
-	echo "<p class='gbkennz'>ALKIS Bestand ".$row["bezirk"]." - ".$blatt."&nbsp;</p>"; // Balken
+	echo "<p class='balken gbkennz'>ALKIS Bestand ".$row["bezirk"]." - ".$blatt."&nbsp;</p>"; // Balken
 	echo "\n<h2>Grundbuch</h2>";
 	echo "\n<table class='outer'>" // Blatt UND Eigent.
@@ -112,5 +120,5 @@
 } else { // E I G E N T U E M E R
 	$n = eigentuemer($gmlid, true, ""); // MIT Adressen.
-	if ($n == 0) { // keine NamensNr, kein Eigentuemer
+	if ($n === 0) { // keine NamensNr, kein Eigentuemer
 		echo "\n<p class='err'>Keine Namensnummer gefunden.</p>"
 		."\n<p>Bezirk: ".$row["bezirk"].", Blatt: ".$blatt.", Blattart ".$blattkey." (".$blattart.")</p>";
@@ -179,5 +187,5 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Buchung.</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>";}
 }
 $i=0;
@@ -202,5 +210,5 @@
 	$j = bnw_fsdaten($lfdnr, $gml_bs, $bart, $anteil, true, $bartkey, $bartstory); // return=Anzahl der FS
 	$fscnt=$fscnt + $j;
-	if ($j == 0) { //  k e i n e  Flurstuecke gefunden (Miteigentumsnteil usw.)
+	if ($j === 0) { //  k e i n e  Flurstuecke gefunden (Miteigentumsnteil usw.)
 		// Bei "normalen" Grundstuecken wurden hier Flurstuecksdaten gefunden und ausgegeben.
 		// Bei Miteigentumsanteil, Erbbaurecht usw. muss nach den "dienenden" Buchungsstellen gesucht werden, darauf sind die FS gebucht.
@@ -230,5 +238,5 @@
 		if (!$resan) {
 			echo "\n<p class='err'>Fehler bei 'andere Buchungsstelle'.</p>";
-			if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = '".$gml_bs."'</p>";}
+			if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gml_bs."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
 		}
 
@@ -252,5 +260,5 @@
 			if (!$fbres) {
 				echo "\n<p class='err'>Fehler bei fiktivem Blatt.</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", "'".$gml_bsan."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}			
 			}
 			$b=0;
@@ -271,5 +279,5 @@
 			echo "\n<tr class='".$trclass."'>"
 				."\n\t<td id='bvnr".$lfdnr."'>"; // Sp.1 Erbbau BVNR, Sprungmarke
-					if($bvnr == $altbvnr) {	// gleiches Grundstueck
+					if($bvnr === $altbvnr) {	// gleiches Grundstueck
 						echo "&nbsp;"; // dann Anzeige unterdruecken
 					} else {
@@ -328,5 +336,5 @@
 			$a++;
 		}
-		if ($a == 0) {
+		if ($a === 0) {
 			echo "\n<tr class='".$trclass."'>"
 				."\n\t<td><span class='wichtig'>".$bvnr."</span></td>"
@@ -349,5 +357,5 @@
 echo "\n</table>";
 
-if ($i == 0) {
+if ($i === 0) {
 	echo "\n<p class='err'>Keine Buchung gefunden.</p>";
 } else {
@@ -379,10 +387,10 @@
 if (!$resb) {
 	echo "\n<p class='err'>Fehler bei 'Berechtigte Bl&auml;tter.</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>";}
 }
 $b=0; // count: Buchungen / BlÃ€tter
 $zpaar=false;
 while($rowb = pg_fetch_assoc($resb)) {
-	if ($b == 0) { // Ueberschrift und Tabelle nur ausgeben, wenn etwas gefunden wurde
+	if ($b === 0) { // Ueberschrift und Tabelle nur ausgeben, wenn etwas gefunden wurde
 		echo "\n\n<h3><img src='ico/Grundbuch_zu.png' width='16' height='16' alt=''> Berechtigte Grundb&uuml;cher</h3>"
 		."\n<table class='outer'>"
@@ -443,5 +451,5 @@
 	$b++;
 }
-if ($b == 0) {
+if ($b === 0) {
 	if ($blattkey > 2000 ) { // Warnung nicht bei Grundbuchblatt 1000 und Katasterblatt 2000
 		echo "\n<p class='err'>Keine berechtigten Bl&auml;tter zu ".$blattart." (".$blattkey.") gefunden.</p>";
@@ -463,5 +471,5 @@
 }
 echo "&nbsp;\n</div>";
-footer($gmlid, $_SERVER['PHP_SELF']."?", "");
+footer($gmlid, selbstverlinkung()."?", "");
 ?>
 </body>
Index: trunk/info/info/alkisn/alkisausk.php
===================================================================
--- trunk/info/info/alkisn/alkisausk.php	(revision 419)
+++ trunk/info/info/alkisn/alkisausk.php	(revision 422)
@@ -11,7 +11,7 @@
 	Version:
 	2016-02-24 Version fuer norGIS-ALKIS-Import
-	2016-11-29 HTML5, Gemeinsam genutzte Datenbanken ermÃ¶glichen (Berechtigung fÃŒr Gemeinde prÃŒfen)
-	2017-10-11 Sauber filtern auf endet IS NULL
-	2018-11-09 Umstellung Full-Schema
+	....
+	2020-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF']
+	2020-12-15 Input-Validation und Strict Comparisation (===)
 
 	H i n w e i s :  Dies Modul wird beim Entwickler nicht mehr produktiv eingesetzt.
@@ -19,12 +19,17 @@
 		Mangels Praxis bleiben Fehler mÃ¶glicherweise unerkannt.
 */
+ini_set("session.cookie_httponly", 1);
 session_start();
 $cntget = extract($_GET);
-
-require_once("alkis_conf_location.php");
-if ($auth == "mapbender") {require_once($mapbender);}
-include("alkisfkt.php");
+if (isset($gkz)) {
+	if (!preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
+} else {
+	die("Fehlender Parameter");
+}
+include "alkis_conf_location.php";
+include "alkisfkt.php";
+
 $keys = isset($_GET["showkey"]) ? $_GET["showkey"] : "n";
-if ($keys == "j") {$showkey=true;} else {$showkey=false;}
+if ($keys === "j") {$showkey=true;} else {$showkey=false;}
 echo <<<END
 <!doctype html>
@@ -38,4 +43,7 @@
 <body>
 END;
+
+$erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
+
 $con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisausk.php'");
 if (!$con) {echo "<br>Fehler beim Verbinden der DB.\n<br>";}
@@ -197,5 +205,5 @@
 		$blattkey=$rowg["blattart"];
 		$blattart=$rowg["blattartv"];
-		if ($blattkey == 1000) {
+		if ($blattkey === 1000) {
 			echo "\n\t<table class='kennzgb' title='Bestandskennzeichen'>";
 		} else {
@@ -221,5 +229,5 @@
 		."\n\t</table>";
 
-		if ($rowg["zaehler"] <> "") {
+		if ($rowg["zaehler"] != "") {
 			echo "\n<p class='ant'>".$rowg["zaehler"]."/".$rowg["nenner"]."&nbsp;Anteil am Flurst&uuml;ck</p>";
 		}
@@ -234,5 +242,5 @@
 
 	// E I G E N T U E M E R
-	if ($blattkey == 5000) { // SchlÃŒssel Blatt-Art
+	if ($blattkey === 5000) { // SchlÃŒssel Blatt-Art
 		echo "\n<p>Keine Angaben zum Eigentum bei fiktivem Blatt</p>\n"
 		."\n<p>Siehe weitere Grundbuchbl&auml;tter mit Rechten an dem fiktiven Blatt.</p>";
@@ -241,5 +249,5 @@
 		$n = eigentuemer($rowg["gml_id"], false, "imFenster"); // ohne Adressen
 
-		if ($n == 0) { // keine NamNum, kein Eigent.
+		if ($n === 0) { // keine NamNum, kein Eigent.
 			echo "\n<p class='err'>Keine Eigent&uuml;mer gefunden.</p>"
 			."\n<p class='err'>Bezirk ".$rowg["bezirk"]." Blatt ".$rowg["blatt"]." Blattart ".$blattkey." (".$blattart.")</p>";
@@ -248,8 +256,8 @@
 	$j++;
 }
-if ($j == 0) {echo "\n<p class='err'>Keine Buchungen gefunden.</p>";}
+if ($j === 0) {echo "\n<p class='err'>Keine Buchungen gefunden.</p>";}
 echo "\n<hr>";
 
-footer($gmlid, $_SERVER['PHP_SELF']."?", "");
+footer($gmlid, selbstverlinkung()."?", "");
 
 ?>
Index: trunk/info/info/alkisn/alkisnamstruk.php
===================================================================
--- trunk/info/info/alkisn/alkisnamstruk.php	(revision 419)
+++ trunk/info/info/alkisn/alkisnamstruk.php	(revision 422)
@@ -7,12 +7,10 @@
 	Version:
 	2016-02-24 Version fuer norGIS-ALKIS-Import
-	2016-11-29 HTML5, Gemeinsam genutzte Datenbanken ermÃ¶glichen
-	2017-06-02 Validierung Eingabeparameter, Feinkorrekturen
-	2017-10-09 Sauber filtern auf endet IS NULL
-	2017-10-17 Deutsches Datumsformat im Geburtsdatum
-	2017-12-20 Anlass und Datum zur Adresse ausgeben, wenn es mehrere gibt oder SchlÃŒssel angefordert werden
-	2018-04-23 &nodebug
-	2018-11-09 Umstellung Full-Schema
+	...
+	2020-02-20 Authentifizierung ausgelagert in Function darf_ich()
+	2020-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF']
+	2020-12-15 Input-Validation und Strict Comparisation (===)
 */
+ini_set("session.cookie_httponly", 1);
 session_start();
 $multiadress="n"; $showkey="n"; $nodebug=""; // Var. aus Parameter initalisieren
@@ -20,15 +18,21 @@
 
 // strikte Validierung aller Parameter
-if (!isset($gmlid) or !preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
-if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
+if (isset($gmlid)) {
+	if (!preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
+} else {
+	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}$#', $showkey)) {die ("Eingabefehler showkey");}
-if ($showkey == "j") {$showkey=true;} else {$showkey=false;}
+if ($showkey === "j") {$showkey=true;} else {$showkey=false;}
 if (!preg_match('#^[j|n]{0,1}$#', $multiadress)) {die ("Eingabefehler multiadress");}
 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");
-
 ?>
 <!doctype html>
@@ -47,11 +51,12 @@
 </head>
 <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.
 // Manuell an die URL anfÃŒgen, wirkt nur temporÃ€r und wird nicht in Links weiter gereicht.
-if ($nodebug == "j") {$debug=0;} 
-
-echo "<p class='nakennz'>ALKIS Name id=".$gmlid."&nbsp;</p>\n" // Balken
+if ($nodebug === "j") {$debug=0;} 
+
+echo "<p class='balken nakennz'>ALKIS Name id=".$gmlid."&nbsp;</p>\n" // Balken
 ."\n<h2><img src='ico/Eigentuemer.png' width='16' height='16' alt=''> Person</h2>";
 $con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisnamstruk.php'");
@@ -68,5 +73,5 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Zugriff auf Namensnummer</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)) {
@@ -92,5 +97,5 @@
 
 	// A d r e s s e
-	if ($multiadress == "j") {$plural="n";} else {$plural="";}
+	if ($multiadress === "j") {$plural="n";} else {$plural="";}
 	echo "\n\n<h3><img src='ico/Strasse_mit_Haus.png' width='16' height='16' alt=''> Adresse".$plural."</h3>";
 	// Es kÃ¶nnen redundante Adressen vorhanden sein, z.B. aus Migration, temporÃ€r aus LBESAS.
@@ -106,5 +111,5 @@
 	if (!$resa) {
 		echo "\n<p class='err'>Fehler bei Adressen</p>";
-		if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".$sqla."<br>$1=gml(Person)= '".$gmlid."'</p>";}
+		if ($debug > 2) {echo "\n<p class='err'>SQL=<br>". str_replace("$1", "'".$gmlid."'", $sqla)."</p>";}
 	}
 
@@ -113,5 +118,5 @@
 	while($rowa = pg_fetch_assoc($resa)) {
 		$j++;
-		if ($multiadress == "j" OR $j == 1) {
+		if ($multiadress === "j" OR $j === 1) {
 			$gmla=$rowa["gml_id"];
 			$plz=$rowa["plz"];
@@ -124,5 +129,5 @@
 			$datum=$rowa["datum"];
 			echo "<table>\n";
-				if ($multiadress == "j" OR $showkey) {
+				if ($multiadress === "j" OR $showkey) {
 					if ($debug > 0) { // nur Entw.: Sortierung gml_id vs. beginnt?
 						echo "\t<tr><td class='dbg'>gml_id:</td><td class='dbg'>".$rowa["gml_id"]."</td></tr>\n";
@@ -148,11 +153,11 @@
 	}
 	pg_free_result($resa);
-	if ($j == 0) {
+	if ($j === 0) {
 		echo "\n<p class='err'>Keine Adressen.</p>";
 	} elseif ($j > 1) {
 		echo "\n\t\t<p class='nwlink noprint'>"
-		."\n\t\t\t<a href='".$_SERVER['PHP_SELF']. "?gkz=".$gkz."&amp;gmlid=".$gmlid;
+		."\n\t\t\t<a href='".selbstverlinkung(). "?gkz=".$gkz."&amp;gmlid=".$gmlid;
 		if ($showkey) {echo "&amp;showkey=j";}
-		if ($multiadress == "j") {
+		if ($multiadress === "j") {
 			echo "&amp;multiadress=n' title='mehrfache Adressen unterdr&uuml;cken'>erste Adresse ";
 		} else {
@@ -183,5 +188,5 @@
 		echo "\n<p class='err'>Fehler bei Grundbuch</p>";
 		if ($debug > 2) {
-			echo "\n<p class='err'>SQL=<br>".htmlentities($sqlg, ENT_QUOTES, "UTF-8")."<br>$1 = gml_id = '".$gmlid."'</p>";
+			echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sqlg ), ENT_QUOTES, "UTF-8")."</p>";
 		}
 	}
@@ -231,5 +236,5 @@
 
 			echo "\n\t<td>"; // Anteil
-				if ($zae == "") {
+				if ($zae == '') {
 					echo "&nbsp;";
 				} else {
@@ -252,5 +257,5 @@
 	pg_free_result($resg);
 	echo "</table>";
-	if ($i == 0) {echo "\n<p class='err'>Kein Grundbuch.</p>";}
+	if ($i === 0) {echo "\n<p class='err'>Kein Grundbuch.</p>";}
 } else {
 	echo "\n\t<p class='err'>Fehler! Kein Treffer f&uuml;r\n\t<a target='_blank' href='alkisrelationen.php?gkz=".$gkz."&amp;gmlid=".$gmlid."'>".$gmlid."</a>\n</p>\n\n";
@@ -265,5 +270,5 @@
 </div>
 
-<?php footer($gmlid, $_SERVER['PHP_SELF']."?", ""); ?>
+<?php footer($gmlid, selbstverlinkung()."?", ""); ?>
 
 </body>
Index: trunk/info/info/alkisn/alkisgebaeudenw.php
===================================================================
--- trunk/info/info/alkisn/alkisgebaeudenw.php	(revision 419)
+++ trunk/info/info/alkisn/alkisgebaeudenw.php	(revision 422)
@@ -5,26 +5,76 @@
 	Version:
 	2016-02-24 Version fuer norGIS-ALKIS-Import
-	2016-11-29 HTML5, Gemeinsam genutzte Datenbanken ermÃ¶glichen
-	2016-12-05 Array-Behandlung ax_gebaeude.name
-	2017-06-08 Validierung Eingabeparameter, Feinkorrekturen
-	2017-06-19 Tool-Tip GebÃ€udefunktion
-	2018-04-23 Kennzeichen eingerÃŒckt, &nodebug
-	2018-11-09 Umstellung Full-Schema
-	2018-11-21 Korrektur LEFT Join Bauweise
+	....
+	2020-02-20 Authentifizierung ausgelegert in Function darf_ich()
+	2020-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF']
+	2020-12-15 Verschneidung mit "sonstige Bauwerke", Input-Validation und Strict Comparisation
+	2021-03-09 Verschneidung mit weiteren Bauwerks-Tabellen.
+	2021-03-11 Adresse(n) des gehÃ¶rtZu-Haus zum Bauwerk nicht mehr hier anzeigen sondern im neuen Bauwerk-Modul.
 */
+
+// Kopf fÃŒr die Anzeige der GebÃ€ude. Nur wenn tatsÃ€chlich GebÃ€ude vorkommen.
+function geb_tab_head() {
+	// Ãberschrift
+	echo "\n\n<h3><img src='ico/Haus.png' width='16' height='16' alt=''> Geb&auml;ude</h3>"
+	."\n<p>.. auf oder an dem Flurst&uuml;ck. Ermittelt durch Verschneidung der Geometrie.</p>";
+
+	// Tabellen-Kopf
+	echo "\n<hr>\n<table class='geb'>";
+	echo "\n<tr>"
+		."\n\t<td class='head' title='ggf. Geb&auml;udename'>Name</td>"
+		."\n\t<td class='heads fla' title='Schnittfl&auml;che zwischen Flurst&uuml;ck und Geb&auml;ude'><img src='ico/sortd.png' width='10' height='10' alt='' title='Sortierung (absteigend)'>Fl&auml;che</td>"
+		."\n\t<td class='head' title='gesamte Geb&auml;udefl&auml;che, liegt teilweise auf Nachbar-Flurst&uuml;ck'>&nbsp;</td>"
+		."\n\t<td class='head' title='Geb&auml;udefunktion ist die zum Zeitpunkt der Erhebung vorherrschend funktionale Bedeutung des Geb&auml;udes'>Funktion</td>"
+		."\n\t<td class='head' title='Bauweise ist die Beschreibung der Art der Bauweise'>Bauweise</td>"
+		."\n\t<td class='head' title='Zustand beschreibt die Beschaffenheit oder die Betriebsbereitschaft von Geb&auml;ude. Diese Attributart wird nur dann optional gef&uuml;hrt, wenn der Zustand des Geb&auml;udes vom nutzungsf&auml;higen Zustand abweicht.'>Zustand</td>"
+		."\n\t<td class='head nwlink' title='Lagebezeichnung mit Stra&szlig;e und Hausnummer'>Lage</td>"
+		."\n\t<td class='head nwlink' title='Link zu den kompletten Hausdaten'>Haus</td>"
+	."\n</tr>";
+}
+	
+// Kopf fÃŒr die Anzeige der Bauwerke. Nur wenn tatsÃ€chlich Bauwerke vorkommen.
+function bauw_tab_head() {
+	// Ãberschrift
+	echo "\n\n<h3><img src='ico/Haus.png' width='16' height='16' alt=''> Bauwerke</h3>"
+	."\n<p>.. auf oder an dem Flurst&uuml;ck. Ermittelt durch Verschneidung der Geometrie.</p>";
+
+	// Tabellen-Kopf
+	echo "\n<hr>\n<table class='geb'>";
+	echo "<tr><td colspan=3></td><td colspan=3 class='heads gw'><img src='ico/sort.png' width='10' height='10' alt='' title='Sortierung'>Bauwerks-Typ</td></tr>";
+	echo "\n<tr>";
+	echo "\n\t<td class='head' title='Bezeichnung und/oder Bauwerksname'>Name</td>"
+		."\n\t<td class='heads fla' title='Schnittfl&auml;che zwischen Flurst&uuml;ck und Bauwerk'><img src='ico/sortd.png' width='10' height='10' alt='' title='Sortierung (absteigend)'>Fl&auml;che</td>"
+		."\n\t<td class='head' title='gesamte Bauwerksfl&auml;che, liegt teilweise auf Nachbar-Flurst&uuml;ck'>&nbsp;</td>"
+		."\n\t<td class='head' title='Bauwerksfunktion'>Funktion</td>"
+		."\n\t<td class='head nwlink' title='Daten des zugehÃ¶rigen Geb&auml;udes'>zum Haus</td>"
+		."\n\t<td class='head nwlink' title='Detaillierte Daten zu diesem Bauwerk'>Bauwerk</td>"
+	."\n</tr>";
+}
+
+// S T A R T
+
+ini_set("session.cookie_httponly", 1);
 session_start();
-$showkey="n"; $nodebug=""; // Var. aus Parameter initalisieren
-$cntget = extract($_GET); // Parameter in Variable umwandeln
+$showkey="n"; $nodebug="";	// Var. aus Parameter initalisieren
+$cntget = extract($_GET);	// Parameter in Variable umwandeln
 
 // strikte Validierung aller Parameter
-if (!isset($gmlid) or !preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
-if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
+if (isset($gmlid)) {
+	if (!preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
+} else {
+	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}$#', $showkey)) {die ("Eingabefehler showkey");}
-if ($showkey == "j") {$showkey=true;} else {$showkey=false;}
+if ($showkey === "j") {$showkey=true;} else {$showkey=false;}
 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";
+
 echo <<<END
 <!doctype html>
@@ -39,7 +89,10 @@
 <body>
 END;
+
+$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.
 // 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_alkisgebaeudenw.php'");
@@ -55,5 +108,6 @@
 if (!$resf) {
 	echo "\n<p class='err'>Fehler bei Flurst&uuml;cksdaten.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".$sqlf."<br>$1 = gml_id = '".$gmlid."'</p>";}
+	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlf)."'</p>";}
+	if ($debug > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($resf)."</p>";}
 }
 if ($rowf = pg_fetch_assoc($resf)) {
@@ -70,6 +124,6 @@
 	echo "\n<p class='err'>Fehler! Kein Treffer fuer gml_id=".$gmlid."</p>";
 }
-echo "<p class='geb'>ALKIS Flurst&uuml;ck (Geb&auml;ude) ".$gmkgnr."-".$flurnummer."-".$flstnummer."&nbsp;</p>"; // Balken
-echo "\n<h2>Flurst&uuml;ck (Geb&auml;ude)</h2>";
+echo "<p class='balken geb'>ALKIS Flurst&uuml;ck (Geb&auml;ude und Bauwerke) ".$gmkgnr."-".$flurnummer."-".$flstnummer."&nbsp;</p>"; // Balken
+echo "\n<h2>Flurst&uuml;ck (Geb&auml;ude und Bauwerke)</h2>";
 echo "\n<table class='outer'>" // Kopf
 	."\n<tr>"
@@ -84,5 +138,5 @@
 				."\n\t\t</tr>\n\t\t<tr>"
 					."\n\t\t\t<td title='Gemarkung'>";
-					if  ($showkey) {echo "<span class='key'>".$gmkgnr."</span><br>";}
+					if ($showkey) {echo "<span class='key'>".$gmkgnr."</span><br>";}
 					echo $gemkname."&nbsp;</td>"
 					."\n\t\t\t<td title='Flurnummer'>".$flurnummer."</td>"
@@ -104,17 +158,15 @@
 pg_free_result($resf);
 
-echo "\n\n<h3><img src='ico/Haus.png' width='16' height='16' alt=''> Geb&auml;ude</h3>"
-."\n<p>.. auf oder an dem Flurst&uuml;ck. Ermittelt durch Verschneidung der Geometrie.</p>";
-
 // G e b a e u d e
+
 $sqlg ="SELECT g.gml_id, g.name, g.bauweise, g.gebaeudefunktion, h.beschreibung AS bauweise_beschreibung, u.beschreibung AS bezeichner, u.dokumentation AS gfktd, g.zustand, z.beschreibung AS bzustand, 
-round(st_area(g.wkb_geometry)::numeric,2) AS gebflae, "; // GEB-Flaeche komplett auch die Fl. ausserhalb des FS
+round(st_area(g.wkb_geometry)::numeric,2) AS gebflae, "; // GEB-Flaeche, auch ausserhalb des FS
 $sqlg.="round(st_area(ST_Intersection(g.wkb_geometry,f.wkb_geometry))::numeric,2) AS schnittflae, "; // wie viel vom GEB liegt im FS?
-$sqlg.="st_within(g.wkb_geometry,f.wkb_geometry) as drin "; // liegt das GEB komplett im FS?
-$sqlg.="FROM ax_flurstueck f, ax_gebaeude g 
-LEFT JOIN ax_bauweise_gebaeude h ON g.bauweise = h.wert
-LEFT JOIN ax_gebaeudefunktion u ON g.gebaeudefunktion = u.wert
-LEFT JOIN ax_zustand_gebaeude z ON g.zustand = z.wert
-WHERE f.gml_id= $1 AND f.endet IS NULL and g.endet IS NULL "; // ID des akt. FS
+$sqlg.="st_within(g.wkb_geometry,f.wkb_geometry) as drin 
+ FROM ax_flurstueck f, ax_gebaeude g 
+ LEFT JOIN ax_bauweise_gebaeude h ON g.bauweise = h.wert
+ LEFT JOIN ax_gebaeudefunktion u ON g.gebaeudefunktion = u.wert
+ LEFT JOIN ax_zustand_gebaeude z ON g.zustand = z.wert 
+WHERE f.gml_id= $1 AND f.endet IS NULL and g.endet IS NULL ";
 
 // "within" -> nur Geb., die komplett im FS liegen. "intersects" -> auch teil-ueberlappende Flst.
@@ -129,135 +181,136 @@
 if (!$resg) {
 	echo "\n<p class='err'>Fehler bei Geb&auml;ude-Verschneidung.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".$sqlg."<br>$1 = gml_id = '".$gmlid."'</p>";}
+	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlg)."'</p>";}
+	if ($debug > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($resg)."</p>";}
 }
 $gebnr=0;
 $gebflsum=0;
-echo "\n<hr>\n<table class='geb'>";
-	echo "\n<tr>" // T-Header
-		."\n\t<td class='head' title='ggf. Geb&auml;udename'>Name</td>"
-		."\n\t<td class='heads fla' title='Schnittfl&auml;che zwischen Flurst&uuml;ck und Geb&auml;ude'><img src='ico/sortd.png' width='10' height='10' alt='' title='Sortierung (absteigend)'>Fl&auml;che</td>"
-		."\n\t<td class='head' title='gesamte Geb&auml;udefl&auml;che, liegt teilweise auf Nachbar-Flurst&uuml;ck'>&nbsp;</td>"
-		."\n\t<td class='head' title='Geb&auml;udefunktion ist die zum Zeitpunkt der Erhebung vorherrschend funktionale Bedeutung des Geb&auml;udes'>Funktion</td>"
-		."\n\t<td class='head' title='Bauweise ist die Beschreibung der Art der Bauweise'>Bauweise</td>"
-		."\n\t<td class='head' title='Zustand beschreibt die Beschaffenheit oder die Betriebsbereitschaft von Geb&auml;ude. Diese Attributart wird nur dann optional gef&uuml;hrt, wenn der Zustand des Geb&auml;udes vom nutzungsf&auml;higen Zustand abweicht.'>Zustand</td>"
-		."\n\t<td class='head nwlink' title='Lagebezeichnung mit Stra&szlig;e und Hausnummer'>Lage</td>"
-		."\n\t<td class='head nwlink' title='Link zu den kompletten Hausdaten'>Haus</td>"
+while($rowg = pg_fetch_assoc($resg)) {
+	$gebnr++;
+	if ($gebnr === 1) {geb_tab_head();} // Tab.-Kopf
+	$ggml=$rowg["gml_id"];
+	$gebflsum=$gebflsum + $rowg["schnittflae"];
+	$gnam=trim(trim($rowg["name"], "{}"), '"'); // Gebaeude-Name ist ein Array in der DB: '{"A","B"}'
+	// Mehrfachbelegung nur theoretisch. Entklammern reicht. Mal mit und mal ohne "" drum!?
+	/* SELECT name FROM ax_gebaeude WHERE NOT name IS NULL AND array_length(name, 1) > 1; */
+	$gfktk=htmlentities($rowg["gebaeudefunktion"], ENT_QUOTES, "UTF-8");  // Geb.-Funktion Key
+	$gfktv=htmlentities($rowg["bezeichner"], ENT_QUOTES, "UTF-8"); // Geb.Funktion Value
+	$gfktd=htmlentities($rowg["gfktd"], ENT_QUOTES, "UTF-8"); // GebÃ€ude-Funktion-Description
+
+	$gbauw=$rowg["bauweise"];
+	$gbauwb=htmlentities($rowg["bauweise_beschreibung"], ENT_QUOTES, "UTF-8");
+
+	$gzus=$rowg["zustand"];
+	$gzustand=htmlentities($rowg["bzustand"], ENT_QUOTES, "UTF-8");
+
+	// 3 FÃ€lle unterscheiden:
+	if ($rowg["drin"] === "t") { // GebÃ€ude liegt komplett in FlurstÃŒck
+		$f1=$rowg["schnittflae"]." m&#178;";
+		$f2="&nbsp;";
+		$gstyle="gin"; // siehe .css
+	} else {
+		if ($rowg["schnittflae"] === "0.00") { // GebÃ€ude angrenzend (Grenzbebauung)
+			$gstyle="gan";
+			$f1="&nbsp;";
+			$f2="angrenzend";
+		} else { // Teile des GebÃ€udes stehen auf dem FlurstÃŒck
+			$gstyle="gtl";
+			$f1=$rowg["schnittflae"]." m&#178;";
+			$f2="(von ".$rowg["gebflae"]." m&#178;)";
+		}
+	}
+
+	echo "\n<tr>"
+		."\n\t<td>";
+		if ($gnam != "") {echo "<span title='Geb&auml;udename'>".$gnam."</span><br>";}
+		echo "</td>";
+
+		echo "\n\t<td class='fla'>".$f1."</td>"
+		."\n\t<td class='".$gstyle."'>".$f2."</td>"; // FlÃ€chenangaben
+
+		echo "\n\t<td title='".$gfktd."'>"; // Funktion
+			if ($showkey) {echo "<span class='key'>(".$gfktk.")</span>&nbsp;";}
+			echo $gfktv;
+		echo "</td>";
+
+		echo "\n\t<td>";
+		if ($gbauw != "") {
+			if ($showkey) {echo "<span class='key'>(".$gbauw.")</span>&nbsp;";}
+			echo $gbauwb;
+		}
+		echo "</td>";
+
+		echo "\n\t<td>";
+		if ($gzus != "") {
+			if ($showkey) {echo "<span class='key'>(".$gzus.")</span>&nbsp;";}
+			echo $gzustand;
+		}
+		echo "</td>";
+
+		// 2 Spalten mit Links zu anderen Nachweisen: 1. Lage, 2. GebÃ€ude
+		echo "\n\t<td class='nwlink noprint'>"; // Link Lage
+
+		// Zu EINEM GebÃ€ude mehrere Lagebezeichnungen mit Haus- oder Pseudo-Nummer mÃ¶glich, alle in ein TD 
+		// HAUPTgebÃ€ude  Geb >zeigtAuf> lage (mehrere)
+		$sqll="SELECT 'm' AS ltyp, l.gml_id AS lgml, s.lage, s.bezeichnung, l.hausnummer, '' AS laufendenummer "
+		."FROM ax_gebaeude g JOIN ax_lagebezeichnungmithausnummer l ON l.gml_id=ANY(g.zeigtauf) "
+		."JOIN ax_lagebezeichnungkatalogeintrag s ON l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage=s.lage "
+		."WHERE g.gml_id= $1 AND g.endet IS NULL AND l.endet IS NULL AND s.endet IS NULL ";
+
+		// UNION - oder NEBENgebÃ€ude  Geb >hat> Pseudo
+		$sqll.="UNION SELECT 'p' AS ltyp, l.gml_id AS lgml, s.lage, s.bezeichnung, l.pseudonummer AS hausnummer, l.laufendenummer "
+		."FROM ax_gebaeude g JOIN ax_lagebezeichnungmitpseudonummer l ON l.gml_id=g.hat "
+		."JOIN ax_lagebezeichnungkatalogeintrag s ON l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage=s.lage "
+		."WHERE g.gml_id= $1 AND g.endet IS NULL AND l.endet IS NULL AND s.endet IS NULL "; // ID des Hauses"
+	
+		$sqll.="ORDER BY bezeichnung, hausnummer, laufendenummer;";
+		$v = array($ggml);
+		$resl = pg_prepare("", $sqll);
+		$resl = pg_execute("", $v);
+		if (!$resl) {
+			echo "\n<p class='err'>Fehler bei Lage mit HsNr.</p>";
+			if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqll)."'</p>";}
+			if ($debug > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($resl)."</p>";}
+		}
+		while($rowl = pg_fetch_assoc($resl)) { // LOOP: Lagezeilen
+			$ltyp=$rowl["ltyp"]; // Lagezeilen-Typ
+			$skey=$rowl["lage"]; // Str.-Schluessel
+			$snam=htmlentities($rowl["bezeichnung"], ENT_QUOTES, "UTF-8"); //-Name
+			$hsnr=$rowl["hausnummer"];
+			$hlfd=$rowl["laufendenummer"];
+			$gmllag=$rowl["lgml"];
+			if ($ltyp === "p") {
+				$lagetitl="Nebengeb&auml;ude - Pseudonummer";
+				$lagetxt="Nebengeb. ".$hlfd; // + HausNr??
+			} else {
+				$lagetitl="HauptgebÃ€ude - Hausnummer";
+				$lagetxt=$snam." ".$hsnr;
+			}
+			echo "\n\t\t<a title='".$lagetitl."' href='alkislage.php?gkz=".$gkz."&amp;gmlid=".$gmllag."&amp;ltyp=".$ltyp;
+				if ($showkey) {echo "&amp;showkey=j";}
+				echo "'>";
+				if ($showkey) {echo "<span class='key'>(".$skey.")</span>&nbsp;";}
+			echo $lagetxt."&nbsp;<img src='ico/Lage_mit_Haus.png' width='16' height='16' alt=''></a><br>";
+		} // Ende Loop Lage m.H.
+		pg_free_result($resl);
+		echo "\n\t</td>";
+
+		echo "\n\t<td class='nwlink noprint'>" // Link Haus
+			."\n\t\t<a title='Daten zum Geb&auml;ude-Objekt' href='alkishaus.php?gkz=".$gkz."&amp;gmlid=".$ggml;
+			if ($showkey) {echo "&amp;showkey=j";}
+			echo "'>Haus&nbsp;<img src='ico/Haus.png' width='16' height='16' alt=''></a>"
+		."\n\t</td>"
 	."\n</tr>";
-	while($rowg = pg_fetch_assoc($resg)) { // T-Body
-		$gebnr = $gebnr + 1;
-		$ggml=$rowg["gml_id"];
-		$gebflsum=$gebflsum + $rowg["schnittflae"];
-		$gnam=trim(trim($rowg["name"], "{}"), '"'); // Gebaeude-Name ist ein Array in der DB: '{"A","B"}'
-		// Mehrfachbelegung nur theoretisch. Entklammern reicht. Mal mit und mal ohne "" drum!?
-		/* SELECT name FROM ax_gebaeude WHERE NOT name IS NULL AND array_length(name, 1) > 1; */
-		$gfktk=htmlentities($rowg["gebaeudefunktion"], ENT_QUOTES, "UTF-8");  // Geb.-Funktion Key
-		$gfktv=htmlentities($rowg["bezeichner"], ENT_QUOTES, "UTF-8"); // Geb.Funktion Value
-		$gfktd=htmlentities($rowg["gfktd"], ENT_QUOTES, "UTF-8"); // GebÃ€ude-Funktion-Description
-		$gzus=htmlentities($rowg["zustand"], ENT_QUOTES, "UTF-8");
-		$gzustand=htmlentities($rowg["bzustand"], ENT_QUOTES, "UTF-8");
-
-		// 3 FÃ€lle unterscheiden:
-		if ($rowg["drin"] == "t") { // GebÃ€ude liegt komplett in FlurstÃŒck
-			$f1=$rowg["schnittflae"]." m&#178;";
-			$f2="&nbsp;";
-			$gstyle="gin"; // siehe .css
-		} else {
-	       	if ($rowg["schnittflae"] == "0.00") { // GebÃ€ude angrenzend (Grenzbebauung)
-				$gstyle="gan";
-				$f1="&nbsp;";
-				$f2="angrenzend";
-			} else { // Teile des GebÃ€udes stehen auf dem FlurstÃŒck
-				$gstyle="gtl";
-				$f1=$rowg["schnittflae"]." m&#178;";
-				$f2="(von ".$rowg["gebflae"]." m&#178;)";
-			}
-		}
-
-		echo "\n<tr>"
-			."\n\t<td class='".$gstyle."'>"; // Sp. 1 Name
-			if ($gnam != "") {echo "<span title='Geb&auml;udename'>".$gnam."</span><br>";}
-			echo "</td>";
-
-			echo "\n\t<td class='fla'>".$f1."</td>" // Sp. 2
-			."\n\t<td class='".$gstyle."'>".$f2."</td>"; // FlÃ€chenangaben
-
-			echo "\n\t<td class='".$gstyle."' title='".$gfktd."'>"; // Sp. 3 Funktion
-			if ($showkey) {echo "<span class='key'>".$gfktk."</span>&nbsp;";}
-			echo $gfktv."</td>";
-
-			echo "\n\t<td class='".$gstyle."'>";
-			if ($showkey) {echo "<span class='key'>".$rowg["bauweise"]."</span>&nbsp;";}
-			echo $rowg["bauweise_beschreibung"]."&nbsp;</td>";
-
-			echo "\n\t<td class='".$gstyle."'>";
-			if ($showkey) {echo "<span class='key'>".$gzus."</span>&nbsp;";}
-			echo $gzustand."&nbsp;</td>";
-
-			// 2 Spalten mit Links zu anderen Nachweisen: 1. Lage, 2. GebÃ€ude
-			echo "\n\t<td class='nwlink noprint'>"; // Link Lage
-
-			// Zu EINEM GebÃ€ude mehrere Lagebezeichnungen mit Haus- oder Pseudo-Nummer mÃ¶glich, alle in ein TD 
-			// HAUPTgebÃ€ude  Geb >zeigtAuf> lage (mehrere)
-			$sqll="SELECT 'm' AS ltyp, l.gml_id AS lgml, s.lage, s.bezeichnung, l.hausnummer, '' AS laufendenummer "
-			."FROM ax_gebaeude g JOIN ax_lagebezeichnungmithausnummer l ON l.gml_id=ANY(g.zeigtauf) "
-			."JOIN ax_lagebezeichnungkatalogeintrag s ON l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage=s.lage "
-			."WHERE g.gml_id= $1 AND g.endet IS NULL AND l.endet IS NULL AND s.endet IS NULL ";
-
-			// UNION - oder NEBENgebÃ€ude  Geb >hat> Pseudo
-			$sqll.="UNION SELECT 'p' AS ltyp, l.gml_id AS lgml, s.lage, s.bezeichnung, l.pseudonummer AS hausnummer, l.laufendenummer "
-			."FROM ax_gebaeude g JOIN ax_lagebezeichnungmitpseudonummer l ON l.gml_id=g.hat "
-			."JOIN ax_lagebezeichnungkatalogeintrag s ON l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage=s.lage "
-			."WHERE g.gml_id= $1 AND g.endet IS NULL AND l.endet IS NULL AND s.endet IS NULL "; // ID des Hauses"
-		
-			$sqll.="ORDER BY bezeichnung, hausnummer;";
-			$v = array($ggml);
-			$resl = pg_prepare("", $sqll);
-			$resl = pg_execute("", $v);
-			if (!$resl) {
-				echo "\n<p class='err'>Fehler bei Lage mit HsNr.</p>";
-				if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqll."<br>$1 = gml_id = '".$gmlid."'</p>";}
-			}
-			while($rowl = pg_fetch_assoc($resl)) { // LOOP: Lagezeilen
-				$ltyp=$rowl["ltyp"]; // Lagezeilen-Typ
-				$skey=$rowl["lage"]; // Str.-Schluessel
-				$snam=htmlentities($rowl["bezeichnung"], ENT_QUOTES, "UTF-8"); //-Name
-				$hsnr=$rowl["hausnummer"];
-				$hlfd=$rowl["laufendenummer"];
-				$gmllag=$rowl["lgml"];
-				if ($ltyp == "p") {
-					$lagetitl="NebengebÃ€ude - Pseudonummer";
-					$lagetxt="Nebengeb&auml;ude Nr. ".$hlfd;
-				} else {
-					$lagetitl="HauptgebÃ€ude - Hausnummer";
-					$lagetxt=$snam."&nbsp;".$hsnr;
-				}
-				echo "\n\t\t<a title='".$lagetitl."' href='alkislage.php?gkz=".$gkz."&amp;gmlid=".$gmllag."&amp;ltyp=".$ltyp;
-					if ($showkey) {echo "&amp;showkey=j";}
-					echo "'>";
-					if ($showkey) {echo "<span class='key'>(".$skey.")</span>&nbsp;";}
-				echo $lagetxt."&nbsp;<img src='ico/Lage_mit_Haus.png' width='16' height='16' alt=''></a><br>";
-			} // Ende Loop Lage m.H.
-            pg_free_result($resl);
-			echo "\n\t</td>";
-
-			echo "\n\t<td class='nwlink noprint'>" // Link Haus
-				."\n\t\t<a title='Daten zum Geb&auml;ude-Objekt' href='alkishaus.php?gkz=".$gkz."&amp;gmlid=".$ggml;
-				if ($showkey) {echo "&amp;showkey=j";}
-				echo "'>Haus&nbsp;<img src='ico/Haus.png' width='16' height='16' alt=''></a>"
-			."\n\t</td>"
-		."\n</tr>";
-	} // Ende GebÃ€ude
-
-	// Footer
-	if ($gebnr == 0) {
-		echo "\n</table>"
-		."<p class='err'><br>Keine Geb&auml;ude auf diesem Flurst&uuml;ck.<br>&nbsp;</p>";
-		//if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".$sqlg."<br>$1 = gml_id = '".$gmlid."'</p>";}
-	} else {
-		echo "\n<tr>"
-			."\n\t<td>Summe:</td>"
-			."\n\t<td class='fla sum' title='von Geb&auml;uden &uuml;berbaute Fl&auml;che des Flurst&uuml;cks'>".number_format($gebflsum,0,",",".")."&nbsp;&nbsp;&nbsp;&nbsp;m&#178;</td>"
-			."\n\t<td colspan='6'>&nbsp;</td>"
-		."\n</tr>"
+}
+// Footer GebÃ€ude
+if ($gebnr === 0) {
+	echo "<p><br>Kein Geb&auml;ude auf diesem Flurst&uuml;ck.<br>&nbsp;</p>";
+	//if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".$sqlg."<br>$1 = gml_id = '".$gmlid."'</p>";}
+} else {
+	echo "\n<tr>"
+		."\n\t<td>Summe:</td>"
+		."\n\t<td class='fla sum' title='von Geb&auml;uden &uuml;berbaute Fl&auml;che des Flurst&uuml;cks'>".number_format($gebflsum,0,",",".")."&nbsp;&nbsp;&nbsp;&nbsp;m&#178;</td>"
+		."\n\t<td colspan='6'>&nbsp;</td>"
+	."\n</tr>"
 	."\n</table>";
 	$unbebaut = number_format(($flstflaeche - $gebflsum),0,",",".") . " m&#178;";
@@ -265,4 +318,240 @@
 }
 pg_free_result($resg);
+
+// B a u w e r k e
+
+// Konstanten fÃŒr Sortierung und Gruppierung
+$btyp_verkehr=1; $btyp_gewaesser=2; $btyp_sonst=3; $btyp_indu=4; $btyp_sport=5;
+$btyp_leitg=6; $btyp_trans=7; $btyp_turm=8; $btyp_vorrat=9;
+
+// Tabllen-Alias, 2stellig. 1. Stelle: f_=FlurstÃŒck, b_=Bauwerk, k_=Key = SchlÃŒsseltabelle. // 2. Stelle: wie Konstante
+
+// 1 -V e r k e h r
+$sqlb="SELECT ".$btyp_verkehr." AS bwtyp, b1.gml_id, 
+ b1.bauwerksfunktion, k1.beschreibung AS bezeichner, k1.dokumentation AS bfktd, b1.bezeichnung, b1.name, NULL AS gehoertzu, 
+ round(st_area(b1.wkb_geometry)::numeric,2) AS gebflae, round(st_area(ST_Intersection(b1.wkb_geometry,f1.wkb_geometry))::numeric,2) AS schnittflae, 
+ st_within(b1.wkb_geometry,f1.wkb_geometry) as drin, GeometryType(b1.wkb_geometry) as bgeotyp 
+ FROM ax_flurstueck f1 
+ JOIN ax_bauwerkimverkehrsbereich b1 ON st_intersects(b1.wkb_geometry,f1.wkb_geometry) = true
+ LEFT JOIN ax_bauwerksfunktion_bauwerkimverkehrsbereich k1 ON b1.bauwerksfunktion = k1.wert 
+ WHERE f1.gml_id = $1 AND f1.endet IS NULL AND b1.endet IS NULL ";
+// 2 - G e w Ã€ s s e r
+$sqlb.="UNION
+ SELECT ".$btyp_gewaesser." AS bwtyp, b2.gml_id, b2.bauwerksfunktion, ug.beschreibung AS bezeichner, ug.dokumentation AS bfktd, 
+ b2.bezeichnung, b2.name, NULL AS gehoertzu, 
+ round(st_area(b2.wkb_geometry)::numeric,2) AS gebflae, round(st_area(ST_Intersection(b2.wkb_geometry,f2.wkb_geometry))::numeric,2) AS schnittflae, 
+ st_within(b2.wkb_geometry,f2.wkb_geometry) as drin, GeometryType(b2.wkb_geometry) as bgeotyp 
+ FROM ax_flurstueck f2 
+ JOIN ax_bauwerkimgewaesserbereich b2 ON st_intersects(b2.wkb_geometry,f2.wkb_geometry) = true
+ LEFT JOIN ax_bauwerksfunktion_bauwerkimgewaesserbereich ug ON b2.bauwerksfunktion = ug.wert 
+ WHERE f2.gml_id = $1 AND f2.endet IS NULL AND b2.endet IS NULL ";
+// 3 - S o n s t i g e  Bauwerke
+$sqlb.="UNION
+ SELECT ".$btyp_sonst." AS bwtyp, b3.gml_id, b3.bauwerksfunktion, k3.beschreibung AS bezeichner, k3.dokumentation AS bfktd, 
+ b3.bezeichnung, b3.name, b3.gehoertzu, 
+ round(st_area(b3.wkb_geometry)::numeric,2) AS gebflae, round(st_area(ST_Intersection(b3.wkb_geometry,f3.wkb_geometry))::numeric,2) AS schnittflae, 
+ st_within(b3.wkb_geometry,f3.wkb_geometry) as drin, GeometryType(b3.wkb_geometry) as bgeotyp 
+ FROM ax_flurstueck f3 
+ JOIN ax_sonstigesbauwerkodersonstigeeinrichtung b3 ON st_intersects(b3.wkb_geometry,f3.wkb_geometry) = true
+ LEFT JOIN ax_bauwerksfunktion_sonstigesbauwerkodersonstigeeinrichtun k3 ON b3.bauwerksfunktion = k3.wert 
+ WHERE f3.gml_id = $1 AND f3.endet IS NULL AND b3.endet IS NULL ";
+// 4 - Bauwerk oder Anlage fÃŒr  I n d u s t r i e  und Gewerbe
+$sqlb.="UNION
+ SELECT ".$btyp_indu." AS bwtyp, b4.gml_id, b4.bauwerksfunktion, k4.beschreibung AS bezeichner, k4.dokumentation AS bfktd, 
+ b4.bezeichnung, b4.name, NULL AS gehoertzu, 
+ round(st_area(b4.wkb_geometry)::numeric,2) AS gebflae, round(st_area(ST_Intersection(b4.wkb_geometry,f4.wkb_geometry))::numeric,2) AS schnittflae, 
+ st_within(b4.wkb_geometry,f4.wkb_geometry) as drin, GeometryType(b4.wkb_geometry) as bgeotyp 
+ FROM ax_flurstueck f4 
+ JOIN ax_bauwerkoderanlagefuerindustrieundgewerbe b4 ON st_intersects(b4.wkb_geometry,f4.wkb_geometry) = true
+ LEFT JOIN ax_bauwerksfunktion_bauwerkoderanlagefuerindustrieundgewer k4 ON b4.bauwerksfunktion = k4.wert 
+ WHERE f4.gml_id = $1 AND f4.endet IS NULL AND b4.endet IS NULL ";
+// 5 - Bauwerk oder Anlage fÃŒr  S p o r t , Freizeit und Erholung
+$sqlb.="UNION
+ SELECT ".$btyp_sport." AS bwtyp, b5.gml_id, b5.bauwerksfunktion, k5.beschreibung AS bezeichner, k5.dokumentation AS bfktd, 
+ NULL AS bezeichnung, b5.name, NULL AS gehoertzu, 
+ round(st_area(b5.wkb_geometry)::numeric,2) AS gebflae, round(st_area(ST_Intersection(b5.wkb_geometry,f5.wkb_geometry))::numeric,2) AS schnittflae, 
+ st_within(b5.wkb_geometry,f5.wkb_geometry) as drin, GeometryType(b5.wkb_geometry) as bgeotyp 
+ FROM ax_flurstueck f5 
+ JOIN ax_bauwerkoderanlagefuersportfreizeitunderholung b5 ON st_intersects(b5.wkb_geometry,f5.wkb_geometry) = true
+ LEFT JOIN ax_bauwerksfunktion_bauwerkoderanlagefuersportfreizeitunde k5 ON b5.bauwerksfunktion = k5.wert 
+ WHERE f5.gml_id = $1 AND f5.endet IS NULL AND b5.endet IS NULL ";
+// 6 - L e i t u n g
+$sqlb.="UNION
+ SELECT ".$btyp_leitg." AS bwtyp, b6.gml_id, b6.bauwerksfunktion, k6.beschreibung AS bezeichner, k6.dokumentation AS bfktd, 
+ NULL AS bezeichnung, b6.name, NULL AS gehoertzu, 
+ round(st_area(b6.wkb_geometry)::numeric,2) AS gebflae, round(st_area(ST_Intersection(b6.wkb_geometry,f6.wkb_geometry))::numeric,2) AS schnittflae, 
+ st_within(b6.wkb_geometry,f6.wkb_geometry) as drin, GeometryType(b6.wkb_geometry) as bgeotyp 
+ FROM ax_flurstueck f6 
+ JOIN ax_leitung b6 ON st_intersects(b6.wkb_geometry,f6.wkb_geometry) = true
+ LEFT JOIN ax_bauwerksfunktion_leitung k6 ON b6.bauwerksfunktion = k6.wert 
+ WHERE f6.gml_id = $1 AND f6.endet IS NULL AND b6.endet IS NULL ";
+// 7 - T r a n s p o r t a n l a g e
+$sqlb.="UNION
+ SELECT ".$btyp_trans." AS bwtyp, b7.gml_id, b7.bauwerksfunktion, k7.beschreibung AS bezeichner, k7.dokumentation AS bfktd, 
+ NULL AS bezeichnung, NULL AS name, NULL AS gehoertzu, 
+ round(st_area(b7.wkb_geometry)::numeric,2) AS gebflae, round(st_area(ST_Intersection(b7.wkb_geometry,f7.wkb_geometry))::numeric,2) AS schnittflae, 
+ st_within(b7.wkb_geometry,f7.wkb_geometry) as drin, GeometryType(b7.wkb_geometry) as bgeotyp 
+ FROM ax_flurstueck f7 
+ JOIN ax_transportanlage b7 ON st_intersects(b7.wkb_geometry,f7.wkb_geometry) = true
+ LEFT JOIN ax_bauwerksfunktion_transportanlage k7 ON b7.bauwerksfunktion = k7.wert 
+ WHERE f7.gml_id = $1 AND f7.endet IS NULL AND b7.endet IS NULL ";
+// 8 - T u r m  (Sonderfall Array)
+$sqlb.="UNION
+ SELECT ".$btyp_turm." AS bwtyp, b8.gml_id, k8.wert AS bauwerksfunktion, k8.beschreibung AS bezeichner, k8.dokumentation AS bfktd, 
+ NULL AS bezeichnung, b8.name, NULL AS gehoertzu, 
+ round(st_area(b8.wkb_geometry)::numeric,2) AS gebflae, round(st_area(ST_Intersection(b8.wkb_geometry,f8.wkb_geometry))::numeric,2) AS schnittflae, 
+ st_within(b8.wkb_geometry,f8.wkb_geometry) as drin, GeometryType(b8.wkb_geometry) as bgeotyp 
+ FROM ax_flurstueck f8 
+ JOIN ax_turm b8 ON st_intersects(b8.wkb_geometry,f8.wkb_geometry) = true
+ LEFT JOIN ax_bauwerksfunktion_turm k8 ON k8.wert =ANY(b8.bauwerksfunktion)
+ WHERE f8.gml_id = $1 AND f8.endet IS NULL AND b8.endet IS NULL ";
+// 9 -  V o r r a t s b e h Ã€ l t e r ,  S p e i c h e r b a u w e r k
+$sqlb.="UNION
+ SELECT ".$btyp_vorrat." AS bwtyp, b9.gml_id, b9.bauwerksfunktion, k9.beschreibung AS bezeichner, k9.dokumentation AS bfktd, 
+ NULL AS bezeichnung, b9.name, NULL AS gehoertzu, 
+ round(st_area(b9.wkb_geometry)::numeric,2) AS gebflae, round(st_area(ST_Intersection(b9.wkb_geometry,f9.wkb_geometry))::numeric,2) AS schnittflae, 
+ st_within(b9.wkb_geometry,f9.wkb_geometry) as drin, GeometryType(b9.wkb_geometry) as bgeotyp 
+ FROM ax_flurstueck f9 
+ JOIN ax_vorratsbehaelterspeicherbauwerk b9 ON st_intersects(b9.wkb_geometry,f9.wkb_geometry) = true
+ LEFT JOIN ax_bauwerksfunktion_vorratsbehaelterspeicherbauwerk k9 ON b9.bauwerksfunktion = k9.wert 
+ WHERE f9.gml_id = $1 AND f9.endet IS NULL AND b9.endet IS NULL ";
+
+// Generell ...
+$sqlb.="ORDER BY bwtyp, schnittflae DESC;";
+
+$v=array($gmlid);
+$resb=pg_prepare("", $sqlb);
+$resb=pg_execute("", $v);
+if (!$resb) {
+	echo "\n<p class='err'>Fehler bei Bauwerke-Verschneidung.</p>";
+	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlb)."</p>";}
+	if ($debug > 1) {echo "<p class='dbg'>Fehler:".pg_result_error($resb)."</p>";}
+}
+$baunr=0; // ZÃ€hler
+$bauflsum=0; // FlÃ€chensumme
+$gwbwtyp=0; // Gruppen-Wechsel Bauwerks-Typ
+
+while($rowb = pg_fetch_assoc($resb)) {
+	$baunr++;
+	$btyp=$rowb["bwtyp"]; // Tabelle
+	$bgml=$rowb["gml_id"];
+	$bauflsum=$bauflsum + $rowb["schnittflae"];
+	$bbez=htmlentities($rowb["bezeichnung"], ENT_QUOTES, "UTF-8");
+	$bfktk=htmlentities($rowb["bauwerksfunktion"], ENT_QUOTES, "UTF-8");
+	$bfktv=htmlentities($rowb["bezeichner"], ENT_QUOTES, "UTF-8");
+	$bfktd=htmlentities($rowb["bfktd"], ENT_QUOTES, "UTF-8");
+	$bnam=htmlentities($rowb["name"], ENT_QUOTES, "UTF-8");
+	$bgeb=$rowb["gehoertzu"];
+	$drin=$rowb["drin"];
+	$bgeotyp=$rowb["bgeotyp"];
+
+	// Lage des Bauwerks zum FlurstÃŒck
+	if ($bgeotyp === "LINESTRING") {
+		if ($drin === "t") {
+			$bstyle="gin";
+		} else {
+			$bstyle="gtl";
+		}
+		$f1="&nbsp;";
+		$f2="Linie";
+	} elseif ($bgeotyp === "POINT") {
+		if ($drin === "t") {
+			$bstyle="gin";
+		} else {
+			$bstyle="gtl";
+		}
+		$f1="&nbsp;";
+		$f2="Punkt";		
+	} else { // FlÃ€che / Multi-
+		if ($drin === "t") { // komplett IM FlurstÃŒck
+			$f1=$rowb["schnittflae"]." m&#178;";
+			$f2="&nbsp;";
+			$bstyle="gin"; // siehe .css
+		} else {
+			if ($rowb["schnittflae"] === "0.00") { // nur angrenzend
+				$bstyle="gan";
+				$f1="&nbsp;";
+				$f2="angrenzend";
+			} else { // Teile auf FlurstÃŒck
+				$bstyle="gtl";
+				$f1=$rowb["schnittflae"]." m&#178;";
+				$f2="(von ".$rowb["gebflae"]." m&#178;)";
+			}
+		}	
+	}
+
+	// Gruppenwechsel Bauwerks-Typ (Quell-Tabelle) - Zwischen-Ãberschrift
+	If ($btyp != $gwbwtyp) {
+		$gwbwtyp = $btyp;
+		if ($baunr === 1) {bauw_tab_head();} // Tab.-Kopf
+		switch ($btyp) {
+			case $btyp_verkehr:
+				$btyptitle='Bauwerk im Verkehrsbereich'; break;
+			case $btyp_gewaesser:
+				$btyptitle='Bauwerk im GewÃ€sserbereich'; break;
+			case $btyp_sonst: 
+				$btyptitle='Sonstiges Bauwerk oder sonstige Einrichtung'; break;
+			case $btyp_indu:
+				$btyptitle="Bauwerk oder Anlage fÃŒr Industrie und Gewerbe"; break;
+			case $btyp_sport:
+				$btyptitle="Bauwerk oder Anlage fÃŒr Sport, Freizeit und Erholung"; break;
+			case $btyp_leitg:
+				$btyptitle="Leitung"; break;
+			case $btyp_trans:
+				$btyptitle="Transportanlage"; break;
+			case $btyp_turm:
+				$btyptitle="Turm"; break;
+			case $btyp_vorrat:
+				$btyptitle="VorratsbehÃ€lter, Speicherbauwerk"; break;
+			default:
+				$btyptitle='Fehler'; break;
+		}
+		echo "<tr><td colspan=3></td><td colspan=2 class='gw'>".$btyptitle."</td></tr>"; // ++ Symbol?
+	}
+
+	echo "\n<tr>";
+		echo "\n\t<td>";
+		if ($bbez != "") {echo "<span title='Bezeichnung'>".$bbez."</span> ";}
+		if ($bnam != "") {echo "<span title='Name'>".$bnam."</span> ";}
+		echo "</td>";
+		echo "\n\t<td class='fla'>".$f1."</td>"
+		."\n\t<td class='".$bstyle."'>".$f2."</td>"; // FlÃ€chenangaben
+		echo "\n\t<td>";
+		if ($showkey) {echo "<span class='key'>(".$bfktk.")</span>&nbsp;";} // Bauwerksfunktion
+		echo "<span title='".$bfktd ."'>".$bfktv."</span>";
+		echo "</td>";
+
+		// Lage / Haus (nur bei Typ 3 sonstige)
+		echo "\n\t<td class='nwlink noprint'>"; // Link
+		if ($bgeb != "") { // gehÃ¶rt zu GebÃ€ude
+		//	bw_gz_lage($bgeb); // Function: Lage (Adresse) ausgeben
+			echo "\n\t\t<a title='gehÃ¶rt zu' href='alkishaus.php?gkz=".$gkz."&amp;gmlid=".$bgeb;
+			if ($showkey) {echo "&amp;showkey=j";}
+			echo "'>Haus&nbsp;<img src='ico/Haus.png' width='16' height='16' alt=''></a>";
+		}
+		echo "\n\t</td>";
+
+		// Bauwerk Details
+		echo "\n\t<td class='nwlink noprint'>"; // Link
+		echo "\n\t\t<a title='Bauwerksdaten' href='alkisbauwerk.php?gkz=".$gkz."&amp;btyp=".$btyp."&amp;gmlid=".$bgml;
+		if ($showkey) {echo "&amp;showkey=j";}
+		echo "'>Bauwerk&nbsp;<img src='ico/Haus.png' width='16' height='16' alt=''></a>";  // +++ Icon fÃŒr Bauwerk schaffen +++
+		echo "\n\t</td>"
+	."\n</tr>";
+}
+
+// Footer Bauwerk
+if ($baunr === 0) {
+	echo "\n<p>Kein Bauwerk auf diesem Flurst&uuml;ck.</p><br>";
+	// if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".$sqlb."<br>$1 = gml_id = '".$gmlid."'</p>";}
+} else {
+	echo "\n<tr>"
+		."\n\t<td>Summe:</td>"
+		."\n\t<td class='fla sum' title='von Bauwerken &uuml;berbaute Fl&auml;che des Flurst&uuml;cks'>".number_format($bauflsum,0,",",".")."&nbsp;&nbsp;&nbsp;&nbsp;m&#178;</td>"
+		."\n\t<td colspan='6'>&nbsp;</td>"
+	."\n</tr>"
+	."\n</table>\n";
+}
+pg_free_result($resb);
 ?>
  
@@ -273,5 +562,5 @@
 </div>
 
-<?php footer($gmlid, $_SERVER['PHP_SELF']."?", ""); ?>
+<?php footer($gmlid, selbstverlinkung()."?", ""); ?>
 
 </body>
Index: trunk/info/info/alkisn/alkislage.php
===================================================================
--- trunk/info/info/alkisn/alkislage.php	(revision 419)
+++ trunk/info/info/alkisn/alkislage.php	(revision 422)
@@ -7,10 +7,8 @@
 	Version:
 	2016-02-24 Version fuer norGIS-ALKIS-Import
-	2016-03-14 Korrekturen
-	2016-11-29 HTML5, Gemeinsam genutzte Datenbanken ermÃ¶glichen
-	2017-06-08 Validierung Eingabeparameter, gestreifte Tabelle, Feinkorrekturen
-	2017-10-09 Sauber filtern auf endet IS NULL
-	2018-04-23 &nodebug
-	2018-11-09 Umstellung Full-Schema
+	....
+	2020-02-20 Authentifizierung ausgelagert in Function darf_ich()
+	2020-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF']
+	2020-12-15 Input-Validation und Strict Comparisation (===)
 
 	ToDo:
@@ -20,4 +18,5 @@
 	Mit FlÃ€chen-Verschneidung auch weitere FS anzeigen?
 */
+ini_set("session.cookie_httponly", 1);
 session_start();
 $showkey="n"; $nodebug=""; // Var. aus Parameter initalisieren
@@ -25,14 +24,21 @@
 
 // strikte Validierung aller Parameter
-if (!isset($gmlid) or !preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
-if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
+if (isset($gmlid)) {
+	if (!preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
+} else {
+	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}$#', $showkey)) {die ("Eingabefehler showkey");}
-if ($showkey == "j") {$showkey=true;} else {$showkey=false;}
+if ($showkey === "j") {$showkey=true;} else {$showkey=false;}
 if (!preg_match('#^[m|p|o]{1}$#', $ltyp)) {die ("Eingabefehler ltyp");}
 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";
 
 switch ($ltyp) {
@@ -59,7 +65,10 @@
 <body>
 END;
+
+$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.
 // 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_alkislage.php'");
@@ -94,5 +103,5 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Lagebezeichnung.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = gml_id = '".$gmlid."'</p>";}
+	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
 }
 
@@ -117,5 +126,5 @@
 			$kennz.=$hsnr;
 			$untertitel="Hauptgeb&auml;ude mit Hausnummer";
-			echo "\n<p class='lage'>ALKIS Lagebezeichnung mit Hausnummer ".$kennz."&nbsp;</p>"; // Balken
+			echo "\n<p class='balken lage'>ALKIS Lagebezeichnung mit Hausnummer ".$kennz."&nbsp;</p>"; // Balken
 			$osub="";
 		break;
@@ -125,5 +134,5 @@
 			$kennz.=$pseu."-".$lfd;
 			$untertitel="NebengebÃ€ude mit laufender Nummer (Lagebezeichnung mit Pseudonummer)";
-			echo "\n<p class='lage'>ALKIS Lagebezeichnung NebengebÃ€ude ".$kennz."&nbsp;</p>"; // Balken
+			echo "\n<p class='balken lage'>ALKIS Lagebezeichnung NebengebÃ€ude ".$kennz."&nbsp;</p>"; // Balken
 			$osub="";
 		break;
@@ -135,10 +144,10 @@
 				$kennz=" - ".$unver;
 				$untertitel="Gewanne (unverschl&uuml;sselte Lage)";
-				echo "\n<p class='lage'>ALKIS Lagebezeichnung Ohne Hausnummer ".$kennz."&nbsp;</p>"; // Balken
+				echo "\n<p class='balken lage'>ALKIS Lagebezeichnung Ohne Hausnummer ".$kennz."&nbsp;</p>"; // Balken
 			} else {
 				$osub="s"; // Sub-Typ Strasse (ohne HsNr)
 				$kennz.=$unver;
 				$untertitel="Stra&szlig;e ohne Hausnummer";
-				echo "\n<p class='lage'>ALKIS Lagebezeichnung Ohne Hausnummer ".$kennz."&nbsp;</p>"; // Balken
+				echo "\n<p class='balken lage'>ALKIS Lagebezeichnung Ohne Hausnummer ".$kennz."&nbsp;</p>"; // Balken
 			}
 		break;
@@ -147,5 +156,5 @@
 	echo "\n<p class='err'>Fehler! Kein Treffer fuer Lagebezeichnung mit gml_id='".$gmlid."'</p>";
 	if ($debug > 2) {
-		echo "\n<p class='err'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = gml_id = '".$gmlid."'</p>";
+		echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";
 	}
 	echo "\n</body>\n</html>";
@@ -174,5 +183,5 @@
 				break;
 				case "o": //"Ohne HsNr"
-					if ($osub == "g") {
+					if ($osub === "g") {
 						echo "\n\t\t\t<td class='head'>unverschl&uuml;sselte Lage</td>";
 					}
@@ -200,5 +209,5 @@
 				echo "\n\t\t\t<td title='Stra&szlig;e'>";
 				if ($showkey and $osub != "g") {echo "<span class='key'>".$lage."</span><br>";}
-				if ($ltyp == "o") {
+				if ($ltyp === "o") {
 					echo "<span class='wichtig'>".$snam."</span>";
 				} else {
@@ -217,5 +226,5 @@
 				break;
 				case "o":
-					if ($osub == "g") {
+					if ($osub === "g") {
 						echo "\n\t\t\t<td title='Gewanne'><span class='wichtig'>".$unver."</span></td>";
 					}
@@ -243,5 +252,5 @@
 // ax_Flurstueck  >zeigtAuf>  ax_LagebezeichnungOhneHausnummer
 // ++ auch FlÃ€chenverschneidung?
-if ($ltyp <> "p") { // Pseudonummer linkt nur GebÃ€ude
+if ($ltyp != "p") { // Pseudonummer linkt nur GebÃ€ude
 	echo "\n\n<a id='fs'></a>\n<h3><img src='ico/Flurstueck.png' width='16' height='16' alt=''> Flurst&uuml;cke</h3>"
 	."\n<p>mit dieser Lagebezeichnung.</p>";
@@ -261,5 +270,5 @@
 	if (!$resf) {
 		echo "\n<p class='err'>Fehler bei Flurst&uuml;ck.</p>";
-		if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = gml_id = '".$gmlid."'</p>";}	
+		if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}	
 	}
 	echo "\n<table class='fs'>"
@@ -303,10 +312,10 @@
 // L A G E
 // andere Lage mit gleicher Hausnummer suchen
-if ($ltyp <> "o") { // nicht bei Gewanne (Ohne HsNr)
+if ($ltyp != "o") { // nicht bei Gewanne (Ohne HsNr)
 	echo "\n\n<a id='lage'></a>\n<h3><img src='ico/Lage_mit_Haus.png' width='16' height='16' alt=''> Lage</h3>"
 	."\n<p>Andere Lagebezeichnungen zur gleichen Hausnummer.</p>";
 	$whereclaus="WHERE land= $1 AND regierungsbezirk= $2 AND kreis= $3 AND gemeinde= $4 AND lage= $5 ";
 
-	$url=$_SERVER['PHP_SELF']."?gkz=".$gkz; // Basis
+	$url=selbstverlinkung()."?gkz=".$gkz; // Basis
 	if ($showkey) {$url.="&amp;showkey=j";}
 	$url.="&amp;gmlid=";
@@ -323,6 +332,6 @@
 			$res = pg_execute("", $v);
 			if (!$res) {
-				echo "\n<p class='err'>Fehler bei Nebengeb&auml;ude.<br>".$sql."</p>";
-				if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."</p>";}
+				echo "\n<p class='err'>Fehler bei Nebengeb&auml;ude.</p>";
+				if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."</p>";} // 7 $-Parameter
 			}
 			$neb=0;
@@ -331,5 +340,5 @@
 				$neb++;
 			}
-			if ($neb == 0) {echo "keine";}
+			if ($neb === 0) {echo "keine";}
 			echo "</p>";
 		break;
@@ -349,5 +358,5 @@
 				$hg++;
 			}
-			if ($hg == 0) {echo "&nbsp;Kein Hauptgeb&auml;ude gefunden.";}
+			if ($hg === 0) {echo "&nbsp;Kein Hauptgeb&auml;ude gefunden.";}
 			echo "</p>";
 
@@ -360,5 +369,5 @@
 			if (!$res) {
 				echo "\n<p class='err'>Fehler bei Nebengeb&auml;ude.</p>";
-				if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."</p>";}			
+				if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."</p>";} // 7 $-Parameter		
 			}
 			$neb=0;
@@ -367,5 +376,5 @@
 				$neb++;
 			}
-			if ($neb == 0) {echo "keine";}
+			if ($neb === 0) {echo "keine";}
 			echo "</p>";
 		break;
@@ -374,5 +383,5 @@
 
 // G E B A E U D E
-if ($ltyp <> "o") { // OhneHsNr linkt nur Flurst.
+if ($ltyp != "o") { // OhneHsNr linkt nur Flurst.
 	echo "\n\n<a id='geb'></a>\n<h3><img src='ico/Haus.png' width='16' height='16' alt=''> Geb&auml;ude</h3>"
 	."\n<p>mit dieser Lagebezeichnung.</p>";
@@ -396,5 +405,5 @@
 	if (!$res) {
 		echo "\n<p class='err'>Fehler bei Geb&auml;ude.</p>";
-		if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = gml_id = '".$gmlid."'</p>";}
+		if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
 	}
 	echo "\n<table class='geb'>"
@@ -444,5 +453,5 @@
 </div>
 
-<?php footer($gmlid, $_SERVER['PHP_SELF']."?", "&amp;ltyp=".$ltyp); ?>
+<?php footer($gmlid, selbstverlinkung()."?", "&amp;ltyp=".$ltyp); ?>
 
 </body>
Index: trunk/info/info/alkisn/alkis_conf_location.php
===================================================================
--- trunk/info/info/alkisn/alkis_conf_location.php	(revision 419)
+++ trunk/info/info/alkisn/alkis_conf_location.php	(revision 422)
@@ -3,8 +3,7 @@
 	Pfad zur Konfigurationsdatei der ALKIS-Auskunft.
 	Die Conf-Datei sollte aus Sicherheitsgruenden nicht unterhalb des Web-Root-Verzeichnisses liegen.
-
-	Version:
-	2016-02-23 Version fuer norGIS-ALKIS-Import, keine PostNAS-Versionsnummer im DB-Namen
+Version:
+	2020-10-13 Syntax ohne Klammern, rename
 */
-require_once("/opt/gdi/conf/alkisn_conf.php"); // Nicht unter Web-Root speichern
+	include "/opt/gdi/conf/alkis_conf.php";
 ?>
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>
Index: trunk/info/info/alkisn/alkisgsnw.php
===================================================================
--- trunk/info/info/alkisn/alkisgsnw.php	(revision 419)
+++ trunk/info/info/alkisn/alkisgsnw.php	(revision 422)
@@ -8,4 +8,9 @@
 	2018-05-03 Neues Modul "gsnw" abgeleitet aus "fsnw"
 	2018-11-09 Umstellung Full-Schema
+	2020-02-20 Authentifizierung ausgelagert in Function darf_ich()
+	2020-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF']
+	2020-12-15 Input-Validation und Strict Comparisation (===)
+
+++ ToDo: Den Fall berÃŒcksichtigen, dass die Buchung vorhanden ist, aber das GB nicht (ModellschwÃ€che). Meldungen ausgeben.
 */
 
@@ -17,4 +22,6 @@
 	$sqlgs="SELECT s.gml_id, b.bezirk, b.buchungsblattnummermitbuchstabenerweiterung AS blatt, s.laufendenummer, s.buchungsart "
 		."FROM ax_buchungsstelle s JOIN ax_buchungsblatt b ON s.istbestandteilvon=b.gml_id ";
+	// Falls das Buchungsblatt fehlt (ModellschwÃ€che) wÃ€re ein LEFT JOIN hier nÃŒtzlich. Das Fehlen aber kontrollieren! ++
+
 	if ($gskennz == '') { // normaler Link ÃŒber gmlid
 		$sqlgs.="WHERE s.gml_id= $1 ";
@@ -23,5 +30,5 @@
 		$arr=explode("-", $gskennz, 4); // zerlegen
 		$zbez=trim($arr[0]); // Bezirk
-		if (strlen($zbez) == 6) {
+		if (strlen($zbez) === 6) {
 			$land=substr($zbez, 0, 2);
 			$zbez=substr($zbez, 2, 4);
@@ -73,5 +80,5 @@
 		$gmlid_d=$rowd["gml_id"];
 	}
-	if ($cntd == 0) { // KEINE dienende BS
+	if ($cntd === 0) { // KEINE dienende BS
 		$gmlid_d="";
 	} elseif ($cntd > 1) { // Problem: mehrere dienende BS
@@ -93,15 +100,14 @@
 	$gd=$gh; // dienend
 	$gr=$gd; // root
-	//$steps=0; // wie oft?
 	while($gd != "") {
-		//$steps++;
 		$gr=$gd; // sichern
 		$gd=bs_dienend($gh); // an?
 		$gh=$gd; // fuer weitere Loop
 	}
-	//$steps=$steps -1; // erfolgreiche Suchen
 	return $gr;
 }
 
+// H i e r   S t a r t
+ini_set("session.cookie_httponly", 1);
 session_start();
 $showkey="n"; $nodebug="";
@@ -118,14 +124,18 @@
 	} else {
 		$gskennz='';
-	}
-}
-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}$#', $showkey)) {die ("Eingabefehler showkey");}
-if ($showkey == "j") {$showkey=true;} else {$showkey=false;}
+if ($showkey === "j") {$showkey=true;} else {$showkey=false;}
 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>
@@ -145,5 +155,7 @@
 <body>
 <?php
-if ($nodebug == "j") {$debug=0;} 
+$erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
+
+if ($nodebug === "j") {$debug=0;} 
 $con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisgsnw.php'");
 if (!$con) echo "\n<p class='err'>Fehler beim Verbinden der DB</p>";
@@ -163,5 +175,5 @@
 	}
 }
-echo "<p class='gskennz'>ALKIS Grundst&uuml;ck ".$gsbez."-".rtrim($gsblatt)."-".$gslfdnr."&nbsp;</p>\n\n<h2>Grundst&uuml;ck</h2>"; // Balken
+echo "<p class='balken gskennz'>ALKIS Grundst&uuml;ck ".$gsbez."-".rtrim($gsblatt)."-".$gslfdnr."&nbsp;</p>\n\n<h2>Grundst&uuml;ck</h2>"; // Balken
 
 if ($gerooted) {
@@ -176,11 +188,11 @@
 		."\n\t<td class='head nwlink noprint' title='Verlinkung zu anderen Nachweis-Arten und verbundenen Objekten'>weitere Auskunft</td>"
 	."\n</tr>";
-	//+++ Lage oder Nutzung zum FS in eine zus. Spalte oder Zeile?
-	//+++ Tabelle hat noch Platz, SQL in der Loop oder Subquery wÃ€re mÃ¶glich, weil i.d.R. nur wenige FS je GS gebucht sind.
+	//++ Lage oder Nutzung zum FS in eine zus. Spalte oder Zeile?
+	//++ Tabelle hat noch Platz, SQL in der Loop oder Subquery wÃ€re mÃ¶glich, weil i.d.R. nur wenige FS je GS gebucht sind.
 
 	$sqlfs="SELECT g.gemarkungsnummer, g.bezeichnung, f.gml_id, f.flurnummer, f.zaehler, f.nenner, f.amtlicheflaeche 
 	FROM ax_flurstueck f LEFT JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer 
 	WHERE f.istgebucht = $1 AND f.endet IS NULL AND g.endet IS NULL ";
-	if ($filtgem == '' ) { // ungefiltert
+	if ($filtgem === '' ) { // ungefiltert
 		$v=array($gmlid);
 	} else {
@@ -222,5 +234,5 @@
 	}
 	pg_free_result($resfs);
-	if ($j == 0) {echo "\n<tr class='unp'>\n\t<td colspan='5'><p class='warn'>Keine Flurst&uuml;cke im berechtigten Bereich.</p></td>\n</tr>";}
+	if ($j === 0) {echo "\n<tr class='unp'>\n\t<td colspan='5'><p class='warn'>Keine Flurst&uuml;cke im berechtigten Bereich.</p></td>\n</tr>";}
 	echo "\n</table>";
 } else { // konnte nicht bis zur Basis aufsteigen
@@ -236,5 +248,5 @@
 echo "\n<table class='outer'>";
 	$stufe=1;
-	$gezeigt=buchung_anzg($gmlid, "j", false, "", 2);
+	$gezeigt = buchung_anzg($gmlid, "j", false, "", 2);
 	$anzber=ber_bs_zaehl($gmlid);
 	$verf_next = array($gmlid);
@@ -257,4 +269,5 @@
 	}
 echo "\n</table>\n\n";
+//if ($debug > 1) {echo "<p class='dbg'>Buchung gezeigt = ".$gezeigt."</p>";}
 
 pg_close($con);
@@ -272,5 +285,5 @@
 echo "&nbsp;\n</div>";
 
-footer($gmlid, $_SERVER['PHP_SELF']."?", "");
+footer($gmlid, selbstverlinkung()."?", "");
 ?>
 </body>
Index: trunk/info/info/alkisn/alkisauszug.css
===================================================================
--- trunk/info/info/alkisn/alkisauszug.css	(revision 419)
+++ trunk/info/info/alkisn/alkisauszug.css	(revision 422)
@@ -3,61 +3,59 @@
 
 	Version:
-	2010-09-21	Inlay
-	2010-09-30	body-width bei Print
-	2010-10-12	class p.fsd: margin statt position-relative, dann keine Scrollbar
-	2011-01-04	Spalte td.fla im fsnw
-	2011-01-26	einheitlich td padding-top 6px
-	2011-11-16	FS-Historie
-	2013-06-27	p.recht
-	2014-01-27	strasse, hsnr, Print-Balken
-	2014-09-15	PostNAS 0.8: p.cnt
-	2014-12-30	Neu: td.fsnr
-	2016-02-24	Umstellung norBIT-Struktur
-	2016-12-01	Stop-Meldung bei BerechtigungsprÃŒfung, Sortierspalten
-	2017-06-08	Tab-Zeilen-Farbe wechseln, Spaltenbreite td.flag, media screen
-	2017-06-09	ErlÃ€rung zu Haus: 2 Arten
-	2017-10-11	BodenschÃ€tzung
-	2017-10-17	td.nwlink min-width
-	2017-12-20	td.dbg
+	2010-09-21	
+	....
 	2018-04-23	Spaltenbreiten
 	2018-05-03	GS-Nachweis
+	2020-02-03	media screen body width
+	2021-03-08  Gruppenwechsel-ZwischenÃŒberschrift
+	2021-03-17	Balken von Bauwerk Farbe wie im WMS
 
-https://wiki.selfhtml.org/wiki/Grafik/Farbpaletten#Farbnamen
+	https://wiki.selfhtml.org/wiki/Grafik/Farbpaletten#Farbnamen
 */
 body	{background-color: #FEFFFE;}
-p, body	{font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
-	font-size: 10pt; color: #000033; margin-top: 2pt; margin-bottom: 2pt;}
+p, body	{font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 10pt; color: #000033; margin-top: 2pt; margin-bottom: 2pt;}
 
-/* Banner im Kopf (farbiger Balken), Farbcode fuer Nachweis-Art (gleiche Farbe wie Rahmen um das Kennzeichen) */
-p.fsausk,p.fskennz,p.fsei,p.fshis,p.gbkennz,p.gskennz,p.nakennz,p.geb,p.lage,p.strasse,p.recht {text-align: right; padding-top: 4px; padding-bottom: 4px; padding-right: 24px;}
-/* Balken-Farben individuell */
-p.fsausk	{background-color: teal; color: silver;}	/* Uebersichts-Seite Flurstuecks-Auskunft */
-p.fskennz,p.fsei{background-color: navy; color: silver;} /* Flurstuecks-Nachweis */
-p.fshis		{background-color: gray; color: white;}		/* Flurstuecks-Historie */
-p.gbkennz	{background-color: green; color: silver;}	/* Bestandsnachweis */
+/* Banner im Kopf (farbiger Balken) */
+p.balken	{text-align: right; padding-top: 4px; padding-bottom: 4px; padding-right: 24px;}
+
+	/* Farbcode individuell fÃŒr Nachweis-Art (gleiche Farbe wie Rahmen um Kennz.) */
+p.fsausk	{background-color: teal; color: silver;}			/* Uebersichts-Seite Flurstuecks-Auskunft */
+p.fskennz,p.fsei{background-color: navy; color: silver;}		/* Flurstuecks-Nachweis */
+p.fshis		{background-color: gray; color: white;}				/* Flurstuecks-Historie */
+p.gbkennz	{background-color: green; color: silver;}			/* Bestandsnachweis */
 p.gskennz	{background-color: LightGreen ; color: DimGray ;}	/* GrundstÃŒcksnachweis */
-p.nakennz	{background-color: maroon; color: silver;}	/* Personen- und Adressdaten */
-p.geb		{background-color: yellow; color: gray;}	/* Gebaeude zum FS */
-p.lage		{background-color: lime; color: gray;}		/* Lage/Adresse zum FS */
+p.nakennz	{background-color: maroon; color: silver;}			/* Personen- und Adressdaten */
+p.geb		{background-color: yellow; color: gray;}			/* Gebaeude zum FS */
+p.lage		{background-color: lime; color: gray;}				/* Lage/Adresse zum FS */
 p.strasse	{background-color: limegreen; color: slategray;}	/* Strasse */
-p.recht		{background-color: #F0F8FF; color: gray;}	/* Baurecht, Bodenneuordnung */
+p.recht		{background-color: #F0F8FF; color: gray;}			/* Baurecht, Bodenneuordnung */
+
+	/* in alkisbauwerk.php synchron zum Mapfile (WMS), 9 Layer-Gruppen */
+p.bauwerk1	{background-color: rgb(40,0,180); color: gray;}		/* 1 Bauwerk im Verkehrsbereich */
+p.bauwerk2	{background-color: rgb(0,160,246); color: gray;}	/* 2 Bauwerk im GewÃ€sserbereich */
+p.bauwerk3	{background-color: rgb(160,130,0); color: black;}	/* 3 Sonstiges Bauwerk oder sonstige Einrichtung */
+p.bauwerk4	{background-color: rgb(252,162,2); color: gray;}	/* 4 Bauwerk oder Anlage fÃŒr Industrie und Gewerbe */
+p.bauwerk5	{background-color: rgb(140,0,120); color: gray;}	/* 5 Bauwerk oder Anlage fÃŒr Sport, Freizeit und Erholung */
+p.bauwerk6	{background-color: rgb(220,10,10); color: black;}	/* 6 Leitung */
+p.bauwerk7	{background-color: rgb(10,180,10 ); color: gray;}	/* 7 Transportanlage */
+p.bauwerk8	{background-color: rgb(135,76,1); color: gray;}		/* 8 Turm */
+p.bauwerk9	{background-color: rgb(0,140,40); color: black;}	/* 9 VorratsbehÃ€lter, Speicherbauwerk */
 
 /* Format nach Inhalt */
-/* p.bezieh	{text-align: right; background: olive;	color: silver;} */ /* Beziehungen */
-p.fsd		{margin-left: 170px;}	/* Flst-Flaeche */
-p.gbl		{position: relative; left: 60px;}	/* Nam: Buchungsstelle*/
+p.fsd		{margin-left: 170px;}					/* Flst-Flaeche */
+p.gbl		{position: relative; left: 60px;}		/* Nam: Buchungsstelle*/
 p.zus		{margin: 2pt; padding: 2pt; border:1px dotted maroon; background: white;} /* Zusatz zum Eigent., gerahmt */
-p.avh		{font-style: italic; color: navy;}	/* Anteilsverhaeltnis */
+p.avh		{font-style: italic; color: navy;}		/* Anteilsverhaeltnis */
 p.ant		{font-style: italic; position: relative;} /* Anteil am FS  left: 12px;*/
-p.geig		{color: navy;}		/* GB-Nachw. Eigentuemer Name */
-p.gadr		{color: maroon; margin-top: 1pt;}	/* GB-Nachw. Eigentuemer Adresse */
+p.geig		{color: navy;}							/* GB-Nachw. Eigentuemer Name */
+p.gadr		{color: maroon; margin-top: 1pt;}		/* GB-Nachw. Eigentuemer Adresse */
 p.nwlink, td.nwlink {font-size: 7pt; text-align: right; margin-top: 0pt;}	/* Link zum Nachweis GB, FS, ..*/
-p.err		{font-size: 11px; color: red;}		/* Fehler -> Anwender */
+p.err		{font-size: 11px; color: red;}			/* Fehler -> Anwender */
 p.dbg, td.dbg{font-size: 10px; color: gray;}		/* Debug -> Entwickler */
-p.cnt		{font-size: 10px; color: gray;}		/* Counter, Zaehler */
-p.warn		{color: gray; font-style: italic;}	/* Warnung, Hinweis */
-p.ph		{color: gray;}						/* Platzhalter */
-p.erklk		{color: silver; font-size: 8pt;}	/* Haus: ErklÃ€rungen zur Kategorie */
-p.erkli		{color: grey; font-size: 8pt;}		/* Haus: ErklÃ€rungen zum Inhalt */
+p.cnt		{font-size: 10px; color: gray;}			/* Counter, Zaehler */
+p.warn		{color: gray; font-style: italic;}		/* Warnung, Hinweis */
+p.ph		{color: gray;}							/* Platzhalter */
+p.erklk		{color: silver; font-size: 8pt;}		/* Haus: ErklÃ€rungen zur Kategorie */
+p.erkli		{color: grey; font-size: 8pt;}			/* Haus: ErklÃ€rungen zum Inhalt */
 
 /* Links */
@@ -93,6 +91,6 @@
 table.kennzstra	{border: 2px solid  limegreen;  padding: 3px; margin: 0px;}	/* Strasse */
 
-/* volle Breite fuer verschiedene Zwecke */
-table.fs, table.nua, table.klas, table.eig, table.outer, table.geb {width: 100%;}
+/* fast volle Breite, fuer verschiedene Zwecke, aber kleiner als Body */
+table.fs, table.nua, table.klas, table.eig, table.outer, table.geb {width: 98%;} 
 
 td	{vertical-align: top; padding-top: 6px;}	/* ** Tabellenfelder ** */
@@ -101,28 +99,28 @@
 td.ll	{width: 140px;}	/* Liste Links */
 td.lr	{color: black; padding-left: 4px;}	/* Liste Rechts */
-td.re	{min-width: 80px; padding-right: 4px; text-align: right;} /* RechtsbÃŒndig */
-td.fla	{width: 110px; padding-right: 4px; text-align: right;} /* Flaechen rechtsbuendig (stellengerecht) */
-td.flag	{min-width: 110px; padding-right: 4px; text-align: right;} /* .. im GB-Bestandsnachweis erweiterbar */
-td.fsnr	{padding-right: 4px; text-align: right;} /* Flst.-Nr. rechtsbuendig */
+td.re	{min-width: 80px; padding-right: 4px; text-align: right;}	/* RechtsbÃŒndig */
+td.fla	{width: 110px; padding-right: 4px; text-align: right;}		/* Flaechen rechtsbuendig (stellengerecht) */
+td.flag	{min-width: 110px; padding-right: 4px; text-align: right;}	/* .. im GB-Bestandsnachweis erweiterbar */
+td.fsnr	{padding-right: 4px; text-align: right;}					/* Flst.-Nr. rechtsbuendig */
 td.key	{width:  35px; padding-right: 4px; padding-left: 4px;}
-/* Ertragsmesszahl der Bodenschaetzung
-td.emz	{width: 45px; padding-right: 4px; padding-left: 4px; text-align: right;} */
+/* td.emz	{width: 45px; padding-right: 4px; padding-left: 4px; text-align: right;} Ertragsmesszahl der Bodenschaetzung */
 td.kurz	{width: 26px; padding-left: 4px;}
-td.nanu	{width: 50px;}				/* Namensnummer */
+td.nanu	{width: 50px;}									/* Namensnummer */
 td.sond, p.sond	{font-size: 9pt; font-style: italic; background-color: white;
-		border: 1px dotted silver; padding: 6px;}	/* Sondereigentumsbeschreibung */
+		border: 1px dotted silver; padding: 6px;}		/* Sondereigentumsbeschreibung */
 td.nrap, p.nrap	{font-size: 9pt; font-style: italic; background-color: white;}	/* Nummer im Aufteilungsplan */
 td.fett	{font-weight: bold;}
-td.nwlink {min-width: 80px;}	/* Link zum Nachweis */
+td.nwlink {min-width: 80px;}							/* Link zum Nachweis */
 
-/* Kopfzeile, Spaltenueberschrift */
-td.head, td.heads{font-style: italic; padding-top: 2px;}	
-td.head	{border-bottom: 1px solid gray;}	
-td.heads	{border-bottom: 1px solid black;}	/* Kopf Sortierspalte(n) */
+/* Kopfzeile, SpaltenÃŒberschrift, GW-Zwischenzeile */
+td.head, td.heads, td.gw{font-style: italic; padding-top: 2px;}	
+td.head		{border-bottom: 1px solid gray;}	
+td.heads	{border-bottom: 1px solid black;}			/* Kopf Sortierspalte */
+td.gw		{background-color: WhiteSmoke;} 			/* Gruppen-Wechsel */
 
 td.sum {border-top: 2px dotted maroon;	border-bottom:3px solid maroon;
 	border-left:0px dotted maroon;	border-right:0px dotted maroon; font-weight: bold;}	/* unter dem Strich = Summenzeile */
-td.bez	{font-weight: bold;}	/* Beziehungen */
-td.nhd	{width: 150px;}			/* Namen - linke / rechte Spalte */
+td.bez	{font-weight: bold;}		/* Beziehungen */
+td.nhd	{width: 150px;}				/* Namen - linke / rechte Spalte */
 td.nam	{font-weight: bold;}
 /* td.gbl	{border-bottom: 1px dotted green;}	 Name: GB-Liste */
@@ -133,8 +131,8 @@
 td.hsnr	{width: 70px; padding-right: 4px; text-align: right;} /* Hausnummer in StraÃe */
 
-/* Fallunterscheidung bei GebÃ€ude auf FlurstÃŒck: */
-td.gin {color: rgb(0,50,0);}	/* GebÃ€ude in FS */
-td.gtl {color: rgb(140,140,100);}	/* GebÃ€ude teilweise auf FS */
-td.gan {color: rgb(210,170,170);}	/* GebÃ€ude angrenzend an FS*/
+/* Fallunterscheidung bei GebÃ€ude oder Bauwerk auf FlurstÃŒck: */
+td.gin {color: rgb(0,50,0);}			/* in FS */
+td.gtl {color: rgb(140,140,100);}		/* teilweise auf FS */
+td.gan {color: rgb(210,170,170);}		/* angrenzend an FS*/
 
 /* Farbwechsel je Zeile pair/unpair */
@@ -142,5 +140,5 @@
 tr.unp {background-color: rgb(252,255,252);}
 
-/* Ueberschriften */
+/* Ãberschriften */
 h1, h2, h3, h4, h5, h6 {font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;}
 h1 {	color: black;	font-size: 14pt;}
@@ -152,6 +150,4 @@
 
 img	{border: 0px; margin: 0px;} /* Icons */
-
-iframe.inlay {border:0px; width: 100%;} /* height: 400px; */
 
 /* Abbruch, Fehler der Berechtigung */
@@ -166,15 +162,19 @@
 /* Nur am Bildschirm: */
 @media screen {
-	/* gefÃŒllten farbiger Balken abrunden */
-	p.fsausk,p.fskennz,p.fsei,p.fshis,p.gbkennz,p.gskennz,p.nakennz,p.geb,p.lage,p.strasse,p.recht { border-radius: 8px; }
+	body {width: 740px;} /* wenn in eigenem Browser-Tab geÃ¶ffnet statt in Hochformat-Fenster.
+		width synchron halten mit Javascript-Function "imFenster" aus alkisinlayausk.php. Etwas kleiner als Fenster. */
+	body.mbfi {width: 540px;} /* Mapbender Feature-Info, kleines PopUp-Fenster */
+	/* iframe.inlay Siehe featureinfo.css */
+
+	p.balken {border-radius: 8px;}		/* gefÃŒllten farbiger Balken, abrunden */
 	.onlyprint {visibility: hidden;}
 }
 
 /* Abweichende Darstellung im Druck.
-Generell keine "Bedienelemente" mit drucken, also Links zu anderen Nachweisen oder optionale Umschalter fÃŒr den Umfang der Anzeige.
-Dies wird durch class='noprint' gesteuert. GroÃe farbige FlÃ€chen vermeiden, z.B. durch Rahmen ersetzen. */
+Generell keine "Bedienelemente" mit drucken, also Hyperlinks zu anderen Nachweisen oder optionale Umschalter fÃŒr den Umfang der Anzeige.
+Dies wird durch class='noprint' gesteuert. GroÃe farbige FlÃ€chen vermeiden, z.B. durch einen Rahmen ersetzen. */
 @media print {
-	body	{background-color: white;} /* width: 98%; */
-	.noprint {visibility: hidden;}
+	body		{background-color: white;}
+	.noprint	{visibility: hidden;}
 
 	/* Balken im Druck (auf weiÃem Hintergrund) mit schwarzer Schrift */
Index: trunk/info/info/alkisn/alkisexport.php
===================================================================
--- trunk/info/info/alkisn/alkisexport.php	(revision 419)
+++ trunk/info/info/alkisn/alkisexport.php	(revision 422)
@@ -22,13 +22,8 @@
 	--------
 	2016-02-23	Version fuer norGIS-ALKIS-Import
-	2016-10-18	Export einer ganzen Gemarkung zulassen (Sonderfall bei den Parametern)
-	2016-11-29	Gemeinsam genutzte Datenbanken ermÃ¶glichen
-	2017-02-23	Filter mit/ohne Hausnummer zum Typ "strasse".
-				Dazu muss der View "exp_csv_str" um die spalte "fall" erweitert werden.
-	2017-06-08 Validierung Eingabeparameter
-	2017-10-11 Sauber filtern auf endet IS NULL
-	2017-12-20 Nur eine Adresse zur Person (Siehe Views in "views_exp_csv.sql")
+	....
 	2018-05-03 Aufruf aus neuem GrundstÃŒcksnachweis: tabtyp='buchung', angepasster View "exp_csv" notwendig
 	2018-10-16 Neuer Aufruf-Typ aus der rÃ€umlichen Selektion, &tabtyp=flstliste&prefix=DENW15&gmlliste=AL...,AL....
+	2020-12-16 Input-Validation und Strict Comparisation (===), BerechtigungsprÃŒfung vorÃŒbergehend deaktiviert
 
 	ToDo:
@@ -57,5 +52,5 @@
 		if ($j > 0) {$lagehsnr.=", ";}
 		$sneu=$row["bezeichnung"];
-		if ($sneu == $salt) { // gleiche Str.
+		if ($sneu === $salt) { // gleiche Str.
 			$lagehsnr.=$row["hausnummer"]; // HsNr dran haengen
 		} else { // Name UND HsNr dranhaengen
@@ -75,5 +70,5 @@
 
 // strikte Validierung aller Parameter
-if ( isset($gmlid) ) {
+if (isset($gmlid)) {
 	if ( !preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
 } else {
@@ -82,12 +77,15 @@
 
 // FS-Limit? x (16+1) = 
-if ( isset($gmlliste) ) {
+if (isset($gmlliste)) {
 	if (!preg_match("#^[0-9A-Za-z,]{16,2000}$#", $gmlliste)) {
-	//	echo "\n<p>gmlliste=".$gmlliste."</p>\n";   // NUR TEST
 		die("Eingabefehler gmlliste");
 	}
 }
 
-if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
+if (isset($gkz)) {
+	if (!preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
+} else {
+	die("Fehlender Parameter");
+}
 if (isset($gemarkung)) {
 	if (!preg_match('#^[0-9]{4}$#', $gemarkung)) {die("Eingabefehler gemarkung");}
@@ -98,8 +96,12 @@
 if (!preg_match('#^[a-z]{0,10}$#', $tabtyp)) {die("Eingabefehler tabtyp");}
 
-require_once("alkis_conf_location.php"); // Konfiguration laden
-include("alkisfkt.php"); // Funktionen der ALKIS-Auskunft laden
-
-if ($tabtyp == '') { // Parameter (-kombinationen) pruefen
+include "alkis_conf_location.php";
+include "alkisfkt.php";
+
+// BerechtigungsprÃŒfung fuer CSV vorÃŒbergehend deaktiviert weil darin HTML-Meldungen ausgegeben werden.
+// ggf. dies per Option verhindern und wieder aktivieren.
+//$erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('Abbruch'); }
+
+if ($tabtyp === '') { // Parameter (-kombinationen) pruefen
 	if ($gemarkung != '') { // Dieser Parameters bestimmt auch eindeutig den $tabtyp
 		$tabtyp = 'gemarkung';
@@ -108,6 +110,6 @@
 		exit ($err);
 	}
-} elseif ($tabtyp == 'gemarkung') {
-	if ($gemarkung == '') {
+} elseif ($tabtyp === 'gemarkung') {
+	if ($gemarkung === '') {
 		$err="\nFehler: Gemarkungsnummer nicht angeben.";
 		exit ($err);
@@ -116,6 +118,6 @@
 
 if ($gmlid != '') { // Angabe von gmlid ist der Normalfall, das passt fÃŒr fast jeden tabtyp
-	if ($tabtyp == 'strasse' and $haus != '') { // den Zusatzfilter m/o im Dateinamen dokumentieren
-		if ($haus == 'm') {
+	if ($tabtyp === 'strasse' and $haus != '') { // den Zusatzfilter m/o im Dateinamen dokumentieren
+		if ($haus === 'm') {
 			$filename='alkis_'.$tabtyp.'_'.$gmlid.'_mit_hsnr.csv';
 		} else {  // = o
@@ -134,10 +136,10 @@
 
 /* 	// $gmlid zu strasse ist noch notwendig solange kein Filter auf "Gemeinde" verwendet wird.
-	} elseif ($haus == 'm' or $haus == 'o') { // Sonderfall 2 - alle mit/ohne Hausnummer, nur ÃŒber View "exp_csv_str" mÃ¶glich
+	} elseif ($haus === 'm' or $haus === 'o') { // Sonderfall 2 - alle mit/ohne Hausnummer, nur ÃŒber View "exp_csv_str" mÃ¶glich
 		if ($tabtyp != 'strasse') {
 			$err="\nFehler: Falsche Kombination Parameter tabtyp='".$tabtyp."' mit Wert fuer Haus.";
 			exit ($err);
 		}
-		if ($haus == 'm') { // den Zusatzfilter m/o im Dateinamen dokumentieren
+		if ($haus === 'm') { // den Zusatzfilter m/o im Dateinamen dokumentieren
 			$filename='alkis_'.$tabtyp.'_mit_hsnr.csv';
 		} else {
@@ -224,6 +226,6 @@
 }
 
-if ($haus == 'm' or $haus == 'o') { // nur FS mit/ohne verschl. Lagebez.
-//	if ($gmlid == '') { // m/o-Filter als einziger Filter
+if ($haus === 'm' or $haus === 'o') { // nur FS mit/ohne verschl. Lagebez.
+//	if ($gmlid === '') { // m/o-Filter als einziger Filter
 //		$sql="SELECT * FROM ".$viewname." WHERE fall='".$haus."' "; // Ersetzen
 //		$v=array(); // kein Filter-Feld
@@ -349,8 +351,7 @@
 }
 pg_free_result($res);
-if ($i == 1) { // nur Kopf
-	if ( $gmlid == '' ) {
+if ($i === 1) { // nur Kopf
+	if ($gmlid == '') {
 		$err="\nKein Treffer";
-	//	echo "\n".$sql."\n".$v[0]."\n".$dbconn."\n";
 	} else {
 		$err="\nKein Treffer fuer gml_id='".$gmlid."'";
Index: trunk/info/info/alkisn/alkisstrasse.php
===================================================================
--- trunk/info/info/alkisn/alkisstrasse.php	(revision 419)
+++ trunk/info/info/alkisn/alkisstrasse.php	(revision 422)
@@ -8,11 +8,9 @@
 	Version:
 	2016-02-24 Version fuer norGIS-ALKIS-Import
-	2016-11-29 HTML5, Gemeinsam genutzte Datenbanken ermÃ¶glichen, SQL optimiert (FS-Liste jetzt schneller)
-	2017-02-23 Neuer Parameter &haus=m/o zum alkisexport.php
-	2017-06-08 Validierung Eingabeparameter, gestreifte Tabelle, Feinkorrekturen
-	2017-10-09 Sauber filtern auf endet IS NULL
-	2018-04-23 &nodebug
-	2018-11-09 Umstellung Full-Schema
+	...
+	2020-02-20 Authentifizierung ausgelagert in Function darf_ich()
+	2020-12-15 Input-Validation und Strict Comparisation (===)
 */
+ini_set("session.cookie_httponly", 1);
 session_start();
 $showkey="n"; $nodebug=""; // Var. aus Parameter initalisieren
@@ -20,14 +18,20 @@
 
 // strikte Validierung aller Parameter
-if (!isset($gmlid) or !preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
-if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
+if (isset($gmlid)) {
+	if (!preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
+} else {
+	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}$#', $showkey)) {die ("Eingabefehler showkey");}
-if ($showkey == "j") {$showkey=true;} else {$showkey=false;}
+if ($showkey === "j") {$showkey=true;} else {$showkey=false;}
 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>
@@ -47,7 +51,9 @@
 <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.
 // 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_alkisstrasse.php'");
@@ -69,5 +75,5 @@
 if (!$res) {
 	echo "\n<p class='err'>Fehler bei Lagebezeichnungskatalogeintrag.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = gml_id = '".$gmlid."'</p>";}
+	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
 }
 if ($row = pg_fetch_assoc($res)) {
@@ -76,5 +82,5 @@
 	$gem=$row["gemeinde"];
 	$kennz=$gem."-".$lage." (".$snam.")"; // Schluessel als Sucheingabe in NAV brauchbar?
-	echo "\n<p class='strasse'>ALKIS Stra&szlig;e ".$kennz."&nbsp;</p>"; // Balken
+	echo "\n<p class='balken strasse'>ALKIS Stra&szlig;e ".$kennz."&nbsp;</p>"; // Balken
 } else {
 	echo "\n<p class='err'>Kein Treffer bei Lagebezeichnungskatalogeintrag.</p>";
@@ -155,5 +161,5 @@
 if (!$resf) {
 	echo "\n<p class='err'>Fehler bei Flurst&uuml;ck.</p>";
-	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = gml_id = '".$gmlid."'</p>";}	
+	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}	
 }
 
@@ -206,5 +212,5 @@
 		."\n\t<td class='hsnr'>".$rowf["hausnummer"]."</td>"
 		."\n\t<td>\n\t\t<p class='nwlink noprint'>";
-			if ($ltyp == 'm') { // nur Typ "Mit Haus" anzeigen. Dar Typ 'o' ist immer gleich und identisch mit dem Link im Kopf
+			if ($ltyp === 'm') { // nur Typ "Mit Haus" anzeigen. Dar Typ 'o' ist immer gleich und identisch mit dem Link im Kopf
 				echo "\n\t\t<a href='alkislage.php?gkz=".$gkz."&amp;ltyp=".$ltyp."&amp;gmlid=".$lgml;
 				if ($showkey) {echo "&amp;showkey=j";}
@@ -238,5 +244,5 @@
 </div>
 
-<?php footer($gmlid, $_SERVER['PHP_SELF']."?", ""); ?>
+<?php footer($gmlid, selbstverlinkung()."?", ""); ?>
 
 </body>
Index: trunk/info/info/alkisn/alkisfkt.php
===================================================================
--- trunk/info/info/alkisn/alkisfkt.php	(revision 419)
+++ trunk/info/info/alkisn/alkisfkt.php	(revision 422)
@@ -3,23 +3,79 @@
 
 	ALKIS-Buchauskunft, Kommunales Rechenzentrum Minden-Ravensberg/Lippe (Lemgo).
-	Functions
+	F u n c t i o n s
 
 	Version:
 	2016-02-24 Version fuer norGIS-ALKIS-Import, "function linkgml" raus. Case-EntschlÃŒsselung raus.
-	2016-03-03 Hinweis auf Datenfehler wenn "ax_person" fehlt in function "eigentuemer"
-	2016-03-14 Kleine Korrekturen
-	2016-11-29 Gemeinsam genutzte Datenbanken ermÃ¶glichen (Filter Gemeinde)
-	2017-06-08 gestreifte Tabelle, Feinkorrekturen
-	2017-10-17 Deutsches Datumsformat fÃŒr Geburtsdatum der Person
-	2017-11-03 neue function werteliste()
-	2017-12-20 Default Anzeigewert "EigentÃŒmer" im Link fÃŒr leere EigentÃŒmerart, JÃŒngste Adresse zur Person verwenden.
-	2018-04-23 Berechtigte Buchungen im FS-Nachw. verbessern. Neue Spalte statt Ãberschriften fÃŒr "EigentÃŒmer" und "Berechtigte Buchungen".
-	2018-05-03 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: Parameter $lnkclass in eigentuemer() und $jfenster in buchung_anzg() vereinheitlichen
+	....
+	2020-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF'] fÃŒr Einsatz hinter Gateway mit Ãnderung des Pfades (Docker/QWC2)
+	2020-12-09 Entschl. BodenschÃ€tzung korrigiert in function werteliste()
+	2020-12-15 Input-Validation und Strict Comparisation (===)
+	2020-12-16 Sonderfall QWC2 API-Gateway-Umleitung bei Selbstverlinkung
 */
+
+function selbstverlinkung() {
+//	Aus der Server-Variable den Pfad entfernen.
+	global $pfadlos_selbstlink;
+	If ($pfadlos_selbstlink === 1) { // pfad-lose Selbstverlinkung hinter einer Umleitung. z.B. QWC2 API-Gateway
+		// Pfad entfernen
+		$mod=strrchr($_SERVER['PHP_SELF'], '/');
+		$mod=substr($mod, 1);
+	} else { // normaler Webserver, die Systemvariable ist korrekt
+		$mod=$_SERVER['PHP_SELF'];
+	}
+	return $mod;
+}
+
+function darf_ich() {
+//	Am Anfang jedes Moduls aufrufen um $customer zu fÃŒllen.	
+//	Nach EinfÃŒhrung eines automatisch einloggenden anonymen Mapbender-Gast-Benutzers muss dieser bei der Authentifizierung ausgeschlossen werden.
+	global $auth, $customer, $mb_guest_user, $debug;
+
+	if ($auth === "") {	// nicht prÃŒfen
+	//	if ($debug > 1) {echo "\n<p class='dbg'>keine Berechtigungs-PrÃŒfung</p>";}
+		$customer = "(unbekannt)";
+		return 1;	// alles erlaubt
+
+	} elseif ($auth === "mapbender") {
+
+	//	if ($debug > 1) {echo "\n<p class='dbg' Berechtigungs-Pr&uuml;fung Mapbender</p>";}
+		$customer = "";
+		include '/opt/gdi/mapbender/http/php/mb_validateSession.php';
+		
+		if (!isset($_SESSION)) { // keine (passende) Session
+			if ($debug > 1) {echo "\n<p class='dbg'>Session nicht gesetzt</p>";}
+		} elseif ( !isset($_SESSION["mb_user_name"]) )  {
+			if ($debug > 1) {echo "\n<p class='dbg'>username nicht gesetzt</p>";}
+		} else {
+			$customer = $_SESSION["mb_user_name"]; // angemeldeter Benutzer	
+		}
+		//if ($debug > 1) {echo "\n<p class='dbg'>Customer '".$customer."'</p>";}
+		if ($customer == "") {	// Wer bin ich?
+			echo "<p class='stop2'>Aufruf nur aus Mapbender erlaubt.</p>";
+			return 0;
+		} elseif ($customer == $mb_guest_user) { // in conf festgelegt
+			echo "<p class='stop2'>Eine Anmeldung im Mapbender ist notwendig.</p>";
+			return 0;	// gast-User darf nix
+		} else {
+			return 1;	// echter User, ist erlaubt
+		}
+
+	} elseif ($auth === "qwc2") {
+
+		if ($debug > 1) {echo "\n<p class='dbg'>Berechtigungs-PrÃŒfung QWC2 -GEPLANT-</p>";}
+
+		// BAUSTELLE: Hier den Code einfÃŒgen um im QWC2 die Berechtigung zu prÃŒfen und den Benutzer auszulesen.
+		// Guggs du: https://git.sourcepole.ch/krz_dt/qwc2/-/issues/78
+
+		$customer = "(Unbekannt)";
+		echo "<p class='stop2'>Berechtigungspr&uuml;fung fÃŒr QWC2 ist noch nicht m&ouml;glich.</p>";
+		return 1;	// vorlÃ€ufig erlaubt
+
+	} else {
+
+		echo "\n<p class='stop2'>Die Berechtigungs-PrÃŒfung ist falsch konfiguriert</p>";
+		return 0;	// verboten
+	}
+}
 
 function footer($gmlid, $link, $append) {
@@ -28,13 +84,13 @@
 	// Den URL-Parameter "&showkey=j/n" umschalten lassen.
 	// $append wird angehaengt wenn gefuellt. Anwendung: &eig=j bei FS-NW, &ltyp=m/p/o bei Lage
-	global $gkz, $showkey, $hilfeurl, $auth, $debug;
-
-	// S c r e e n - Foot
+	global $gkz, $showkey, $hilfeurl, $debug, $customer;
+
+	echo "<footer>";
+	// S c r e e n - F o o t
 	echo "\n<div class='confbereich noprint'>"
 	."\n\t<table class='outer'>\n\t<tr>";
 
 	// Spalte 1: Info Benutzerkennung
-	if ($auth == "mapbender") {
-		$customer=$_SESSION["mb_user_name"];
+	if (isset($customer)) { // ÃŒber global von fkt. darf_ich()
 		echo "\n\t\t<td title='Info'><i>Benutzer:&nbsp;".$customer."</i></td>";
 	} else {
@@ -50,7 +106,6 @@
 			echo $mylink."&amp;showkey=j' title='Verschl&uuml;sselungen anzeigen'>Schl&uuml;ssel ein</a>";
 		}
-		// TemporÃ€r eine Ansicht ohne Entwicklungsumgebung
-		if ($debug > 0) {
-			echo "&nbsp;|&nbsp;".$mylink."&amp;nodebug=j' title='Debug-Ausgaben tempor&auml;r abschalten'>Ansicht ohne Testausgaben</a>";
+		if ($debug > 0) { // FÃŒr Entwickler temporÃ€r eine Ansicht OHNE debug
+			echo "<br>".$mylink."&amp;nodebug=j' title='Debug-Ausgaben tempor&auml;r abschalten'>Ansicht ohne Testausgaben</a>";
 		}
 	echo "\n\t\t</td>";
@@ -62,9 +117,10 @@
 	."\n</div>\n";
 
-	// P r i n t - Foot
-	if ($auth == "mapbender") {
-	//	$customer=$_SESSION["mb_user_name"];
-		echo "\n<p class='onlyprint'><i>Mapbender-Benutzer:&nbsp;".$customer."</i></p>";
-	}
+	// P r i n t - F o o t
+	if (isset($customer)) {
+		echo "\n<p class='onlyprint'><i>Benutzer:&nbsp;".$customer."</i></p>";
+	}
+
+	echo "</footer>";
 	return 0;
 }
@@ -110,11 +166,12 @@
 	if (!$resbs) {
 		echo "\n<p class='err'>Fehler bei 'Buchungsstelle ausgeben'.</p>";
-		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sqlbs, ENT_QUOTES, "UTF-8")."<br>$1 = gml_id = '".$gmlbs."'</p>";}
-	}
-	$gezeigt=false; // Funktionswert
+		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlbs."'", $sqlbs), ENT_QUOTES, "UTF-8")."</p>";}
+	}
+	$gezeigt = 0; // Funktionswert default
+
 	if ($rowbs = pg_fetch_assoc($resbs)) { // ein Treffer
 		$blattkeyber=$rowbs["blattart"]; // Schluessel von Blatt-Art des GB
 		if ($blattkeyber != '5000' or $debug > 1) { // "Fiktives Blatt" nur bei Entwicklung anzeigen
-			$gezeigt=true; // Funktionswert
+			$gezeigt = 1; // Funktionswert nach Treffer
 			$hgml=$rowbs["hgml"]; // GML-ID der (herrschenden) BuchungsStelle
 			$bartkey=$rowbs["buchungsart"]; // Buchungsart SchlÃŒssel
@@ -137,13 +194,13 @@
 					switch ($barttyp) { // Text der Ãberschrift
 						case "E":
-							if ($eig == 'j') {$h3txt = "Buchung und Eigentum";} 
+							if ($eig === 'j') {$h3txt = "Buchung und Eigentum";} 
 							else {$h3txt = "Buchung";}
 						break;
 						case "R": $h3txt = "Grundst&uuml;cksgleiche Rechte"; break;
 					}
-					if ($barttypgrp == "" and $gml_fs != "") { // die erste Ãberschrift mit ID und Umschalter
+					if ($barttypgrp === "" and $gml_fs != "") { // die erste Ãberschrift mit ID und Umschalter
 						echo "\n\t<tr>\n\t\t<td colspan='3'>\n\t\t\t<h3 id='gb'>".$h3txt."</h3>\n\t\t</td>"; // 1-3
 						echo "\n\t\t<td>\n\t\t\t<p class='nwlink noprint'>" // 4
-							."\n\t\t\t\t<a href='".$_SERVER['PHP_SELF']. "?gkz=".$gkz."&amp;gmlid=".$gml_fs;
+							."\n\t\t\t\t<a href='".selbstverlinkung()."?gkz=".$gkz."&amp;gmlid=".$gml_fs;
 							if ($showkey) {echo "&amp;showkey=j";}
 							if ($eig=="j") { // Umschalter: FS-Nachweis ruft sich selbst mit geaendertem Parameter auf. Positionierung auf Marke "#gb"
@@ -192,5 +249,5 @@
 					."\n\t\t\t</tr>";
 
-					if ($trtyp == 3) { // Treffer-Grundst. einfÃ€rben
+					if ($trtyp === 3) { // Treffer-Grundst. einfÃ€rben
 						echo "\n\t\t\t<tr class='paa'>";
 					} else {
@@ -205,5 +262,5 @@
 					."\n\t\t\t</table>";
 
-					if ($rowbs["zaehler"] <> "") {
+					if ($rowbs["zaehler"] != "") {
 						echo "\n\t\t\t<p class='ant'>".$rowbs["zaehler"]."/".$rowbs["nenner"]."&nbsp;Anteil am Flurst&uuml;ck</p>";
 					}
@@ -227,5 +284,5 @@
 						."</a>";
 					// Buchung
-						if ($trtyp == 1) {
+						if ($trtyp === 1) {
 							echo "<br>";
 							if ($showkey) {echo "<span class='key'>".$bartkey."</span> ";}
@@ -240,5 +297,5 @@
 				."\n\t\t</td>" // 4
 			."\n\t</tr>";
-			if ($eig == "j") {
+			if ($eig === "j") {
 				if ($jsfenster) {$lnkclass = "imFenster";} else {$lnkclass = "";} 
 				$n = eigentuemer($gbgml, true, $lnkclass); // mit Adresse
@@ -247,5 +304,8 @@
 	}
 	pg_free_result($resbs);
-	return $gezeigt; // true wenn eine Buchung ausgegeben wurde
+	
+	//if ($debug > 1) {echo "\n<p class='dbg'>Ende function buchung_anzg(), Return = ". $gezeigt ."</p>";}
+	
+	return $gezeigt; // 1 wenn eine Buchung ausgegeben wurde
 }
 
@@ -272,5 +332,5 @@
 	if (!$resber) {
 		echo "\n<p class='err'>Fehler bei 'berechtigte Buchungsstellen'.</p>";
-		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = gml_id = '".$gmls."'</p>";}
+		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmls."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
 	}
 	$an=0;
@@ -279,5 +339,5 @@
 		$hgml=$rowan["hgml"]; // GML-ID der berechtigten Buchungs-Stelle
 
-		if ($hgml == $gsanfrd) {
+		if ($hgml === $gsanfrd) {
 			$trtyp=3; // einfÃ€rben, o. Lnk.
 		} else {
@@ -322,5 +382,5 @@
 	."FROM ax_flurstueck f LEFT JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer "
 	."WHERE f.endet IS NULL AND g.endet IS NULL AND f.istgebucht = $1 ";
-	if ($filtgem == '' ) { // ungefiltert
+	if ($filtgem === '') { // ungefiltert
 		$v=array($gml_bs);
 	} else {
@@ -338,5 +398,5 @@
 		$bvnr="";
 	}
-	$altbvnr=""; // ++ besser mit "$j == 0" steuern?
+	$altbvnr=""; // ++ besser mit "$j === 0" steuern?
 	$j=0;
 	while($rowf = pg_fetch_assoc($resf)) {
@@ -350,5 +410,5 @@
 		echo "\n<tr class='".$trclass."'>"; // eine Zeile je Flurstueck
 			// Sp. 1-3 der Tab. aus Buchungsstelle, nicht aus FS
-			if($bvnr == $altbvnr) { // gleiches Grundstueck, leer lassen
+			if($bvnr === $altbvnr) { // gleiches Grundstueck, leer lassen
 				echo "\n\t<td>&nbsp;</td>"
 				."\n\t<td>&nbsp;</td>"
@@ -377,5 +437,5 @@
 			echo "\n\t<td>\n\t\t<p class='nwlink noprint'>";
 		//	if($bvnr != $altbvnr) {
-			if($j == 0) {
+			if($j === 0) {
 				echo "\n\t\t\t<a href='alkisgsnw.php?gkz=".$gkz."&amp;gmlid=".$gml_bs;
 					if ($showkey) {echo "&amp;showkey=j";}
@@ -394,5 +454,5 @@
 		$altbvnr=$bvnr;
 		$j++;
-	} // Ende Loop Flurstueck
+	}
 	pg_free_result($resf);
 	return $j;
@@ -433,5 +493,5 @@
 	if (!$resn) {
 		echo "\n<p class='err'>Fehler bei Eigent&uuml;mer</p>"; // kein Fehler bei Blattarten > 1000
-		//if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqln."<br>$1=gml= '".$gmlid."'</p>";}
+		//if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1", "'".$gmlid."'", $sqln )."</p>";}
 	}
 
@@ -442,5 +502,5 @@
 		$rechtsg=$rown["adr"];
 		echo "\n\t<tr>";
-			if($n == 0) { // erste EigentÃŒmer-Zeile zu einer Buchung
+			if($n === 0) { // erste EigentÃŒmer-Zeile zu einer Buchung
 				echo "\n\t\t<td class='ll'><img src='ico/Eigentuemer_2.png' width='16' height='16' alt=''> Eigent&uuml;mer:</td>"; // 1
 			} else { // Folgezeile
@@ -477,5 +537,5 @@
 		if (!$resp) {
 			echo "\n\t<p class='err'>Fehler bei Person</p>";
-			if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".$sqlp."<br>$1=gml= '".$gmlpers."'</p>";}
+			if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1", "'".$gmlpers."'", $sqlp)."</p>";}
 		}
 
@@ -483,10 +543,10 @@
 		while($rowp = pg_fetch_assoc($resp)) { // Schleife weglassen: "benennt" ist KEIN Array!
 			$diePerson=""; //++ Anrede?
-			if ($rowp["akademischergrad"] <> "") {$diePerson=$rowp["akademischergrad"]." ";}
+			if ($rowp["akademischergrad"] != "") {$diePerson=$rowp["akademischergrad"]." ";}
 			$diePerson.=$rowp["nachnameoderfirma"];
-			if ($rowp["vorname"] <> "") {$diePerson.=", ".$rowp["vorname"];}
-			if ($rowp["namensbestandteil"] <> "") {$diePerson.=". ".$rowp["namensbestandteil"];}
-			if ($rowp["geburtsdatum"] <> "") {$diePerson.=", geb. ".$rowp["geburtsdatum"];}
-			if ($rowp["geburtsname"] <> "") {$diePerson.=", geb. ".$rowp["geburtsname"];}
+			if ($rowp["vorname"] != "") {$diePerson.=", ".$rowp["vorname"];}
+			if ($rowp["namensbestandteil"] != "") {$diePerson.=". ".$rowp["namensbestandteil"];}
+			if ($rowp["geburtsdatum"] != "") {$diePerson.=", geb. ".$rowp["geburtsdatum"];}
+			if ($rowp["geburtsname"] != "") {$diePerson.=", geb. ".$rowp["geburtsname"];}
 			$diePerson=htmlentities($diePerson, ENT_QUOTES, "UTF-8"); // Umlaute
 			$eiartkey=$rown["eigentuemerart"]; // Key
@@ -498,5 +558,5 @@
 				echo "\n\t\t\t\t<a href='".$lnkvor."alkisnamstruk.php?gkz=".$gkz."&amp;gmlid=".$gmlpers;
 				if ($showkey) {echo "&amp;showkey=j";}
-				if ($eiartkey == "") {$eiart="Eigent&uuml;mer" ;} // Default. Ersatz-Text, wenn nicht gefÃŒllt
+				if ($eiartkey === "") {$eiart="Eigent&uuml;mer" ;} // Default. Ersatz-Text, wenn nicht gefÃŒllt
 				echo $lnknach."' title='vollst&auml;ndiger Name und Adresse eines Eigent&uuml;mers'>".$eiart
 				." <img src='ico/Eigentuemer.png' width='16' height='16' alt=''></a>\n\t\t\t</p>"
@@ -513,13 +573,13 @@
 				if (!$resa) {
 					echo "\n\t<p class='err'>Fehler bei Adressen</p>";
-					if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".$sqla."<br>$1=gml= '".$gmlpers."'</p>";}
+					if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1", "'".$gmlpers."'", $sqla)."</p>";}
 				}
 				$j=0;
 				while($rowa = pg_fetch_assoc($resa)) {
 					$j++;
-					if ($j == 1) { // erste ("jÃŒngste") Adresse anzeigen
+					if ($j === 1) { // erste ("jÃŒngste") Adresse anzeigen
 						$gmla=$rowa["gml_id"];
 						$plz=$rowa["plz"]; // integer
-						if($plz == 0) {
+						if($plz === 0) {
 							$plz="";
 						} else {
@@ -567,6 +627,6 @@
 		pg_free_result($resp);
 
-		if ($i == 0) { // KEINE Person. benennt ist leer. Das kommt vor hinter der Zeile "Erbengemeinschaft" und ist dann KEIN Fehler
-			if ($rechtsg == 9999) {
+		if ($i === 0) { // KEINE Person. benennt ist leer. Das kommt vor hinter der Zeile "Erbengemeinschaft" und ist dann KEIN Fehler
+			if ($rechtsg === 9999) {
 				if ($debug > 1) {echo "\n\t\t\t<p class='dbg'>Rechtsgemeinschaft = '".$rechtsg."'</p>";}
 			} else {
@@ -580,25 +640,22 @@
 	pg_free_result($resn);
 	return $n; 
-} // End function eigentuemer
-
-function werteliste ($element, $bezeichnung ,$sqlin) {
+}
+
+function werteliste ($bez ,$sqlin) {
 	// Eine oder mehrere EntschlÃŒsselungen in eine Zeile ausgeben.
-	// Dient dazu, SchlÃŒssel-ARRAYs auflÃ¶sen ohne die Zeile mehrfach aufzulisten (JOIN)
-	// Anwendung: FS-Nachweis BodenschÃ€tzung "Klimastufe + WasserverhÃ€ltnisse"
-	// 2018-11-09: Umstellung von "alkis_wertearten" auf individuelle Tabellen
-
+	// Dient dazu, SchlÃŒssel-ARRAYs auflÃ¶sen ohne die Zeile im JOIN mehrfach aufzulisten
+	// Anwendung: FS-Nachweis BodenschÃ€tzung
 	global $debug;
-	if ($element == 'ax_bodenschaetzung' AND $bezeichnung = 'entstehungsartoderklimastufewasserverhaeltnisse' ) {
-		$tabelle = 'ax_entstehungsartoderklimastufewasserverhaeltnisse_bodensc';
-	} elseif ($element == 'ax_bodenschaetzung' AND $bezeichnung = 'sonstigeangaben' ) {
-		$tabelle = 'ax_sonstigeangaben_bodenschaetzung';
-	}
+
+	if ($bez === 'e') {$tabelle = 'ax_entstehungsartoderklimastufewasserverhaeltnisse_bodensc';} 
+	elseif ($bez === 's') {$tabelle = 'ax_sonstigeangaben_bodenschaetzung';}
+
 	$sql="SELECT wert, beschreibung FROM ".$tabelle." WHERE wert IN (".$sqlin.") ORDER BY wert LIMIT $1 ;";
-	$v = array(100);
+	$v = array('9');
 	$res = pg_prepare("", $sql);
 	$res = pg_execute("", $v);
 	if (!$res) {
 		echo "\n<p class='err'>Fehler bei Werteliste.</p>";
-		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = '".$sqlin."'</p>";}
+		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."</p>";}
 		return;
 	}
@@ -609,5 +666,8 @@
 	}
 	pg_free_result($res);
-	if ($i == 0) {echo "(kein Treffer)";}
+	if ($i === 0) {
+		echo "(kein Treffer)";
+		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."</p>";}
+	}
 	return;
 }
@@ -669,8 +729,8 @@
 	$arr=explode("-", $fskennz, 4); // zerlegen
 	$zgemkg=trim($arr[0]);
-	if (strlen($zgemkg) == 20 and !isset($arr[1])) {
+	if (strlen($zgemkg) === 20 and !isset($arr[1])) {
 		$fskzdb=$zgemkg; // ist schon Datenbank-Feldformat
 	} else { // Das Kennzeichen auseinander nehmen. 
-		if (strlen($zgemkg) == 6) {
+		if (strlen($zgemkg) === 6) {
 			$land=substr($zgemkg, 0, 2);
 			$zgemkg=substr($zgemkg, 2, 4);
@@ -687,5 +747,5 @@
 			$znenner="";
 		}
-		if (trim($znenner, " 0.") == "") { // kein Bruch oder nur Nullen
+		if (trim($znenner, " 0.") === "") { // kein Bruch oder nur Nullen
 			$znenner="____"; // in DB-Spalte mit Tiefstrich aufgefÃŒllt
 		} else {
