Hilfe - Suche - Mitglieder - Kalender
Vollansicht: PHP-Frage
HTML-Editor phase 5 Support > Fragen, Lösungen zu HTML-Problemen bzw. Webdesign-Fragen - Talk > HTML
Conny
Moin Gemeinde!

Auf verschiedenen (php) Seiten auf meiner Homepage werden die Seitenbesuche gezählt (php-Zähler schreibt in log-Datei; Log-Datei wird ausgelesen und gibt Ergebnis raus.).
Um die Seitenbesuche alle auf einmal überblicken zu können, habe ich eine PHP-Seite gebastelt, die einfach die Log-Dateien der Seiten ausliest, die ein php-Counter haben. Das Ergebnis wird dann in einer Tabelle untereinander ausgegeben.
So weit, so gut.

Nun möchte ich aber, mit meinen bescheidenen php-Kenntniss, daß nicht nur ausgelesen wird, sondern, daß auch sortiert wird!
Also, alle Log-Dateien werden ausgelesen, die Seite stellt die Ergebnisse so da, daß das schlechteste Ergebnis (=die kleinste Zahl) oben steht.

Ich bin überzeugt, daß das geht!
Aaaber, WIE stelle ich sowas an?

cu
Conny
hondocrx
Hilfreich wäre es wenn Du den Quellcode Deiner "Auswert-Seite" posten könntest.

Auch die STtuktur der LOG-Datei ist nicht uninteressant.


MfG hondocrx
db
http://www.php-faq.de/q/q-arrays-sortieren.html

Hier ein Link.
Conny
Hallo hondocrx,
die Code ist nichts anders als eine Tabelle in der die Log-Datei aufgerufen wird.
Hier ein Ausschnitt:
HTML
<TABLE BORDER="0" CELLPADDING="20" SUMMARY="Plazierungstabelle">
<TR>
<TH>Counterdatum</TH>
<TH>Hits</TH>
<TH>Link</TH>
</TR>
<TR>
<TD><B>Counter:</B> Bilder vom Brand:<BR><B>Seit:</B> 17. Okt. 2004</TD>
<TD>&nbsp;<?php include('/home/www/web784/html/scripts/count/brand/counter.log');
?></TD>
<TD><A HREF="../../../galerie_brand.php" TARGET="_blank">galerie_brand.php</A></TD>
</TR>
<TR>
<TD><B>Counter:</B> Bilder Feriencamp<BR><B>Seit:</B> 14. Okt. 2004</TD>
<TD>&nbsp;<?php include('/home/www/web784/html/scripts/count/camp/counter.log');
?></TD>
<TD><A HREF="../../../galerie_camp.php" TARGET="_blank">galerie_camp.php</A></TD>
</TR>
<TR>
<TD><B>Counter:</B> Bilder Herbstturnier<BR><B>Seit:</B> 14. Okt. 2004</TD>
<TD>&nbsp;<?php include('/home/www/web784/html/scripts/count/herbst/counter.log');
?></TD>
<TD><A HREF="../../../galerie_herbst.php" TARGET="_blank">galerie_herbst.php</A></TD>
</TR>
************
usw.


Die Log-Datei ist nichts anderes als eine txt-Datei ohne Code mit nur eine Zahl, die sich immer um eins erhöht, wenn ein Besucher die entsprechende Seite anklickt.

Im Grunde muss das sortier-php-Script die Tabelle neu gestallten; die einzelne <TR>-Abschnitte müßen mit dem ausgelesenen Wert -aus der counter.log- so in die Tabelle zurückgeschrieben werden, daß die kleinst ausgelesene Zahl oben in der Tabelle erscheint.

@Dieter: Danke für den Link, werde mich damit befassen (und hoffe, daß ich *mithalten* kann wink.gif )

cu
Conny
Andreas
Du musst Dir ein Array bauen und dort (z.B.) Name der Datei mit dem korrespondierenden Zähler einbauen. Das sortierst Du dann, und gibst es in einer Schleife aus.

Ich gucke dazu immer in SelfPHP:
Array sortieren: http://www.selfphp.info/funktionsreferenz/...ionen/asort.php

Wobei Array nur 'ne Tabelle ist mit 2 Spalten. Einmal ein Key und ein dazugehöriger Value. Bei Dir wäre Key halt der Name der Seite und Value der Zählerstand. Das kannst Du dann sortieren ... und ausgeben.

Ist ein Abend einlesen und basteln *g*

Grüße

