Probleme mit Variablen in SQL Rechen/Abfrage

BillaBong

Erfahrenes Mitglied
Hallo,

arbeite gerade mit der geodb und habe ein problem mit variablen in der sql abfrage.

PHP:
$breite = '6.81667'; 
$laenge = '49.3';

$umkreis = 5;


// Abfrage die nicht geht

    $sql="SELECT
   		 acos( sin( coords.lon * 3.14159268 /180 ) * sin( $laenge * 3.14159268 /180 ) + cos( coords.lon * 3.14159268 /180 ) * cos( $laenge * 3.14159268 /180 ) * cos( ( $breite - coords.lat ) * 3.14159268 /180 ) ) * 6378.137,
   		 tn.name, t.text_val
		 FROM geodb_coordinates coords, geodb_textdata t, geodb_type_names tn
		 WHERE acos( sin( coords.lon * 3.14159268 /180 ) * sin( $laenge * 3.14159268 /180 ) + cos( coords.lon * 3.14159268 /180 ) * cos( $laenge * 3.14159268 /180 ) * cos( ( $breite - coords.lat ) * 3.14159268 /180 ) ) * 6378.137 < $umkreis
		 AND t.loc_id = coords.loc_id and t.text_type =tn.type_id and (tn.type_locale=\"de_DE\" OR tn.type_locale=\"de\");";

wenn ich die variablen raus lasse gehts

PHP:
// Abfrage loc_id

    $sql="SELECT
   		 acos( sin( coords.lon * 3.14159268 /180 ) * sin( 6.81667 * 3.14159268 /180 ) + cos( coords.lon * 3.14159268 /180 ) * cos( 6.81667 * 3.14159268 /180 ) * cos( ( 49.3 - coords.lat ) * 3.14159268 /180 ) ) * 6378.137,
   		 tn.name, t.text_val
		 FROM geodb_coordinates coords, geodb_textdata t, geodb_type_names tn
		 WHERE acos( sin( coords.lon * 3.14159268 /180 ) * sin( 6.81667 * 3.14159268 /180 ) + cos( coords.lon * 3.14159268 /180 ) * cos( 6.81667 * 3.14159268 /180 ) * cos( ( 49.3 - coords.lat ) * 3.14159268 /180 ) ) * 6378.137 < 5
		 AND t.loc_id = coords.loc_id and t.text_type =tn.type_id and (tn.type_locale=\"de_DE\" OR tn.type_locale=\"de\");";
 
Wo kommen denn die Variablenwerte her? Die stehen ja wohl nicht so wie im Beispiel gezeigt im Quellcode drin.
 
Dann prüfe doch erst einmal, ob die Werte überhaupt existieren. Und dann kannst du dir auch einfach mal die zusammengesetzt Datenbankabfrage ausgeben lassen und sie manuell prüfen.
 
ja die werte die ich in den variablen stehen habe existieren auf jedenfall. es funktioniert ja auch wenn ich die variablen in der abfrage durch zahlen ersetze. doch wenn ich wie im obigen beispiel die zahlen einfach durch die entsprechenden werte

PHP:
$breite = '6.81667'; 
$laenge = '49.3';

$umkreis = 5;

ersetze geht es nicht mehr. das liegt auf jedenfall an den variablen die ich in der abfrage drin habe ich wüsste aber nicht was daran falsch sein könnte.
 
Probier mal Folgendes:
PHP:
$breite = 6.81667;
$laenge = 49.3;
$umkreis = 5; 
$x = 3.14159268/180;

$sql = '
SELECT
        ACOS( SIN( coords.lon * '.$x.') * '.sin($laenge*$x).' + COS( coords.lon * '.$x.' ) * '.cos($laenge*$x).' * COS( ( '.$breite.' - coords.lat ) * '.$x.' ) ) * 6378.137 AS foobar,
        tn.name,
        t.text_val
  FROM
        geodb_coordinates coords,
        geodb_textdata t,
        geodb_type_names tn
  WHERE
        t.loc_id = coords.loc_id
    AND t.text_type = tn.type_id
    AND (tn.type_locale="de_DE" OR tn.type_locale="de")
    AND ACOS( SIN( coords.lon * '.$x.' ) * '.sin($laenge*$x).' + COS( coords.lon * '.$x.' ) * '.cos($laenge*$x).' * COS( ( '.$breite.' - coords.lat ) * '.$x.' ) ) * 6378.137 < '.$umkreis;
echo htmlspecialchars($sql);
Möglicherweise kann es auch durch eine HAVING- statt der WHERE-Klausel optimiert werden.
 
Der Abfrage vom Anfang der Topic nach zu urteilen, wurden bloß die Variablen nicht ausge"klammert"...
"SELECT
acos( sin( coords.lon * 3.14159268 /180 ) * sin( $laenge * 3.14159268 /180 ) + cos( coords.lon * 3.14159268 /180 ) * cos( $laenge * 3.14159268 /180 ) * cos( ( $breite - coords.lat ) * 3.14159268 /180 ) ) * 6378.137,
tn.name, t.text_val

SELECT
ACOS( SIN( coords.lon * '.$x.') * '.sin($laenge*$x).' + COS( coords.lon * '.$x.' ) * '.cos($laenge*$x).' * COS( ( '.$breite.' - coords.lat ) * '.$x.' ) ) * 6378.137 AS foobar,
tn.name,
t.text_val

Vergleich die beiden Abfragen mal selber, dann siehst du es schon ;)
 
Zurück