"; $port = ""; $dbname = ""; $user = ""; $password = ""; $conn_string = "host=" . $host . " port=" . $port . " dbname=" . $dbname . " user=" . $user . " password=" . $password; // Versuche, die Verbindung herzustellen... $dbconn = pg_connect($conn_string); if (!$dbconn) { // ... es gab einen Fehler bei der Verbindung. handleError('Konnte nicht mit der Datenbank verbinden.'); } // ------------------------------------------------------------------ // Einige allgemeine Funktionen // ------------------------------------------------------------------ // /** * Gibt eine zu übergebende Fehlermeldung an den aufrufenden Client * zuräck. Beendet die Ausfährung des Scripts anschlieäend. */ function handleError($string) { echo strip_tags(utf8_decode("FEHLER:\n\n" . $string)); die(); } /** * Gibt eine zu übergebende Infomeldung an den aufrufenden Client * zuräck. Beendet die Ausfährung des Scripts anschlieäend. */ function handleInfo($string) { echo strip_tags(utf8_decode("INFO:\n\n" . $string)); die(); } /** * Gibt einen zu übergebenden WKT-String an den aufrufenden Client * zuräck. Beendet die Ausfährung des Scripts anschlieäend. */ function handleWkt($string) { echo strip_tags(utf8_decode($string)); die(); } /** * überprüft, ob der übergebene String wie eine WKT-Geometrie * aussieht. Diese Funktion testet dies nur sehr einfach und fär * produktive Belange sicherlich unzureichend! */ function isWKTgeometry($string) { $types = array ( 'POINT', 'LINESTRING', 'POLYGON', 'MULTIPOINT', 'MULTILINESTRING', 'MULTIPOLYGON', 'GEOMETRYCOLLECTION' ); $re = '/^(' . implode($types, '|') . ')/i'; return preg_match($re, $string); } /** * Ersetzt in dem zu äbergebenden String die speziellen Zeichenketten * "${A}" bis "${K}" mit den entsprechenden Geometrien um Interaktionen * mit jenen zuzulassen. Gibt den veränderten String mit vollzogenenen * Ersetzungen zuräck. */ function replaceGeometryVariable($string) { $search = array ( '${A}', '${B}', '${C}', '${D}', '${E}', '${F}', '${G}', '${H}', '${I}', '${J}', '${K}' ); $replace = array ( "ST_SetSRID('POINT(6 1)'::geometry, 4326)", "ST_SetSRID('POINT(5.5 4.5)'::geometry, 4326)", "ST_SetSRID('POINT(4.5 5.5)'::geometry, 4326)", "ST_SetSRID('LINESTRING(3 1, 5 1)'::geometry, 4326)", "ST_SetSRID('LINESTRING(3 7, 5 5)'::geometry, 4326)", "ST_SetSRID('LINESTRING(5 6, 5 8)'::geometry, 4326)", "ST_SetSRID('POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))'::geometry, 4326)", "ST_SetSRID('POLYGON((2.5 2.5, 2.5 4.5, 4.5 4.5," . " 4.5 2.5, 2.5 2.5))'::geometry, 4326)", "ST_SetSRID('POLYGON((4 4, 4 6, 6 6, 6 4, 4 4))'::geometry, 4326)", "ST_SetSRID('POLYGON((6 5, 6 7, 8 7, 8 5, 6 5))'::geometry, 4326)", "ST_SetSRID('POLYGON((6 2, 6 4, 8 4, 8 2, 6 2))'::geometry, 4326)" ); return str_replace($search, $replace, $string); } // ------------------------------------------------------------------ // übergebenenen SQL-Befehl verarbeiten // ------------------------------------------------------------------ // // Die eigentliche Verarbeitung des SQL-Befehls: // Wurde ein SQL-Befehl per GET an das Skript übergeben? if (isset ($_GET['command']) && $_GET['command'] !== '') { // Rudimentäre Sicherheitsüberprüfung, fär Produktivbetrieb // sicherlich nicht ausreichend. $cmd = stripslashes($_GET['command']); // Ersetze etwaige Geometrieplatzhalter mit den echten Geometrien $cmd = replaceGeometryVariable($cmd); // Fähre die SQL-Query aus $res = pg_query($cmd); if ($res) { // Query konnte ausgeführt werden if (pg_num_rows($res) === 1) { // Es gab exakt eine Zeile ... if (pg_num_fields($res) === 1) { // ...mit exakt einem Feld // Das Ergebnis in einem Array speichern ... $arr = pg_fetch_array($res); // ... hat geklappt. if ($arr && $arr[0] !== false) { // Präfe, ob das Ergebnis eine WKT-Geometrie war ... if (isWKTgeometry($arr[0])) { // ... ja: gib jene an den Browser zuräck handleWKT($arr[0]); } else { // ... nein: gib die textuale Antwort zuräck handleInfo($arr[0]); } // Die folgenden Zeilen geben Fehlermeldungen an den // Client zurück, wenn eine der vorhergen überprüfungen // ein negatives ergebnis zurückgab. } else { handleError('Array konnte nicht befuellt werden.'); } } else { handleError('Mehr als ein Feld wurde zurueckgegeben.'); } } else { handleError('Mehr als eine Zeile wurde zurueckgegeben.'); } } else { handleError('Query konnte nicht ausgefuehrt werden. PostgreSQL sagt "' . pg_last_error() . '"'); } } else { handleError('Query konnte nicht ausgefuehrt werden. PostgreSQL sagt "' . pg_last_error() . '"'); } ?>