Andreas
Conny
Hi,
nun, die Logik dahinter habe ich verstanden, sowohl bei Dieters als auch bei Andreas Link.
Was mir schwer fällt, ist die richtige Einbindung in der HTML-Code.
Wie definiere ich die Tabelle als Array?
Und wie binde ich $key und $val so ein, daß der echo die Tabelle -oder die Tabellenzeilen?- richtig schreibt, bzw. ausgibt?

cu
Conny (schwer, schwer, schwer)
Andreas
So lese ich z.B. Verzeichnisnamen in ein Array:
HTML
function leseVerzeichnis() {

$verz=opendir ('.');

while ($file = readdir($verz)){
if($file != "." && $file != ".." && substr($file, -4) == ".txt"){

$fp = fopen("$file","r");
flock($fp,2);
$info = trim(fgets($fp,1000));
$kapitel = trim(fgets($fp,1000));
flock($fp,3);
fclose($fp);

$speicher[$kapitel] = $file;

}
}
closedir($verz);

ksort($speicher);
$speicher = array_values($speicher);

return $speicher;

}

Bei Dir könnte $kapitel der Zählerstand sein (danach möchtest Du ja sortieren) und $file ist halt der Dateiname. Nur $speicher = array_values($speicher); musst Du weglassen ... damit verwandelst würdest Du $kapitel weglöschen und der Reihe nach Durchnummerieren. Das willst Du ja nicht!

Grüße

Andreas
Conny
hi,
ich dachte mehr an:
  1. lese Log-Datei 1 (function)
  2. lese Log-Datei 2
  3. lese Log-Datei usw.
  4. Sortiere das was gelesen wurde von klein nach groß (asort)
  5. Schreibe das Ergebnis in einer Tabelle (echo)
Sicherlich Laienhaft dagestellt, aber zeigt vielleicht wo ich hin möchte.
Wenn ich den Bereich (array) -in der die Zahlen gesucht werden- Vorher festlege , wo soll denn nachher das Ergebnis hinein geschrieben werden?
Im gleichen Array (wird also nach auslesen überschrieben?)

Conny (noch kein Durchblick...)
hondocrx
zweiter Versuch mit meinem Script. War schon ein wenig spät.

Das Problem bei Dir ist, das Du die verschiedensten Texte (Bilder Feriencamp, Bilder vom Brand, usw) mitsortieren musst.

Nun ist die Frage wie oft diese Statistik aufgerufen wird.
Bei stetigem Benutzen empfehle ich eine MySQL-DB für den Counter und die Ausgabetexte.

Das untenstehende Script arbeitet mit deinen Logfiles. Ist deswegen aber auch etwas umständlich.

Diesen Code bitte einfügen nach <TH>Link</TH></TR>

und vor </table>


MfG

QUELLTEXT
<?

//
//  einlesend er Logfiles in die entsprechenden Arrays
//
$brand_array    =file('/home/www/web784/html/scripts/count/brand/counter.log');
$camp_array     =file('/home/www/web784/html/scripts/count/camp/counter.log');
$herbst_array   =file('/home/www/web784/html/scripts/count/herbst/counter.log');

//
//   test mit lokalen Dateien
//
//   $brand_array    =file('brand.log');
//   $camp_array     =file('camp.log');
//   $herbst_array  =file('herbst.log');

//
//   Übergeben des Quelltextes  --> $xxxx1 ist vom <TR> bis vor den Counterwert
//   Übergeben des Quelltextes  --> $xxxx2 ist vom Counterwert bis zum </TR>
//
$brand1='<TR><TD><B>Counter:</B> Bilder vom Brand:<BR><B>Seit:</B> 17. Okt. 2004</TD><TD>&nbsp;';
$brand2='</TD><TD><A HREF="../../../galerie_brand.php" TARGET="_blank">galerie_brand.php</A></TD></TR>';

$camp1='<TR><TD><B>Counter:</B> Bilder Feriencamp<BR><B>Seit:</B> 14. Okt. 2004</TD><TD>&nbsp;';
$camp2='</TD><TD><A HREF="../../../galerie_camp.php" TARGET="_blank">galerie_camp.php</A></TD></TR>';

$herbst1='<TR><TD><B>Counter:</B> Bilder Herbstturnier<BR><B>Seit:</B> 14. Okt. 2004</TD><TD>&nbsp;';
$herbst2='</TD><TD><A HREF="../../../galerie_herbst.php" TARGET="_blank">galerie_herbst.php</A></TD></TR>';

