88871
Goto Top

PHP Mehrere Sachen aus Textfile auslesen

Hoied

ich logge drei sachen beim login. das schreiben funktioniert auch bestens. der ordner wo geschrieben wird, hat chmod 777

// holen der ip adresse                            
if (!isset($_SERVER['HTTP_X_FORWARDED_FOR']))   
{
$client_ip = $_SERVER['REMOTE_ADDR'];  
}
else 
{
$client_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];  
}

// unixtime
$now = time();

// daten definieren
$text = "". $id . " | " . $client_ip . " | " . $now . " | " ."\n";  

// namen der textdatei definieren, in dem falle die user id
$dateiname = "meinORDNER/" . $id . ".txt";  
                           
// datei zum schreiben öffnen, falls nicht vorhanden, datei erstellen
$handler = fOpen($dateiname , "a+");  
fWrite($handler , $text); 
fClose($handler); // Datei schließen

falls sich der user 4x eingeloggt hat, steht im textfile folgendes (beispiel):
3453 |  66.66.66.66 | 1326890811 |
3453 |  66.66.66.66 | 1326892222 |
3453 |  66.66.66.66 | 1326893333 |
3453 |  66.66.66.66 | 132689444 |
gibt es da ideen wie ich das wieder auslesen kann und anhand des | sortieren kann ? oder dumm von mir den trenner | zu nehmen ? muesste ich mit explode arbeiten ?

kenne mich im handling von txt files noch nicht so aus.

thanx fuer alle tipps

Content-Key: 179125

Url: https://administrator.de/contentid/179125

Printed on: April 20, 2024 at 02:04 o'clock

Member: godlie
godlie Jan 18, 2012 at 14:26:20 (UTC)
Goto Top
Hallo,
dein Verdacht auf explode ist genau richtig.

Datei aufmachen Zeile auslesen schaun ob was drinsteht in der Zeile wenn ja dann exploden und aus dem array die benötigten daten rausholen.

grüße
Mitglied: 88871
88871 Jan 18, 2012 at 14:37:42 (UTC)
Goto Top
Hoi

Also ich kriegs noch nicht ganz hin das ich alle zeillen auslesen kann. das was ich habe zeigt mir nur die erste zeile an und wiederholt sich.....

kapier das irgendwie nicht ganz.....

        $datei = "../../pfad_zu_den_txt_files/" . $row[id] .".txt"; // Name der Datei  
        $daten = file_get_contents($datei);
        $datenArray = explode("|",$daten);           

        
        if (file_exists($datei)) 
        {
            $array = file($datei); // Datei in ein Array einlesen
        
            foreach ($array as $element) 
            {
                $loginTime = strftime("%A, %H:%M - %e. %B %Y",$datenArray[2]); //erstellt uhrzeit  
                echo "userID: $datenArray<br>";  
                echo "IP: $datenArray[1]<br>";  
                echo "Loginzeit: $loginTime<hr>";  
            }
        }
        else
        {
            echo "Noch keine Logindaten gespeichert";  
        }  
Member: godlie
godlie Jan 18, 2012 at 14:43:15 (UTC)
Goto Top
Hallo,

du machst einen Fehler und zwar splittest du im datenArray den gesamten Inhaltsstring.
In deiner Foreach bekommst du ja die Zeilen häppchenweise vorgelegt.
einfach ein explode auf $element und dann das array auswerten.
Member: Arano
Arano Jan 18, 2012 at 15:12:31 (UTC)
Goto Top
Tagchen,

Die Zeilen 2 und 3 kannste schon mal getrost raus löschen, die werden nicht benötigt !
Das ist mir echt ein Rätsel wie wie du dir die Verbindung zur foreach-Schleife gedacht hastface-smile

Vielleicht hilft es dir so ja ein bisschen besser das zu verstehen
<?php
// ...
$arrZeilenDerDatei = file("PFAD_ZUR_DATEI");  

foreach($arrZeilenDerDatei as $strEineZeileDerDatei)
{
    // $strEineZeileDerDatei = "3453 |  66.66.66.66 | 1326890811 "; 
    $arrSpaltenDerZeile = explode(" | ", $strEineZeileDerDatei);  
    print_r($arrSpaltenDerZeile);
}
// ...
?>
"Sprechende Variabelnamen"
Okay, vielleicht habe ich das nun auch ein bisschen übertrieben aber es soll ja uch nur verdeutlichen was wie passiert ;)
<?php
$arrLogfile = file("PFAD_ZUR_DATEI");  
foreach($arrLogfile as $strLog)
{
    $arrLog = explode(" | ", $strLog);  
    print_r($arrLog);
}
?>


Achso ja, jetzt hätte ich es beinahe veressen !
Ich habe je nun zweimal Gebrauch von print_r() gemacht, sehr nützlich um sich Variableninhalten (besonders Array) anzusehen
PHP-Manual - print_r()


