PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP Karte - Problem mit mySQL Abfrage


TheRealTentacle
2005-08-01, 19:37:31
Hallo, ich wühle mich gerade durch dieses Tutorial durch:

http://dislabs.de/index.php?ac=labor&sub=5&id=14

Dabei komme ich nicht mit folgende mySQL anfrage klar:

$sql="SELECT `user`.`userid`,`user`.`username`,`user`.`homepage`, `user`.`avatar`,`geodb_user`.*,
IF(`geodb_locations`.`ortsteil`!='',CONCAT(`geodb_locations`.`ort`,' / ',`geodb_locations`.`ortsteil`),`geodb_locations`.`ort`) as `stadt`, `geodb_locations`.`adm1` as `bundesland`,`geodb_locations`.`kfz`,`geodb_locations`.`ort`,`geodb_locations`.` name_int` as `urlort`,
CONCAT(`raster_y`,'_',`raster_x`) as `raster`,
FROM `user`
LEFT JOIN `geodb_user` ON `geodb_user`.`userid`=`user`.`userid`
LEFT JOIN `geodb_locations` ON `geodb_locations`.`id`=`geodb_user`.`geoid`
WHERE `geodb_user`.`valid`=1 ORDER BY `raster` ASC;

Ich habe die Tabellen schon angepasst:

$sql="SELECT `com_users`.`id`,`com_users`.`name`,`com_users`.`website`, `geodb_user`.*,
IF(`geodb_locations`.`ortsteil`!='',CONCAT(`geodb_locations`.`ort`,' / ',`geodb_locations`.`ortsteil`),`geodb_locations`.`ort`) as `stadt`, `geodb_locations`.`adm1` as `bundesland`,`geodb_locations`.`kfz`,`geodb_locations`.`ort`,`geodb_locations`.` name_int` as `urlort`,
CONCAT(`raster_y`,'_',`raster_x`) as `raster`,
FROM `com_users`
LEFT JOIN `geodb_user` ON `geodb_user`.`userid`=`com_users`.`id`
LEFT JOIN `geodb_locations` ON `geodb_locations`.`id`=`geodb_user`.`geoid`
WHERE `geodb_user`.`valid`=1 ORDER BY `raster` ASC;";

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/g/greenmile-lan.homeip.net/public_html/greenmile/karte/karte.php on line 96

Ich habe wenig Ahnung von MySQL (ich kenne nur die Standardabfragen) und wüsste gerne was da überhaupt passiert, und wie sich das Problem lösen liesse.

Danke im Vorraus.

TheRealTentacle
2005-08-01, 19:48:46
Was mich am meisten verwirrt ist, dass es garkeine geodb_user Tabelle gibt.

Kann es sein, dass bei dem Tutorial vergessen wurde die Daten davor in diese Tabelle zu schreiben?

Gast
2005-10-05, 07:11:11
Was mich am meisten verwirrt ist, dass es garkeine geodb_user Tabelle gibt.

Kann es sein, dass bei dem Tutorial vergessen wurde die Daten davor in diese Tabelle zu schreiben?

CREATE TABLE `geodb_user` (
`userid` int(11) unsigned NOT NULL default '0',
`gruppe` tinyint(4) NOT NULL default '0',
`plz` varchar(5) NOT NULL default '',
`land` char(3) NOT NULL default '',
`geoid` int(11) NOT NULL default '0',
`x` int(4) NOT NULL default '0',
`y` int(11) NOT NULL default '0',
`raster_x` int(4) NOT NULL default '0',
`raster_y` int(4) NOT NULL default '0',
`combi` tinyint(4) NOT NULL default '0',
`combi1` tinyint(4) NOT NULL default '0',
PRIMARY KEY (`userid`) ) TYPE=MyISAM;

oliver123
2005-10-05, 10:26:14
Hallo, ich wühle mich gerade durch dieses Tutorial durch:

http://dislabs.de/index.php?ac=labor&sub=5&id=14

Dabei komme ich nicht mit folgende mySQL anfrage klar:

