Bestimmte Zeile in einer PHP-Datei ändern, mit einem Array und File.

  • Themenstarter Themenstarter Luvox
  • Beginndatum Beginndatum
L

Luvox

Moin,

leider ist mir keine bessere Überschrift eingefallen.
Jedenfalls ist das was ich vor habe, das aus einer PHP-Datei mit variablen, diese alle in ein Array gelesen werden und dann über eine foreach-Schleife, die Datei quasi neu geschrieben wird, aber mit den veränderten Array Daten.
Ich bin natürlich nicht jemand der einfach sagt: "Hier schreib mir das mal, so wie ich das haben will! (unentgeltlich)", sondern ich habe mir da schon ein kleines Script geschrieben nur gibt es da leider 2 Probleme.

Ich poste das ganze einfach mal:
PHP:
$datei = 'user/user.php';
$old_info = file($datei);
$anzahl_eintrag = count($old_info);
for($i=0; $i <= $anzahl_eintrag ; $i++ )
{
	if( $old_info[$i] == '?>' )
	{
		unset($old_info[$i]);	
	}
}
   #Dient jetzt nur dazu um mir das Array anzugucken, gehört, also nicht zum eigentlich Script-Ablauf.
    /*	
       echo '<pre>';
	print_r ($old_info);
	echo '</pre>';
  */
	
$new_info = fopen($datei, "w");
foreach($old_info as $key => $var)
{
	echo $var .'<br>';
	$var2 = explode("=", $var);
	if( $var2[0] != '$letzter_login ' || $var2[0] == '$letzte_ip ' )
	{
		fwrite($new_info, $var);	
	}
	elseif( $var2[0] == '$letzter_login ' )
	{
		fwrite($new_info, '$letzter_login = "'. date("d.m.Y - H:i") .'";');
	}
	elseif( $var2[0] == '$letzte_ip ' )
	{
		fwrite($new_info, '$letzte_ip = "'. $_SERVER['REMOTE_ADDR'] .'";');
	}	
}
       	fclose($new_info);]

Die User-Datei sieht in etwa so aus:
PHP:
<?php
$benutzername = "LOGIN-NAME";
$passwort = "PASSWORT";	
$mod_name = "USER-NAME";
$user_email = "E-MAIL";
$admin = "ADMIN";
$rang = "RANG";
$letzter_login = '04.12.2009 - 03:06';
$letzte_ip = '127.0.0.1';
?>


Und folgende beide Probleme tauchen auf:
- Das "?>" wird nicht wieder mit eingeschrieben und ich weiß nicht genau wie ich das lösen soll
- Die Variable "$letzt_ip" wird einfach gelöscht, also beim ausführen des Scriptes

Ich wäre sehr Dankbar wenn mir da Jemand weiterhelfen würde.
 
Zum einen das Abschließende ?> brauchst du garnicht, daher ist es ja auch nicht Schlimm wenn es fehlt.

PHP:
 elseif( $var2[0] == '$letzte_ip ' ) 
    { 
        fwrite($new_info, '$letzte_ip = "'. $_SERVER['REMOTE_ADDR'] .'";'); 
    }

kann in der Bedinungskette niemals erfüllt werden, da die erste abfrage

PHP:
if( $var2[0] != '$letzter_login ' || $var2[0] == '$letzte_ip ' )

Dann ja ebenfalls greift.

Generell währe hier allerdings ein switch auf jeden Fall eleganter und einfacher zu lesen

PHP:
switch(trim($var2[0])) {
	case '$letzte_ip':
		fwrite($new_info, '$letzte_ip = "'. $_SERVER['REMOTE_ADDR'] .'";'); 
		break;
	case '$letzter_login':
		fwrite($new_info, '$letzter_login = "'. date("d.m.Y - H:i") .'";'); 
		break;
	default:
		fwrite($new_info, $var);
}
 
Zuletzt bearbeitet:
Danke für die Antwort, aber leider funktioniert das immer noch nicht so wirklich, ich habe deine Switch-Methode jetzt auch übernommen.
Das Problem ist jetzt, das einfach nichts passiert, die IP wird nicht neu geschrieben und das Datum, es passiert einfach nichts, also es wird einfach alles so geschrieben, wie es vorher auch in der Datei war.

Das ganze sieht jetzt so aus (Also jetzt nur die foreach-Schleife, weil der Rest funktioniert ja):
PHP:
foreach($old_info as $key => $var)
{
	echo $var .'<p>';
	$var2 = explode("=", $var);
	switch($var2[0]) 
	{					
		default:
			fwrite($new_info, $var);
			break;
		case '$letzte_ip':
			if(!fwrite($new_info, '$letzte_ip = "'. $_SERVER['REMOTE_ADDR'] .'";');
			break;
		case '$letzter_login':
			fwrite($new_info, '$letzter_login = "'. date("d.m.Y - H:i") .'";');
			break;
	}
}

Und sobald ich ein Leerzeichen an das case mache, also so: "case '$letzter_login '", wird die IP schon wieder einfach gelöscht. Das Leerzeichen müsste nach meinem wissen da sein, da das ja eine Variable ist die auseinander genommen wird nach dem = und dann bleibt noch ein Leerzeichen, aber ich kann mich ja auch irren.
 
Ich habe mir jetzt nicht das ganze Thema durchgelesen, aber ich glaube Variablenausdrücke wie "$b" werden bei einfachen Anführungszeichen nicht gewertet. Das heißt, du musst bei den case doppelte Anführungsstriche machen.
 
ComFreek liegt total richtig - Variablen werden als Text behandelt, wenn sie in einfachen Anführungszeichen stehen.

Allerdings wird hier ja auch geprüft, ob der Text $letzte_ip ist, also stimmt das hier an dieser Stelle.

Probier's mal so:
PHP:
foreach($old_info as $key => $var){ 
    echo $var .'<br/>'; 
    $var2 = explode("=", $var); 
    if( $var2[0] != '$letzter_login ' || $var2[0] == '$letzte_ip ' ) 
    { 
        fwrite($new_info, $var);     
    } 
    elseif( $var2[0] == '$letzter_login ' ) 
    { 
        fwrite($new_info, '$letzter_login = "'. date("d.m.Y - H:i") .'";
'); 
    } 
    elseif( $var2[0] == '$letzte_ip ' ) 
    { 
        fwrite($new_info, '$letzte_ip = "'. $_SERVER['REMOTE_ADDR'] .'";\r\n
'); 
    }     
}
Das Problem an deinem Code ist, dass IP und Login zwar geschrieben werden, allerdings hast du nach Login keinen Zeilenumbruch.
So hat's bei mir jedenfalls funktioniert.. :)
 
Vielen lieben Dank!
Es funktioniert ; D

Aber ich verstehe eins jetzt nicht so ganz, der einzige Fehler lag quasi an diesem Zeilenumbruch?
 
War nur dieser eine Zeilenumbruch - jopp.
Frag mich aber nicht was genau der Fehler war...
Mir ist nur aufgefallen, dass nach jedem Aktualisieren eine Zeile weniger da war, und die Zeile, die vorher unter "letzter Login" stand plötzlich rechts neben "letzer Login" stand.

Spontan vermute ich, dass in $var der Zeilenumbruch mit in die Datei geschrieben wird, da die DateiZeile inklusive des Zeilenumbruchs ausgelesen wird.
Bei IP und Login schreibst du jedoch alles manuell - und ohne Zeilenumbruch.

Man möge mich korrigieren, wenn ich falsch liege.

Grüßle
 
Zurück