Herkunftsland ermitteln

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

  • Herkunftsland ermitteln

    Hallo zusammen!

    Ich habe ein paar Fragen bezüglich der Methode, das Herkunftsland über die IP zu bestimmen.
    Ich möchte von einem fixen Datum (z.B. vom 2005-05-26) die Anzahl der Besucher eines Landes ermitteln.

    Ich verwende diese ip-to-country Tabelle.

    Zusätzlich habe ich eine andere Tabelle, in der ich u.a. die IP des Besuchers speicher.

    Nun weiß ich aber nicht wie ich am besten vorgehen sollte, um am Ende eine Statistik zu bekommen, in der ich dann nachgucken kann wieviele Besucher aus z.B. Deutschland kahmen.

    Denn mein Problem ist, das ich jede Besucher-IP mit der Tabelle abgleichen muss, um das dazugehörige Land zu finden. Im einzelfall kein Problem, doch da mein Ziel eine Statistik ist, weiß ich nicht wie ich Zwischenergebnisse abspeichern soll.

    Hier mein Codeansatz:
    PHP-Code:
        $qry=mysql_query('SELECT ip 
            FROM md_counter_user WHERE 
            YEAR(datum) = '
    .$this->jahr.' AND 
            MONTH(datum) = '
    .$this->monat.' AND 
            DAYOFMONTH(datum) = '
    .$this->tag);

        while(
    $erg=mysql_fetch_object($qry))
            {
            
    $ip=str_replace('.'''$erg->ip);

            
    $qry=mysql_query('SELECT land FROM md_counter_country 
                WHERE ip_von <= '
    .$ip.' AND ip_bis >= '.$ip);
            
    $erg=mysql_fetch_object($qry);
            } 
    Kurze erklärum zum Code:
    md_counter_user = Ist die Besucher IP abgespeicher
    md_counter_country = Ist die ip-to-country Tabelle

    Könnt ihr mir da Tipps geben, wie ich das am Besten angehe.

    Gruß Micha

  • #2
    Re: Herkunftsland ermitteln

    Original geschrieben von Metha
    PHP-Code:
    $ip=str_replace('.'''$erg->ip); 
    Bist du dir sicher, dass das so funktioniert? Hast du dir das mal angeguckt? handbook

    Kommentar


    • #3
      Stimmt, würde nicht zum richtigen Ergebnis führen. Danke
      Zuletzt geändert von Metha; 29.05.2005, 20:26.

      Kommentar


      • #4
        hast du den Inhalt der .csv Datei vorher umgewandelt? Wenn nicht, dann wundert mich das schon, dass das funktioniert..
        Aber für dein Problem würde ein Join helfen, denke ich.
        EDIT:
        Dann überles einfach den ersten Teil von mir ^^

        Kommentar


        • #5
          Was meinst du mit umgewandelt?
          Also die Spalten wurde richtig in meine Tabelle übernommen, als ich sie eingelesen haben.

          Kommentar


          • #6
            Das bezweifel ich nicht, aber die stehen ja nicht in der "typischen" IP-Form da. Das sind umgewandelte IP-Adressen, die du erst mit long2ip in das A.B.C.D Format bringen musst. Kannst natürlich auch (würde meiner Menung nach auch mehr Sinn machen) deine IP Adressen aus der DB mit ip2long konvertieren und dann mit den Einträgen der Ländertabelle vergleichen.

            Kommentar


            • #7
              Also ich habe den Code nochmal überarbeitet, sodass er nun die Ip's richtig Convertiert. ICh weiß jetzt aber nicht, wie ich meine Abfrage ergebnisse vernümftig abspeichern kann und gruppiert ausgeben kann.

              Hier erstmal der Code:
              PHP-Code:
                  // Länderherkunft ermitteln
                  
              $qry1=mysql_query('SELECT ip 
                      FROM md_counter_user WHERE 
                      YEAR(datum) = '
              .$this->jahr.' AND 
                      MONTH(datum) = '
              .$this->monat.' AND 
                      DAYOFMONTH(datum) = '
              .$this->tag);

                  
              $zeilen=array();
                  while(
              $erg=mysql_fetch_array($qry1)){
                  
              $zeilen[]=$erg;}

                  
              $land=array();
                  for(
              $i=0$i<count($zeilen); $i++){
                  
              $qry2=mysql_query('SELECT land 
                      FROM md_counter_country WHERE 
                      inet_aton(\''
              .$zeilen[$i]['ip'].'\') >= ip_von AND 
                      inet_aton(\''
              .$zeilen[$i]['ip'].'\') <= ip_bis');
                  
              $erg2=mysql_fetch_object($qry2);

                  
              //test
                  
              if($erg2)
                      {
                      echo 
              $erg2->land.'<br>';
                      }
                          else{echo 
              'unbekannt<br>';}
                  } 
              Jetzt gibt er mir alle Länder zurück, die in 'md_counter_country' vorkommen! Er gibt mir jetzt aber natürlich alle Länder auch doppelt aus. Meine Frage ist nun, wie ich die abfrage am besten zwischenspeichern, um ein Land um einen Wert zu erhöhen, wenn noch eine Ip darauf zutrifft.

              Meine Idee wäre:
              PHP-Code:
              $land=array($land => $anzahl)
              // Und dann bei erneuten vorkommen
              array_push() 
              Doch leider kann man ein array ja nicht mit array_push um zwei werte erweitern.

              Hat jemand einen Tipp wie ich das am besten angehe? ICh möchte am Ende halt eine HTML-Tabelle mit der anzahl der BEsuchern aus den vorkommenden Länden.

              Gruß Micha

              Kommentar


              • #8
                Original geschrieben von Metha
                Meine Frage ist nun, wie ich die abfrage am besten zwischenspeichern, um ein Land um einen Wert zu erhöhen, wenn noch eine Ip darauf zutrifft.
                $zaehler[$land]++;
                I don't believe in rebirth. Actually, I never did in my whole lives.

                Kommentar


                • #9
                  Kannst du mir das genauer erklären ?

                  Ich bekomme von der IP-Abfrage ein Land geliefert (z.B. Deutschland).
                  Dieses Land möchte ich bei erstvorkommen in einem Array speichern. Also land und anzahl.

                  Kommt das Land nochmal vor, dann soll dieser Arrayeintrag des Landes um 1 erhöht werden.

                  Kommentar


                  • #10
                    Original geschrieben von Metha
                    Kannst du mir das genauer erklären ?
                    *seufz*
                    was brauchst du denn daran noch "genauer"?

                    Kommt das Land nochmal vor, dann soll dieser Arrayeintrag des Landes um 1 erhöht werden.
                    genau das macht obige zeile ja auch.


                    ja, strenggenommen fehlt eine initialisierung, falls noch kein array-eintrag mit dem schlüssel aus $land besteht.
                    aber eine solche bekommst du doch wohl selber hin.
                    I don't believe in rebirth. Actually, I never did in my whole lives.

                    Kommentar


                    • #11
                      Initialisierung bekomme ich hin.
                      Also z.B. so:
                      PHP-Code:
                          if(in_array($erg2->land$land))
                              {
                      $land[$erg2->land]++;}
                                  else{
                      $land[$erg2->land]=1;}

                      echo 
                      $land[$erg2->land]; 
                      Doch hier gibt er mir jeweil wieder alle Einträge einzel aus.
                      Zuletzt geändert von Metha; 30.05.2005, 13:57.

                      Kommentar


                      • #12
                        Original geschrieben von Metha
                        Initialisierung bekomme ich hin.
                        aber nicht so.
                        frage ab, ob schon ein element mit dem schlüssel $land existiert.
                        (derzeit prüfst du auf den wert, aber der soll ja nur den zählerstand enthalten.

                        Doch hier gibt er mir jeweil wieder alle Einträge einzel aus.
                        du solltest die ausgabe ja auch nicht schon während der schleife über die datensätze machen.
                        I don't believe in rebirth. Actually, I never did in my whole lives.

                        Kommentar


                        • #13
                          Stimmt, muss ja so heißen: in_array($land[$erg2->land], $land)
                          Ok, Danke print_r ergibt mir: Array ( [BERMUDA ] => 1 [ITALY ] => 1 [SWEDEN ] => 2 [] => 1 )

                          Damit funktionierts!!!

                          Kommentar


                          • #14
                            Zwei Fragen wären da noch. Wie kann ich dieses Array nach der anzahl der besucher sortieren (Sprich das das Land mit den meißten besuchern oben ist?)

                            Müsste ja mit ksort() gehen, doch ein eindeutiger nummerisch verlaufender Schlüssel fehlt mir ja dann!

                            Und damit auch zu meiner zwiten Frage. Wie kann ich das Array komplett ausgeben. Ohne das ich explezit einen Satz anspreche?

                            Kommentar


                            • #15
                              Original geschrieben von Metha
                              Zwei Fragen wären da noch. Wie kann ich dieses Array nach der anzahl der besucher sortieren (Sprich das das Land mit den meißten besuchern oben ist?)

                              Müsste ja mit ksort() gehen, doch ein eindeutiger nummerisch verlaufender Schlüssel fehlt mir ja dann!
                              Nein. Du willst nicht nach den Keys sortieren, sondern deren Inhalt, daher ist asort die richtige.
                              Und damit auch zu meiner zwiten Frage. Wie kann ich das Array komplett ausgeben. Ohne das ich explezit einen Satz anspreche?
                              foreach sollte dir dabei helfen.

                              Kommentar

                              Lädt...
                              X