Auslesen der des Hosts und anschließendes Filtern und Ordnen nach Ländern usw.

Johnnii360

Erfahrenes Mitglied
Servus Leuts!

Ich hab hier ein Problem, dass ich durch etliche Versuche immer noch nicht beheben konnte. Selbst mein Kumpel hat es nicht geschafft.

Das Script sieht so aus, das es den Host der User ausließt und dann auflistet. Anschließend soll .de, .com, .at usw. rausgefiltert werden, um die Besucher nach Ländern und Organisationen zu sortieren und zu ermitteln.

Hier der gesamte Code wie er momentan aussieht.

PHP:
<table width="500" align="center" style="border: 1px solid #999999; background-color: #FFFFFF;">
  <tr>
    <td height="22" class="titlebg" colspan="4">&nbsp;L&auml;nder und Organisationen </td>
  </tr>
  <?php
  $Hintergrundfarbe = "";
  
  $laenderliste = array('.de', 'localhost');
  
  for($i = 0; $i < count($laenderliste); $i++)
  {
  		$lanorga = mysql_query("SELECT * FROM ".$tabname_visitorstatistics." GROUP BY host LIKE '%".$laenderliste[$i]."%'") or die(mysql_error());
  }
  
  if(mysql_num_rows($lanorga) > 0)
  {
      for($i2 = 0; $i2 < mysql_num_rows($lanorga); $i2++)
	  {
			// Auslesen der Daten
			//
			$lano = mysql_fetch_assoc($lanorga);
			
			
			for($i3 = 0; $i3 < count($laenderliste); $i3++)
  			{
  				$lanorga2 = mysql_query("SELECT * FROM ".$tabname_visitorstatistics." WHERE host LIKE '%".$laenderliste[$i3]."%'") or die(mysql_error());
  			}
			
			// Festlegen der Tabellenfarbe
			//
			if($Hintergrundfarbe == "#FFFFFF")
			{
				$Hintergrundfarbe = "#F3F3F5";
			}
			else
			{
				$Hintergrundfarbe = "#FFFFFF";
			}
  ?>
  <tr style="background-color: <?php echo"".$Hintergrundfarbe."";?>;">
    <td width="155" height="22">&nbsp;<?php echo"".$lano['host']."";?></td>
    <td width="50" height="22" align="center"><?php echo"".mysql_num_rows($lanorga2)."";?></td>
    <td width="50" height="22" align="right"><?php echo"".round(100/mysql_num_rows($visitors)*mysql_num_rows($lanorga2), 2)."&nbsp;%";?>&nbsp;</td>
    <td height="22" align="center"><img src="../images/admin_elements/gradients/blue.png" width="<?php $balkcolo = round(100/$maxgroesse*mysql_num_rows($lanorga2), 0); echo $balkcolo;?>" height="9" border="0" alt="" style="vertical-align: middle;"><img src="../images/admin_elements/gradients/light.png" width="<?php echo $maxgroesse-$balkcolo;?>" height="9" border="0" alt="" style="vertical-align: middle;"></td>
  </tr>
  <?php
  		}
  }
  else
  {
  ?>
  <tr>
    <td height="40" colspan="4" align="center"><img src="../images/messagebox_elements/icons/icon_info_small.png" width="16" height="16" border="0" alt="" style="margin-right: 5px; vertical-align: middle;">Es waren leider (noch) keine Besucher online.</td>
  </tr>
  <?php
  }
  ?>
</table>

Was ich hinbekommen habe ist, dass die Länder nun korrekt aufgelistet und gruppiert werden. Allerdings happerts bei der Anzeige der jeweilig erfassten Länder ($lanorga2). Sowohl bei .de als auch bei localhost wird 8 für die loclahost angezeigt. Allerdings müssens 2 .de und 8 localhost sein.

Ich bitte daher um eure Hilfe. Danke breits im Voraus! :)
 
- DB-Struktur?
- print_r($lano);

PHP:
for($i3 = 0; $i3 < count($laenderliste); $i3++)
              {
                  $lanorga2 = mysql_query("SELECT * FROM ".$tabname_visitorstatistics." WHERE host LIKE '%".$laenderliste[$i3]."%'") or die(mysql_error());
              }
umwandeln zu:
PHP:
for($i3 = 0; $i3 < count($laenderliste); $i3++)
              {
                  $lanorga2 = mysql_query("SELECT * FROM ".$tabname_visitorstatistics." WHERE host LIKE '%".$laenderliste[$i3]."%'") or die(mysql_error());
                  print_r($lanorga2);
              }

Jetzt mal die Ausgabe posten!
Achja, ein "ERROR_REPORTING(E_ALL);" am Anfang des Scriptes kann auch immer helfen.

