sortieren und ausgabe

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • sortieren und ausgabe

    hi. ich würde gern daten per php sortieren und dann ausgeben.
    Die Daten sind IP' in einer MySQL die ausgelesen werde. Mithilfe der GEOIP.dat wird dann jeder IP dem entsprechendem Land zugewiesen.
    Nun möchte ich die Länder (nicht die IP's) zählen lassen und ausgeben.
    Da die Länder nicht in der MySQL angegeben sind, müsste ich sie per PHP sortieren lassen.

    PHP-Code:
    $anzahl 10;
    $i 1;
    $result $database -> query("SELECT player_ip FROM banhistory");
        while((
    $num=$database -> fetch_array($result)) && ($i <= $anzahl)) {
        
    $gi geoip_open("GeoIP.dat",GEOIP_STANDARD);
        
    $cc geoip_country_code_by_addr($gi$num[player_ip]);
        
    $cn geoip_country_name_by_addr($gi$num[player_ip]);
        
    geoip_close($gi);

    $stats .= "<tr>
        <td width=\"1%\" align=center>"
    .$i."</td>
        <td width=\"30%\">&nbsp;<img src=\"images/"
    .$cc.".gif\" border='0'> ".$cn."</td>
                    <td width=\"12%\" align=\"center\">"
    .count($cc)."</td></tr>"
    Zuletzt geändert von KnuddelArko; 15.03.2006, 19:25.



  • #2
    super beschreibung. wo das problem liegt, dürfen wir selbst raten?

    ich nehme an, du hast gar keine ahnung, wie das gehen soll?
    nun ja, die antwort der db in ein array (u.u. mehrdimensional) einlesen. d.h. $num muss am ende alle infos beinhalten. die ausgabe dagegen musst du aus der while-schleife rausnehmen.

    dann sortierst du das array $num nach dem namen ($cn? auch das darf erraten werden?) - schau dir unter www.php.net/array die sortiermöglichkeiten an (etwa array_multisort()).

    dann gibst du es aus (in etwa so, wie es gerade funktioniert).

    Kommentar


    • #3
      $cc gibt den Ländercode anhand der IP aus
      $cn gibt den Ländernamen anhand der IP aus

      Ich wollte es so:

      IP auslesen aus der DB -> IP den entsprechenden Ländercode und Namen zuweisen -> Anzahl der Länder ausgeben (zB 22 mal DE, 13 mal DK ect)

      da er aber die Länder erst nach dem auslesen der DB zuweisen kann, finde ich keine Möglichkeit diese zusammen zu fassen. Momentan gibt er es so aus:

      1. DE 22
      2. DK 13
      3. DE 12
      4. DE 8
      5. DK 7
      6. US 6
      7. US 6
      8. DE 3
      9. HU 1
      10. HU 1

      wollte es aber gern die einzelnen Länder zusammengefasst haben und nicht einzeln wie oben. Und das ist mein prob. Sorry wenn ich mich zu kompliziert ausgedrückt habe


      Kommentar


      • #4
        da er aber die Länder erst nach dem auslesen der DB zuweisen kann, finde ich keine Möglichkeit diese zusammen zu fassen
        deswegen meine ich - erst auslesen, damit du alle datensätze in einem array hast - dann anhand des landesnamens zusammenfassen.

        Kommentar


        • #5
          nur wie soll ich es auslesen? die IP's sind in einer DB und die Ländernamen in einer Datei namens Geoip.dat. Die IP's auslesen ist ja kein prob aber das andere wird schon schwieriger.


          Kommentar


          • #6
            PHP-Code:

            $temp 
            = array();
            result $database -> query("SELECT player_ip FROM banhistory");
            while((
            $num=$database -> fetch_array($result)) && ($i <= $anzahl)) {
                
            $gi geoip_open("GeoIP.dat",GEOIP_STANDARD);
                
            $cc geoip_country_code_by_addr($gi$num[player_ip]);
                
            $cn geoip_country_name_by_addr($gi$num[player_ip]);
                
            geoip_close($gi);
                
            $temp[] = array($num['player_ip'],$cc,$cn);
                
            }
            $tamp = array();
            foreach(
            $temp as $value){
                if(
            count(array_keys($tamp,$value[1])) === 0){
                    
            $tamp[] = $value[1];
                    echo 
            'Anzahl IPs aus '.$value[2].' : '.count(array_keys($temp,$value[1]));
               }else{
                    continue;
               } 
            Code ist nicht getestet müsste aber imho funzen

            Gruss

            tobi
            Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

            [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
            Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

            Kommentar


            • #7
              hui so funzt es schonmal, leider gibt er keine Zahl aus

              PHP-Code:
              echo 'Anzahl IPs aus '.$value[2].' : '.count(array_keys($temp,$value[1])); 
              $value[2] wird aber erkannt


              Kommentar


              • #8
                hui so funzt es schonmal, leider gibt er keine Zahl aus
                Dann probier folgendes:
                PHP-Code:
                [...]
                $tamp = array();
                foreach(
                $temp as $value){
                    
                var_dump($value);
                    
                /*
                    if(count(array_keys($tamp,$value[1])) === 0){
                        $tamp[] = $value[1];
                        echo 'Anzahl IPs aus '.$value[2].' : '.count(array_keys($temp,$value[1]));
                   }else{
                        continue;
                   }*/ 
                Kommen nun bei jeder Ausgabe alle drei Elemente vor ? D.h. Indecies 0 - 3 ?
                Ich vermute das Problem liegt an der zweiten Dimension des Arrays. Ich habe bei php.net eine Funktion gefunden, welche diese mehrdimesionalen besser abarbeiten kann.
                Ich würde versuchen, diese Funktion einzubauen...

                Gruss

                tobi
                Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                Kommentar


                • #9
                  bekomme ich folgende ausgabe:

                  Code:
                  array(3) { [0]=> string(0) "" [1]=> string(0) "" [2]=> string(0) "" }
                  array(3) { [0]=> string(13) "141.41.96.111" [1]=> string(2) "DE" [2]=> 
                  string(7) "Germany" } array(3) { [0]=> string(13) "194.255.6.253" [1]=> 
                  string(2) "DK" [2]=> string(7) "Denmark" } array(3) { [0]=> string
                  (13) "85.29.225.154" [1]=> string(2) "EE" [2]=> string(7) "Estonia" } array
                  (3) { [0]=> string(13) "84.193.115.46" [1]=> string(2) "BE" [2]=> string
                  (7) "Belgium" } array(3) { [0]=> string(13) "213.64.221.36" [1]=> string
                  (2) "SE" [2]=> string(6) "Sweden" } array(3) { [0]=> string(13) "158.193.82.87"
                  [1]=> string(2) "SK" [2]=> string(8) "Slovakia" } array
                  (3) { [0]=> string(11) "82.239.2.21" [1]=> string(2) "FR" [2]=> string
                  (6) "France" } array(3) { [0]=> string(13) "84.248.17.106" [1]=> string
                  (2) "FI" [2]=> string(7) "Finland" } array(3) { [0]=> string
                  (13) "87.239.57.248" [1]=> string(2) "PL" [2]=> string(6) "Poland" }
                  Wer kann da durchsehen?^^ Wohl nur nen Profi.
                  Ich poste mal das komplette Script, so wie ich es am laufen hatte. Vllt ist auch da irgendwo der Wurm drin.

                  PHP-Code:
                  //############### Beginn by Country

                  $anzahl 10//maximale Anzahl an Einträgen
                      
                  $i 1;
                      
                  $temp = array();
                      
                  $result $database -> query("SELECT player_ip, COUNT(*) AS votes 
                  FROM banhistory GROUP BY player_ip ORDER BY votes DESC LIMIT 0,
                  $anzahl"); //auslesen der IP's
                      
                  while(($num=$database -> fetch_array($result)) && ($i <= $anzahl)) {
                      
                  $gi geoip_open("GeoIP.dat",GEOIP_STANDARD); //GeoIP.dat öffnen
                      
                  $cc geoip_country_code_by_addr($gi$num['player_ip']); // auslesen des Ländercode einer IP
                      
                  $cn geoip_country_name_by_addr($gi$num['player_ip']); // auslesen des Ländernamens einer IP
                      
                  geoip_close($gi); //GeoIP.dat schliessen
                      
                  $temp[] = array($num['player_ip'],$cc,$cn);

                  }
                  $tamp = array();
                  foreach(
                  $temp as $value){
                      if(
                  count(array_keys($tamp,$value[1])) == 0){
                          
                  $tamp[] = $value[1];
                          
                  $cc3 count(array_keys($temp,$value[1]));

                       
                      if (
                  $value[1] == ""$cc2 ""//Keine Flagge wenn IP nicht vorhanden
                      
                  else $cc2 "<img src=\"flags/".$value[1].".gif\" border='0'>"//Flagge anhand der IP bestimmen
                      
                      
                  if ($cc2 == "") { //keine Flagge vorhanden
                      
                  $cc3 "";       //dann $cc3 nicht ausgeben
                  }else{  
                      
                  //wenn Flagge vorhanden
                      
                  if($i=="1" AND $cc3!="0") {
                  $multip 98 $cc3
                      }    
                  $grafik "<img src=\"images/vote_middle" $i ".gif\" width=\"" $cc3*$multip "%\" height=\"9\" border=0>
                  <img src=\"images/vote_right" 
                  $i ".gif\" height=\"9\" border=0>";
                  $stats .= "<tr>
                      <td width=\"1%\" align=center><b><font size=1>"
                  .$i."</td>
                      <td width=\"30%\">&nbsp;<b><font size=1>"
                  .$cc2." ".$value[2]."</a></td>
                      <td width=\"12%\" align=\"center\"><b><font size=1>"
                  .$cc3."</td>
                      <td><table width=99%><tr><td>
                  $grafik</td></tr></table></td></tr>";
                  $i++;
                  }
                  }
                  }
                  //############### Ende by Country 
                  Funktioniert auch soweit alles, nur das eben "$cc3" nicht ausgegeben wird.
                  Auch bei Deinem Code.

                  Gruß Nico

                  PS: Danke für Deine Geduld
                  Zuletzt geändert von KnuddelArko; 17.03.2006, 16:04.


                  Kommentar


                  • #10
                    editiere dein post bitte zu einer leserlichen form.

                    Wer kann da durchsehen?
                    jeder, der ein <pre>-tag davor schreibt.

                    Kommentar


                    • #11
                      Wer kann da durchsehen?^^ Wohl nur nen Profi.
                      Code:
                      array(3) { [0]=> string(13) "141.41.96.111" [1]=> string(2) "DE" [2]=> 
                      string(7) "Germany" }
                      Die siehst hier als erste Angabe in dieser Zeile den Typ der Variable, die du nachher printest. In diesem Falle ist das der Inhalt von $value aus deinem Code. Also das Ding ist ein Array und hat drei Elemente. Element[0], also $value[0], ist ein String mit der Länge 13 und dem Inhalt zwischen " und ". Für die restlichen Elemente gilt das analog. Und da $value ja jeweils ein Element des Arrays $temp ist hast du ein mehrdimensionales Array.
                      Nachdem das nun geklärt ist also zu deinem Code
                      PHP-Code:
                      <?php
                      $temp 
                      = array();
                      $i 0;
                      $result $database -> query("SELECT player_ip FROM banhistory");
                      while((
                      $num=$database -> fetch_array($result)) && ($i $anzahl)) {
                          
                      $gi geoip_open("GeoIP.dat",GEOIP_STANDARD);
                          
                      // String Indecies von Arrays immer in ' und '
                          
                      $cc geoip_country_code_by_addr($gi$num['player_ip']); 
                          
                      $cn geoip_country_name_by_addr($gi$num['player_ip']);
                          
                      geoip_close($gi);
                          if(
                      array_key_exists($cc,$temp)){
                              
                      $temp[$cc] += 1;
                          }else{
                              
                      $temp[$cc] = 1;
                          }  
                          
                      $i += 1;
                      }
                      echo 
                      '<table width="70%" align="center" border="1">';
                      foreach(
                      $temp as $key=>$value){
                          echo 
                      '<tr><td>'.$key.'</td><td>'.$value.'</td></tr>';
                      }
                      echo 
                      '</table>';
                      ?>
                      Also so müsste es auf jeden Fall klappen. Kann es aber natürlich nicht testen, weil es deine DB ist

                      Gruss

                      tobi
                      EDIT:

                      Bitte bitte mit Honig oben drauf: Brich deinen Code in den verherigen Post um

                      Zuletzt geändert von jahlives; 17.03.2006, 15:29.
                      Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                      [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                      Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                      Kommentar

                      Lädt...
                      X