$sql="SELECT `user`.`userid`,`user`.`username`,`user`.`homepage`, `user`.`avatar`,`geodb_user`.*,
IF(`geodb_locations`.`ortsteil`!='',CONCAT(`geodb_locations`.`ort`,' / ',`geodb_locations`.`ortsteil`),`geodb_locations`.`ort`) as `stadt`, `geodb_locations`.`adm1` as `bundesland`,`geodb_locations`.`kfz`,`geodb_locations`.`ort`,`geodb_locations`.` name_int` as `urlort`,
CONCAT(`raster_y`,'_',`raster_x`) as `raster`,
FROM `user`
LEFT JOIN `geodb_user` ON `geodb_user`.`userid`=`user`.`userid`
LEFT JOIN `geodb_locations` ON `geodb_locations`.`id`=`geodb_user`.`geoid`
WHERE `geodb_user`.`valid`=1 ORDER BY `raster` ASC;

Ich habe die Tabellen schon angepasst:

$sql="SELECT `com_users`.`id`,`com_users`.`name`,`com_users`.`website`, `geodb_user`.*,
IF(`geodb_locations`.`ortsteil`!='',CONCAT(`geodb_locations`.`ort`,' / ',`geodb_locations`.`ortsteil`),`geodb_locations`.`ort`) as `stadt`, `geodb_locations`.`adm1` as `bundesland`,`geodb_locations`.`kfz`,`geodb_locations`.`ort`,`geodb_locations`.` name_int` as `urlort`,
CONCAT(`raster_y`,'_',`raster_x`) as `raster`,
FROM `com_users`
LEFT JOIN `geodb_user` ON `geodb_user`.`userid`=`com_users`.`id`
LEFT JOIN `geodb_locations` ON `geodb_locations`.`id`=`geodb_user`.`geoid`
WHERE `geodb_user`.`valid`=1 ORDER BY `raster` ASC;";

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/g/greenmile-lan.homeip.net/public_html/greenmile/karte/karte.php on line 96

Ich habe wenig Ahnung von MySQL (ich kenne nur die Standardabfragen) und wüsste gerne was da überhaupt passiert, und wie sich das Problem lösen liesse.

Danke im Vorraus.

$sql="SELECT gedoens_text FROM gedoens";
$result=mysql_query($sql);
if (!$result) {
echo $mysql_error();
}

Gibt Dir die Fehlermeldung zur Query aus und damit siehst Du was Dein Problem ist.


Gruss, Oli

TheRealTentacle
2005-10-16, 12:02:44
Ich habe das problem gelöst (seit einiger Zeit) - und es funktioniert.

Das Hauptproblem ist, dass diese Art der Zusamenstellung viel zu lange dauert. Daher habe ich das ganze gesplittet.

Der erste "Pass" erstellt in mehreren durchläufen (umgehung der 60 Sekunden Skript Grenze) das nötige Raster:

$range_min[x]=5.8;
$range_max[x]=17.2;
$range_min[y]=45.8;
$range_max[y]=55.1;

$karte_groesse_x=1400;
$karte_groesse_y=1800;

$rastergruppierung_x=24;
$rastergruppierung_y=24;

$res=mysql_query("SELECT * FROM `com_users`");
$i=0;
while($row=mysql_fetch_array($res)) {
$members[$i++]=$row;
}
$anz=sizeof($members);