Tipp zur optimierung des Codes:
- mysql_num_rows($lanorga) oder andere Funktionen (glaube noch count()) führst du mehrere male mit der selben Variable aus - einfach mal so machen: "$numLanorga = mysql_num_rows($lanorga)" und dann $numLanorga aufrufen, anstelle der Funktion.
- Du machst zweimal fast den gleichen Query - einer würde doch reichen? (Resultat vom ersten weiterbenützten)
 
Danke für die Hilfe! :)

Also

PHP:
ini_set('display_errors', 1);
error_reporting(E_ALL);

ist bei mir standartmäßig immer drin.

Hier die Ausgabe von "print_r();":

$lanorga

Resource id #63Resource id #64

$lano

Array ( [id] => 9 [date_dayname] => Wed [date_day] => 25 [date_month] => 04 [date_year] => 2007 [time_hour] => 10 [time_minute] => 06 [time_second] => 39 [ip] => 127.0.0.1 [host] => pD9E5A902.dip0.t-ipconnect.de [engine] => Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1 [browser] => Firefox [browserversion] => 2.0 [osystem] => Windows [osystemversion] => XP [resolution] => 1280x1024 [colordepth] => 32 [referer] => [refererdomain] => ) Array ( [id] => 1 [date_dayname] => Wed [date_day] => 18 [date_month] => 04 [date_year] => 2007 [time_hour] => 17 [time_minute] => 31 [time_second] => 46 [ip] => 127.0.0.1 [host] => localhost [engine] => Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1 [browser] => Firefox [browserversion] => 2.0 [osystem] => Windows [osystemversion] => XP [resolution] => 1280x1024 [colordepth] => 32 [referer] => [refererdomain] => )

$lanorga2

Resource id #65Resource id #66 Resource id #67Resource id #68

Danke für die Optimierungsinfo. Gleich eingebaut. ;)

Die Struktur der DB? Reicht doch der Name des Feldes oder? :) Der lautet "host".
 
Habs gesehen:
Bei
PHP:
for($i3 = 0; $i3 < count($laenderliste); $i3++)
              {
                  $lanorga2 = mysql_query("SELECT * FROM ".$tabname_visitorstatistics." WHERE host LIKE '%".$laenderliste[$i3]."%'") or die(mysql_error());
              }
ist am Ende (nach dem Durchlaufen der for Schleife) nur der letzte Wert darin gespeichert, bzw. die Letzte Ressource Drinn! -> Bei jedem Aufruf der "grossen" for-Schleife wird die Ressource die selbe sein!
Lösung: for schleife entfernen, dass nur noch
PHP:
$lanorga2 = mysql_query("SELECT * FROM ".$tabname_visitorstatistics." WHERE host LIKE '%".$laenderliste[$i3]."%'") or die(mysql_error());
steht.

Hmm... aber nachher machst du mit dieser Ressource:
PHP:
<td width="50" height="22" align="center"><?php echo"".mysql_num_rows($lanorga2)."";?></td>

Warum nicht schon den ersten Query zu folgendem ändern:
PHP:
for($i = 0; $i < count($laenderliste); $i++)
  {
          $lanorga = mysql_query("SELECT * , COUNT(host) AS 'hostCount' FROM ".$tabname_visitorstatistics." GROUP BY host LIKE '%".$laenderliste[$i]."%'") or die(mysql_error());
  }
Und dann später der Aufruf:
PHP:
<td width="50" height="22" align="center"><?php echo $lano['hostCount'];?></td>
Dann kannst du dir den oben genannte Query (mit $lanorga2 und der fehlerhaften for-Schleife) ersparen!
 
Wieder was dazu gelernt. :) Danke! *freu*
Ich lerne besser mit praktischen als mit theoretischen Dingen. ;)

Hab nochmals vielen Dank! Nun kann ich endlich meine Arbeit an dem Script fortsetzen. :]
 
Okay, nun hab ich aber noch das Problem... Wie gebe ich die Variable für das Land des jeweiligen Eintrags aus um es dann durch den Ländernamen zu ersetzen? Verstehste wie ich das meine?

EDIT:

Habs schon. :)

EDIT#2:

Wie siehts denn mit dem Suchmuster aus, wenn in der Array z.B. ".de" => "Deutschland" steht? Irgendwie bekomm ich das mit dieser Array nicht gebacken. Habs schon mit key() versucht oder mit $laenderliste[$key]. Hat aber alles nichts funktioniert.

Da heißts dann z.B. "Notice: Undefined offset: 0 in visitorstatistics.php on line 1082" und in Zeile 1082 steht "$lanorga = mysql_query("SELECT * , COUNT(host) AS 'hostCount' FROM ".$tabname_visitorstatistics." GROUP BY host LIKE '%".$laenderliste[$i]."%'") or die(mysql_error());".

Bitte nochmals um Hilfe.
 
Zuletzt bearbeitet:
Zurück