~Arano
Mitglied: 88871
88871 Jan 18, 2012 at 15:33:43 (UTC)
Goto Top
wow! danke fuer eure inputs, vorallem an Arano (schon wieder)

Schlichter und einfacher als gedacht.......Ja die $element Variable ist noch von der PHP Seite, vom Beispiel face-smile

Euer Input hat mir geholfen! Ich denke die Array Funktion muss ich noch hundert mal machen um da Sattelfest zu werden face-smile

Habe nun Aranos Beispiel genutzt und fuer meine Zwecke angepasst.....Das ist Super!

Herzlichen Dank !

<?php
    $logfile  = file("../../PFAD_zum_text_file/" . $row[id] .".txt"); // pfad und name der logdatei  
    
        foreach($logfile as $logzeile)      
        { 
            $ausgabe = explode(" | ", $logzeile); // schnippi schnappi   
            $loginTime = strftime("%A %e. %B %Y - %H:%M",$ausgabe[2]); // loginzeit formatieren  

            echo "<b>$loginTime</b><br>"; // ausgabe vom formatierten datum              
            echo "IP: $ausgabe[1]<hr>"; // ausgabe der IP adresse  
        }   
?>
PS: Die ID gebe ich nicht mehr aus, resp in dem Fall hier.....Andernorts machts natürlich wieder Sinn, resp wandelt man wieder in den Usernamen um als bsp...
Mitglied: 88871
88871 Jan 18, 2012 at 15:58:29 (UTC)
Goto Top
Humm, jetzt habe ich doch noch was vergessen:

Die Daten sind ja nun nach ASC geordnet, weil die neuste Zeille immer unten angefügt wird.

Gibt es da einen Trick wie ich die Ausgabe nun umkehre ? Inneerhalb meines Arrays wohl schon ?
Member: Arano
Arano Jan 18, 2012 at 16:06:15 (UTC)
Goto Top
Hi,

auch das ist kein Problem. PHP bietet jede menge Funktionen an mit denen man ein Array bearbeiten kann: PHP-Manuals - Arrays
Dein Zauberwort heißt: "umgekehrt" -> zu Englisch -> "reverse"


~Arano
Member: godlie
godlie Jan 18, 2012 at 16:06:37 (UTC)
Goto Top
Hallo,

arsort auf $logfile anwenden.

grüße
Member: Arano
Arano Jan 18, 2012 at 16:18:32 (UTC)
Goto Top
Nee, das ist nicht ganz richtig !
Allerdings dachte ich auch erst an rsort()

Die "sort"-Funktionen sortieren ja auch gleichzeitig !
Am Anfang jeder Zeile steht die ID die immer gleich ist. Aber dann kommt die IP !!!!
So würden die "sort"-Funktionen zuerst nach dem erstem IP-Block sortieren, dann nach dem 2., dem 3. und schließlich dem 4. und erst daaan nach dem Timestamp.
Das würde uns eine Sortierung nach der IP-Adresse bescheren bei der es erst bei doppelten Einträgen zu einer Zeitlichen Sortierung kommt.

Oder kurz gesagt, alles würde total Durcheinander geraten.
Wir brauchen also eine Funktion die lediglich die Reihenfolge umdreht/umkehrt->reverse OHNE neu zu sortieren.
wäre ja auch beinahe drauf reingefallen


~Arano

Edit
Jetzt habe ich vergessen meinen schnellen Testcode beizufügen... -.-
<?php
$arr = array("aa|1","cc|2","bb|3");  
print_r($arr);
// Array
// (
//      => aa|1
//     [1] => cc|2
//     [2] => bb|3
// )

$arr = array("aa|1","cc|2","bb|3");  
arsort($arr);
print_r($arr);
// Array
// (
//     [1] => cc|2
//     [2] => bb|3
//      => aa|1
// )

$arr = array("aa|1","cc|2","bb|3");  
$arr = array_reverse($arr);
print_r($arr);
// Array
// (
//      => bb|3
//     [1] => cc|2
//     [2] => aa|1
// )
?>
Member: godlie
godlie Jan 18, 2012 at 16:56:53 (UTC)
Goto Top
Ah das kommt davon wenn man nebenbei was Programmiert..

Stimmt natürlich da es sich ja nicht um ein assoziatives array handelt hast natürlich mit arsort schlechte Karten.
Danke für die Gedächtnisstütze.

grüße
Member: Arano
Arano Jan 18, 2012 at 17:02:44 (UTC)
Goto Top
HAHA...

kein Problem !
Wie gesagt, mir wäre ja beinahe der gleiche Fehler unterlaufen... muss am Programmieren liegen *fg*

~Arano