textdatei problem
neue
- php
hallo leute,
ich bin grad beim lernen von php und tue mich da schwer bei einer selbst gestellten aufgabe:
also textdateiinhalt ist igrneeinezahl und danach eine ip
also:
14033 127.0.0.1
14010 192.168.2.21
14000 127.0.0.1
13999 192.254.56.168
usw.
also das schreiben in die textdatei ist no problem,
aber das auswerten:
ich möchte nach werten suchen in dieser textdatei.
die ersten zahlen sind aufsteigend, aber nicht immer fortlaufend
also gesucht werden soll z.b. 127.0.0.1 in dem wert der größer ist als 14001
wie mach eich das. wäre echt lieb von euch, wenn ihr mir mit funktionsname und paar tipps helfen könntet...
danke der neue
Hallo,
ich bin grad beim lernen von php ...
willkommen im Club!
und tue mich da schwer bei einer selbst gestellten aufgabe:
Och nöö, so schwer ist es doch auch wieder nicht.
14033 127.0.0.1
14010 192.168.2.21
14000 127.0.0.1
13999 192.254.56.168
wäre echt lieb von euch, wenn ihr mir mit funktionsname und paar tipps helfen könntet...
Es bietet sich an, den Dateiinhalt komplett mit file() einzulesen. Dann hast du alles in einem Array, jede Zeile als ein Element. Dann gehst du mit einer for-Schleife durch die einzelnen Arrayelemente und splittest jede Zeile mit explode() am Leerzeichen auf. In derselben Schleife kannst du auch schon nach dem gesuchten Eintrag fahnden. Das ist mit einem Stringvergleich und einem "wenn größer dann" leicht zu lösen.
Good luck,
Martin
hallo,
Es bietet sich an, den Dateiinhalt komplett mit file einzulesen.
also $datei=file(bla.txt");
Dann hast du alles in einem Array, jede Zeile als ein Element.
so kann man das mal sehen, oder?
foreach ($datei as $dateineu) {
echo "$dateineu \n;
}
for(explode(" ", $datei;$datei > 14001;print $datei);
ich glaub meine zusammensetzung ist nicht wirklich sinnvoll?
was sollte man anders machen?
danke
Hallo,
also $datei=file(bla.txt");
genau, obwohl $inhalt_arr eher widergibt, was die variable beinhaltet. Ein Anfuerungszeichen fehlt, was im wahren Leben zu einen parse_error gefuehrt haette.
foreach ($datei as $dateineu) {
echo "$dateineu \n;
Das ist richtig, auch hier wuerde ich eher 'foreach ($inhalt_arr as $zeile)' schreiben, dann weist du auch in 6 Wochen, was du dir gedacht hast. print_r($datei) wuerde zum blossen Hingucken reichen (ein <pre> vor print_r() macht sich immer gut)
for(explode(" ", $datei;$datei > 14001;print $datei);
Das ist jetzt aber richtig boeses Zeug. explode() gibt ein Array zurueck, das in deinem Fall 14soviel und die IP enthaelt. Es sollte also so aussehen:
$inhalt_arr = file('bla.txt');
foreach ($inhalt_arr as $zeile)
{
$temp_arr = explode(' ',$zeile); // sowas wie array ('14123', '127.0.0.1') als Ergebnis
if($temp_arr[0] > 14000 && $temp_arr[1] == '127.0.0.1') // Ich hab deine Bedingungen nicht mehr im Kopf,
// aber so was war's doch, oder
{
print $zeile . "\n"; // oder was immer du damit machen willst
}
}
An dieser Stelle etwas Weisheit
Gruß,
Dieter
hallo
$inhalt_arr = file('bla.txt');
foreach ($inhalt_arr as $zeile)
{
$temp_arr = explode(' ',$zeile); // sowas wie array ('14123', '127.0.0.1') als Ergebnis
if($temp_arr[0] > 14000 && $temp_arr[1] == '127.0.0.1') // Ich hab deine Bedingungen nicht mehr im Kopf,
// aber so was war's doch, oder
{
print $zeile . "\n"; // oder was immer du damit machen willst
}
}
ja so ungefähr wars das, aber die funktion hat irgendwo einen fehler, denn er printet das echo nicht, obwohl die ip gleich ist...
wenn ich das == auf != umsetze printet er es... wo ist da der fehler,
und die zweite frage, statt print soll php einen neuen wert in eine txt datei schreiben, soll ich das mit fopen, fwrite und fclose verwiklichen?
oder gibts was besseres?
danke
Hallo,
Ich wuerde mal annehmen, da du, wie du weiter oben schreibst, noch ganz am Anfang stehst, bisher noch keine vernuenftigen Debugstrategien hast. Du solltest Dir wirklich die letzten Saetze aus meinem letzten Posting zu Herzen nehmen. Wenn du nicht weisst, was in einer Variablen steht, solltest du das mit print_r() oder var_dump() ueberpruefen. Mit dieser Bemerkung im Hinter- und entsprechenden error_reporting im Dateikopf machen wir uns auf die Suche:
Schreib in deine Testdatei mal ein paar Zeilen, die die verschiedenen Kombinationen aus IP und Zaehler widerspiegeln, also ein, zwei Beispiele, die erfolgreich sein sollten und ein paar, auf die deine Bedingungen nicht zutreffen.
Dann nimmst du den Code aus dem letzen Posting mit ein paar Ergaenzungen:
error_reporting(2047); // man kann es garnicht oft genug sagen
print '<pre>';
$inhalt_arr = file('test_datei.txt');
foreach ($inhalt_arr as $zeile)
{
$temp_arr = explode(' ',$zeile); // sowas wie array ('14123', '127.0.0.1') als Ergebnis
// jetzt kommt was neues
print_r($temp_arr);
/* Das sieht dann so aus
Array
(
[0] => 14123
[1] => 127.0.0.1
)
Bei genauem Hinsehen, wirst du feststellen, dass hinter der IP noch eine Leerzeile steht, $temp_arr[1] ist also nicht '127.0.0.1', sondern "127.0.0.1\n". Wenn Du file() benutzt, ist es sinnvoll, alle Zeilen zu trimmen.
Also ein neuer Versuch:
foreach ($inhalt_arr as $zeile)
{
$zeile = trim ($zeile);
$temp_arr = explode(' ',$zeile); // sowas wie array ('14123', '127.0.0.1') als Ergebnis
// jetzt kommt was neues
print_r($temp_arr);
/* Das sieht dann so aus
Array
(
[0] => 14123
[1] => 127.0.0.1
)
Schon besser, oder? Ich habe da gestern abend nicht dran gedacht, vermute aber, dass das dein Problem ist. Wie schon erwaehnt, mit der richetigen Debugstrategie und etwas Erfahrung fallen dir soche Sachen selbst auf.
Noch was zur Terminologie:
aber die funktion hat irgendwo einen fehler, denn er printet das echo nicht
Mein Code war keine Funktion, und echo kam darin auch nicht vor. Es ist uns hier im Forum wichtig, dass man sich korrekt ausdrueckt, nicht weil wir solche Korinthenkacker waeren, obwohl es natuerlich auch davon einige gibt, sondern damit Zusammenhaenge jedem sofort klar werden und keine Missverstaendnisse auftauchen.
soll ich das mit fopen, fwrite und fclose verwiklichen?
Das ist schon ok, du musst aber auf die Parameter achten, die file() verlangt (a,r,w und sowas), da du dir sonst u.U. die Logdatei immer wieder ueberschreibst. Ab PHP 5 kannst du auch file_put_contents() nehmen.
Gruß,
Dieter
halli hallo,
nun hab ichs endlich...danke dir für die hilfe, hier der text:
<?php
$datumjetzt = time();
$sub = $datumjetzt - 1800;
$ip = getenv ("REMOTE_ADDR");
$inhalt_arr = file('log.txt');
$speicher = 1;
foreach ($inhalt_arr as $zeile)
{
$zeile = trim($zeile);
$temp_arr = explode(' ',$zeile);
//print_r($temp_arr);
if($sub - $temp_arr[0] < 1800 && $temp_arr[1] == $ip)
{
$speicher = 0;
}
else
{
$speicher = 1;
}
}
if($speicher == 1)
{
$information = $datumjetzt." ".$ip. "\r\n";
$datei_handle=fopen("log.txt",'a');
fwrite($datei_handle,$information);
fclose($datei_handle);
echo "habs geschrieben";
}
else
{
echo "du warst schon mal da";
}
echo "<br>User insgesamt", + count($inhalt_arr);
?>
grüße
Hallo neue,
Du willst was mit einer Datei machen, also schaust dich mal bei den Funktionen, die was mit dem Filesystem zu tun haben um. Jede Zeile ist ein Eintrag, also waere es klug, deine Datei mit file() in ein Array einzulesen. Um an jeden Eintrag des Arrays ranzukommen, waere eine Schleife keine schlechte Idee. Mal sehen, foreach sieht ziemlich gut aus. Um herauszufinden, ob der String 127.0.0.1 in deinem Eintrag vorhanden ist, braucht man Stringfunktionen, strpos() scheint hier das richtige zu sein.
Jetzt willst du auch noch wissen, ob der erste Wert groesser 14001 ist?. Dazu musst du erstmal den Wert isolieren. Mal sehen, was fuer Informationen vorhanden sind:
1. 14001 sind die ersten 5 Zeichen des Strings, das ist aber doof, denn es werden bestimmt auch mal 4 oder 6 sein
2. nach der Zahl kommt ein Lehrzeeichen, dann die IP, das behalten wir mal im Kopf
3. in dem String kommt die gesuchte Zahl, das Leerzeichen und die IP 127.0.0.1 vor, auch bedenkenswert
bei 2. wuerde dir http://lu.php.net/manual/de/function.explode.php@tile=explode() helfen, dass du zielsicher bei den Stringfunktionen entdeckt hast. Das Ergebnis waere ein Array, wobei du nur noch herausfinden muesstest, ob Array[0] groesser 14001 ist
bei 3. koenntest du das Leerzeichen, gefolgt von der 127.0.0.1 mit stra_replace() durch nichts ersetzen und haettest ebenfalls Zugriff auf das Objekt deiner Begierde.
Gruß,
Dieter