if (!$start){
mysql_query("TRUNCATE TABLE `com_geodb_user`");}
if ($end>$anz)
$end = $anz;
for ($i=$start;$i<$end;$i++)
{
$sql="SELECT * FROM `geodb_locations` WHERE `plz` LIKE '%" . $members[$i][zip] . "%';";
$res=mysql_query($sql);
//gibt es den angegebenen Ort ?

if ($res)
{
$r=mysql_fetch_object($res);
if ($r)
{
// Dann Geokoordinaten auf Bildgröße skalieren und absolute X,Y-Koordinaten speichern
$members[$i][x]= floor( ($r->laenge - $range_min[x]) * ($karte_groesse_x / ($range_max[x] - $range_min[x])));
$members[$i][y]= floor( ($r->breite - $range_max[y]) * ($karte_groesse_y / ($range_min[y] - $range_max[y])));
$rest_x=$members[$i][x] % $rastergruppierung_x;
$rest_y=$members[$i][y] % $rastergruppierung_y;
$members[$i][raster_x]=$members[$i][x]-$rest_x+floor($rastergruppierung_x/2);
$members[$i][raster_y]=$members[$i][y]-$rest_y+floor($rastergruppierung_y/2);
mysql_query("INSERT INTO `com_geodb_user` (`gid`, `x` ,`y` ,`raster_x` ,`raster_y` ,`valid`, `geoid`) VALUES ('" . addslashes($members[$i][id]) . "','" . addslashes($members[$i][x]) . "','" . addslashes($members[$i][y]) . "','" . addslashes($members[$i][raster_x]) . "','" . addslashes($members[$i][raster_y]) . "','1', '" . addslashes($r->id) . "');");
}
}
}
?><a href="map.php?start=<?=$start+100?>&end=<?=$end+100?>">weiter</a><?

Im zeiten "Pass" wird einfach nur nach das Raster angezeigt was wir vorher in der vorher fehlenden Tabelle gespeichert haben.

$sql="SELECT com_users.id,com_users.name, com_users.zip, com_geodb_user.*," . $lan2 . "
IF(geodb_locations.ortsteil!='',CONCAT(geodb_locations.ort,' / ',geodb_locations.ortsteil),geodb_locations.ort) as stadt, geodb_locations.adm1 as bundesland,geodb_locations.kfz as kfz,geodb_locations.ort as ort,geodb_locations.name_int as urlort,
CONCAT(raster_y,'_',raster_x) as raster
FROM com_users
LEFT JOIN com_geodb_user ON com_geodb_user.gid = com_users.id
LEFT JOIN geodb_locations ON geodb_locations.id = com_geodb_user.geoid "
. $lan . $user2 . "
ORDER BY raster ASC;";

// echo $sql;

//Query ausführen
$res=mysql_query($sql);
$num=mysql_num_rows($res);

//Variablen initialisieren
$oldraster=$html="";

//Offsets
$offset_x=-4;

[...]

//Jetzt die Daten durchlaufen
for($i=0;$i<$num;$i++)
{
//Datensatz holen
$a=mysql_fetch_array($res);
$combi=$a['combi'];

//Gruppierung
$raster=$a['raster'];
//Neues Raster ? dann html löschen und alte Gruppierung ausgeben
if($oldraster!=$raster) {
if($i>0 && $html!="") {
//nicht beim ersten mal, daher muss $i grösser als 0 sein
Pin($x*$multi+$offset_x,$y*$multi+$offset_y,$html,$pin, ""); //Pin zeichnen
}
$html=""; //Ausgabe löschen
$count=0;
}

//Wenn combi=1 gibt es mehrere im Planquadrat
$x=($combi==0) ? $a[x]:$a[raster_x];
$y=($combi==0) ? $a[y]:$a[raster_y];

if ($count < 30)
$html.= $a[name] . " - " . $a[stadt] . "<br>";
elseif ($count == 30)
$html.= "[...]";

$ort="";
if ($user_id2)
$ort = $a[stadt];

$count++;
$pin = "pin.gif";
if ($count >= 10)
$pin = "pin2.gif";
if ($count >= 30)
$pin = "pin3.gif";

//schauen, ob ausgegeben werden soll (Einzelpin), sonst aufsparen (Combi)
if($combi==0 || $i==($num-1)) {
Pin($x*$multi+$offset_x,$y*$multi+$offset_y,$html,$pin, $ort); //$a[zip]);
$html=="";
}

Der erste Schritt (erstellen des Rasters) ist nur einmal nötig, dahe habe ich bei der Änderung der Postleitzahl von einem User eine Funktion geschrieben, die der oberen gleicht, und nur für den User aktualisiert.

Das Resultat könnt ihr hier sehen:

http://www.greenmilelan.de/index.php?module=user&file=map.php

Der Quellcode ist natürlich so wie er da steht nicht lauffähig, da er herausgeschnippelt ist, aber wer das selbst umsetzen möchte sollte genug Hilfe erhalten haben ;).