//
//   Übergen der Daten in ein Mehrdimensionales Array
//   Kann nach belieben erweitert werden, die Reihenfolge muss beachtet werden
//

$anzahl = array (array($brand_array[0],$camp_array[0],$herbst_array[0]),array($brand1,$camp1,$herbst1),array($brand2,$camp2,$herbst2));


//
//   sortieren der Couterwerte, heir aufsteigend. Soll zuerst der größte wert
//   ausgegeben werden muss SORT_ASC durch SORT_DESC ersetzt werden
//

array_multisort ($anzahl[0], SORT_ASC, SORT_NUMERIC,$anzahl[1],$anzahl[2]);


//
//   Ausgabe des Quellcodes und der Counterwertes  
//   Muß nicht angepasst werden. Egal wie viele Logs eingelesen werden
//

for ($i=0;$i<count($anzahl[0]);$i++)
   {
echo $anzahl[1][$i];
echo $anzahl[0][$i];
echo $anzahl[2][$i];
   }
?>
Conny
Hallo hondocrx,
die ersten Gehversuche sind vielversprechend! biggrin.gif

Mit Deiner Vorlage bin ich -glaube ich- in der Lage die Tabelle so weiter auszubauen bis alle Counterlinks richtig plaziert sind.
Vielen Dank icon13.gif

Bei weiteren Fragen, bin ich so frei und melde mich wieder smile.gif

Zu Deiner Anmerkungen:
Es handelt sich hier um eine art 'Kontrol-Seite' meinerseits und wird nicht so oft aufgerufen (wenn, dann auch nur von mir). Ich möchte bei diesen Bilder-Seiten nur ein wenig Überblick behalten. Wenn sie irgendwann kaum noch besucht werden (Wenn alle sich an den Bilder Satt gesehen haben) kommt die Seite raus und wird ausgetauscht gegen eine neue Bildergalerie-Seite.
Daher auch das Datum 'seit dem so-und-so-vielsten' .

cu
Conny
Conny
Sodele,
da bin ich wieder.
Tabelle umgeschrieben, hochgeladen und alles klappt wunderbar! biggrin.gif

hondocrx nochmal vielen Dank für Deine Vorlage icon13.gif

cu
Conny
Conny
Hallo,
ein kosmetischer Tipp habe ich noch bekommen, die möchte ich euch nicht vorenthalten:

Da in der Log-Datei nur ein einziger Wert steht (nur die Zahl), kann man diesen wert auch als String laden.
Das gibt ein Array im Array weniger.
Aus:
$brand_array =file('/home/www/web784/html/scripts/count/brand/counter.log');
wird dann:
$brand =file_get_contents('/home/www/web784/html/scripts/count/brand/counter.log');
Weiter unten dann:
$anzahl = array (array($brand,$camp,$herbst),array($brand1,$camp1,$herbst1),array($brand2,$camp2,$herbst2));


cu
Conny
hondocrx
Hi Conny!

Geht natürlich auch. Hat aber den Nachteil das bei meinen Logs fast immer Kommentare mit drin stehen. ( In meinem Fall nutzte ich diese Einträge als einfachen Kopierschutz der gerne übersehen wird).
Somit kann man den Befehl nur nutzen wenn man weiß wie die Datei geschrieben wird

Desweiteren wird kein Array gespart. Du übergibts ja kein Array sondern einen Wert.

MfG

PS: Dein Kontaktformular funktioniert nicht richtig. Die Umlaute werden abgelehnt obwohl diese mitlerweile erlaubt sind. (gerd@mueller.de war ich)

Kurz zu den Bildern (hier Feuer). Eventuell könntest Du diese vom Speicherbedarf her verkleinern. über 100 kB für diese Größe ist ganz schön fett.
Conny
Hi,
ZITAT(hondocrx @ 01.02.2005 - 23:27)
Dein Kontaktformular funktioniert nicht richtig. Die Umlaute werden abgelehnt obwohl diese mitlerweile erlaubt sind. (gerd@mueller.de war ich)


Ja, und nein!
Das Formular ist richtig, ich lehne die Umlaute absichtlich ab,
weil (nicht lachen!), wenn die e-Mail Adresse einen Umlaut erhält und ich sie im Adressbuch aufnehme, gibt es probleme beim Verwenden diese e-Mail Adressen!
(Outlook Expres eben)
Frag mich aber blos nicht warum das so ist!
Ich hatte auch keine Lust es heraus zu finden, so habe ich kurzer Hand das Formular 'beigestellt'.
cu
Conny
Conny
Hi nochmal,
ZITAT
Kurz zu den Bildern (hier Feuer). Eventuell könntest Du diese vom Speicherbedarf her verkleinern. über 100 kB für diese Größe ist ganz schön fett.


Stimmt, auch da hast Du recht, mit DSL fällt das halt nicht so auf.
Ich habe es grad geändert.
cu
Conny
Auge
Hallo

ZITAT(hondocrx @ 01.02.2005 - 23:27)
PS: Dein Kontaktformular funktioniert nicht richtig. Die Umlaute werden abgelehnt obwohl diese mitlerweile erlaubt sind.

Mal abgesehen davon, dass Conny schon schrieb, dass er das so will, wenn du die Emailadresse nach der Eingabe prüfen willst, bekommst du mit den Umlauten Schwierigkeiten.

Ich rede hier nicht von einer Prüfung, ob ein @ vorhanden ist, sondern von einer Prüfung, die kontrolliert, ob der übergebene String dem Standard für Emailadressen entspricht (Welche Zeichen dürfen an welcher Stelle vorkommen).

Und da bist du bei Umlautdomains erschossen. Es sind ja nicht nur die deutschen Umlaute erlaubt, sondern z.B. auch arabische, hebräische, chinesische und japanische Buchstaben/Zeichen.

Ich habe bisher noch keine Routine gesehen, die das abfangen kann.

Dort, wo bei mir Emailadressen eingegeben werden können, schreibe ich dazu, dass Adressen von Umlautdomains nicht akzeptiert werden. Wie der Benutzer darauf reagiert, ob mit Angabe einer anderen Adresse oder überhaupt keine Adressangabe, ist dann seine Sache.

Tschö, Auge
Conny
Hi Auge!

Yep, stimmt schon so,
das hier ist der String,
HTML
if (ereg("^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+\.)+([a-zA-Z]{2,3})$", $mail))

der die e-Mail Eingabe kontroliert.

cu
Conny
hondocrx
Soweit haben ja alle Recht. Nru sollte man etwas abwägen für wehn die Seite gedacht ist. So sind hebräische Adressen ja weitestgehend auzuschließen. Da sollte man schon abwägen. Umlaute sind imo noch machbar.

Den Test auf info-Domains würde ich aber schon noch einbauen.



MfG
Auge
Hallo
ZITAT(Conny @ 02.02.2005 - 15:37)
das hier ist der String,
HTML
if (ereg("^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+\.)+([a-zA-Z]{2,3})$", $mail))

der die e-Mail Eingabe kontroliert.

Ehhm:
Was machst du mit TLD's mit mehr als 3 Buchstaben? Mit 6 Zeichen ist die Längste mir bekannte: museum.

Mein regex:
QUELLTEXT
preg_match("/^([a-zA-Z0-9]{1,}([\.]?|[-]?|[_]?))*[a-zA-Z0-9]{1,}@([a-zA-Z0-9]{1,}([\.]?|[-]?))*[a-zA-Z0-9]{1,}\.{1}[a-zA-Z]{2,6}$/",$mail)

Meiner ist länger! devlish.gif wink.gif
ZITAT(hondocrx @ 02.02.2005 - 17:25)
... Nru sollte man etwas abwägen für wehn die Seite gedacht ist. So sind hebräische Adressen ja weitestgehend auzuschließen. Da sollte man schon abwägen. Umlaute sind imo noch machbar.

Kennst du jemanden, der eine Emailadresse einer Umlautdomain, aber keine Emailadresse einer Nicht-Umlaut-Domain hat?

Ich habe bisher nur Abratendes gelesen, und kenne eben Niemanden, der obige Frage bejahen könnte. Wer sich ausschließlich auf eine Emailadresse einer Umlautdomain verlässt, wird jedenfalls von mir schlicht ignoriert.

Tschö, Auge
Conny
Hi Auge,
ZITAT(Auge)
...Wer sich ausschließlich auf eine Emailadresse einer Umlautdomain verlässt, wird jedenfalls von mir schlicht ignoriert....


Amen!

Im Übrigen habe ich mal Dein 'regex' übernommen, meine war éh schon etwas älter wink.gif

cu
Conny
Dieses ist eine vereinfachte Darstellung unseres Foreninhaltes. Um die detaillierte Vollansicht mit Formatierung und Bildern zu betrachten, bitte hier klicken.
Invision Power Board © 2001-2024 Invision Power Services, Inc.