Datei auslesen mit file() und einzelne Zeilen aufteilen

icefire

Erfahrenes Mitglied
Hallo!
Ich versuche ein File für meinen Gameserver zu öffnen, und entsprechend zu verarbeiten. In diesem File ist die Struktur wie folgt:

// STEAM-ID RIGHTS NAME
"STEAM_0:2:43278" "cde" // Bert
"STEAM_0:1:14236" "ghf" // Hans
"STEAM_0:1:234778" "acf" // Fred

Ich rufe die gesamten eingetragenen Admins aus der Datenbank aus, um die betreffende Person bestimmen zu können. Der zweite Schritt sollte dann die Aufteilung der betroffenen Daten sein, damit man ggf. die Adminflags ändern kann.

Damit auch die richtige Person bzw. Zeile genommen wird, läuft das zusätzlich noch über meine Datenbank - quasi als abgleich:

PHP:
$name = $_POST['admin_name'];	

$file = '../admins_simple.ini';
$rights = file($file);

if(stristr($rights,$name) === FALSE){
echo '<tr><td class="text1" colspan="2">User <b>'.$name.'</b> hat folgende Adminrechte:<br></td></tr>';
$name == TRUE;
if(isset($name)){ 

$verbindung = @mysql_connect($mysqlserver, $mysqluser, $mysqlpass) or die("Konnte keine Verbindung zum Datenbankserver aufbauen!"); 
$selectdb = @mysql_select_db($mysqldb, $verbindung) or die("Konnte die Datenbank <b>$mysqldb</b> nicht auswählen!"); 
	
$link = mysql_query("SELECT * FROM rv_server_rights WHERE rv_user_name='$name'");      
echo mysql_error();
 
if(empty($data['rv_user_rights'])){$admin_lvl="...";}
elseif($data['rv_user_rights']=="A"){$admin_lvl="Master Admin";}
elseif($data['rv_user_rights']=="B"){$admin_lvl="High Admin";}
elseif($data['rv_user_rights']=="C"){$admin_lvl="Normal Admin";}
elseif($data['rv_user_rights']=="D"){$admin_lvl="Low Admin";}
elseif($data['rv_user_rights']=="x"){$admin_lvl="Special Guest";}  

print'  <tr><td class="list1" colspan="2">Es wurden zu der <b>'.htmlspecialchars($data['rv_user_steam']).'</b> die Rechte eines <b>'.$admin_lvl.'</b> hinterlegt.</td></tr><br>
		<tr><td class="list1" colspan="2">'.$data['rv_rights_list'].'</td></tr>';
} 
	 
}else{echo '"'.$name.'" hat noch keine Adminrechte erhalten!';}

Das Problem ist nur - ich bekomme die Abgrenzung der betreffenden Zeile nicht hin. Auch stelle ich mir die Frage, ob ich überhaupt einen parallelen Eintrag benötige!?

Mit Files öffnen/eintragen/löschen habe ich so gut wie keine Erfahrungen. Ist es auch einfacher eine Zeile zu "erneuern" oder gleich die ganze Datei quasi neu zu erstellen und damit die alte zu überschreiben? Die Daten sind ja - wenn man die veränderte Zeile mal außer acht lässt - alle gleich.

Ich hoffe Ihr könnt mir ein paar Tipps geben! :)
 
Moin,

versuch das mal so:
Code:
$content = "";
if( file_exists($filename) ) {
$content = file_get_contents($filename)
}

$lines = explode("\n", $content);

foreach($lines as $rights) {
  $rights = chop($rights); // entferne restliche "\r"s und "\t"s
  if(stristr($rights, $name)) {
    echo "Recht gefunden: $rights";
    break; // foreach abbrechen
  }
}

Lg
Andy
 
Uups,bin noch nicht wach *g*

... hast natürlich recht :)

... also muss er das Array natürlich durchlaufen, das durch die Dateiöffnung entstanden ist:

PHP:
foreach($rights as $line) {
  if(stristr($line,$name) === FALSE){
    echo '<tr><td class="text1" colspan="2">User <b>'.$name.'</b> hat folgende Adminrechte:<br></td></tr>';
   $name == TRUE;
   break;
  } 
}
 
So ähnlich hatte ich es ja schon - nur müsste ich doch damit auch einen Anhaltspunkt erhalten, um die Datenbank abfragen zu können. Oder eben den Inhalt der Zeile aufsplitten und einem $string zuweisen können.

Aber da ist eh der Wurm drin.
 
Jetz versteh ich endlich was du da machen willst.
Schau mal du hast ein Leerzeichen zwischen den Daten und das kannst für jede Zeile mit explode lösen (in deinem aktuellen Script).

Oder du gehs ein ganz anderen Weg über fgetcsv() und verwendest als "delimiter" ein Leerzeichen und als "enclosure" ein Anführungszeichen. Vielleicht musst letzteres auch weglassen.

Hier ein Beispiel:
PHP:
<?php
$handle = fopen ("test.csv","r");              // Datei test.csv zum Lesen öffnen
while ( ($data = fgetcsv ($handle, 1000, " ", '"')) !== FALSE ) { // Daten werden aus der Datei
                                               // in ein Array $data gelesen

  print_r($data);
}
fclose ($handle);
?>
 
Danke für den Hinweis!

Konnte jetzt schon einmal die Abfrage wie folgt anpassen:

PHP:
$handle = fopen ("../admins_simple.ini","r");              
while ( ($file_array = fgetcsv ($handle, 1000, " ", '"')) !== FALSE ) { 
foreach ($file_array as $admin_zeile => $adminflags) {
	echo('<tr><td class="text1" colspan="2" ><input type="text" size="20" name="'.$adminflags.'" value="'.$adminflags.'"></td></tr>');
	}	

}
fclose ($handle);

Jetzt werde ich das noch so abändern, das nicht am Anfang der Datenbankabruf steht, sondern das auslesen des Files. Dadurch kann dann auch im 2ten Schritt die Datenbank abgleichen.

Da die Struktur ja immer gleich ist (Steamid, flags, Name /auskommentiert mit //) , besteht da die Möglichkeit, das nur der Name ohne // angezeigt wird?

// name - mit Leerzeichen wird ein viertes Array in der Zeile erzeugt
//name - ohne Leerzeichen erkennt dann die Datenbank nicht
 
Äh. Ja :D
Einfach prüfen ob die ersten beiden Stellen "//" (mit http://www.php.net/substr) sind oder schauen wie weit fgetcsv das ganze zerlegt hat, weil bei der Form:
Code:
"Server" "123" // Name
Geht das Array bis 3 / ist 4 lang.
Und bei:
Code:
"Server" "123" //Name
Geht das Array bis 2 / ist 3 lang.

Gibt es auch Namen die mit // beginnen? Dann musst alle 4 Fälle abfangen.
 
Also wenn ich das richtig verstanden habe, dann muss ich jetzt quasi nur aus dem 3ten Arrayteil [2] der Zeile die Zeichen entfernen - und könnte die dann weiterverarbeiten!?

Ohne Leerzeichen
Array ( [0] => STEAM_0:0:12345 [1] => abc [2] => //Miraculix )

Könnte mir nun vorstellen, dass ich ein neues Array (array_filter) erstellen muss, wo dann alle Teilstücke eingefasst werden.....nur wie?
 
Könnte mir nun vorstellen, dass ich ein neues Array (array_filter) erstellen muss, wo dann alle Teilstücke eingefasst werden.....nur wie?
Du musst kein neues Array erstellen, du kannst auch einfach das Bestehende bearbeiten oder erweitern.

Zum Beispiel so:
PHP:
$deinArray[2] = str_replace( '//', '', $deinArray[2] );
Sind die beiden Slashes vorhanden, werden sie durch "nichts", also dem Inhalt von '', ersetzt und das Ergebniss zurückgegeben. Anderen falls wird der String ohne eine Veränderung zurückgegeben.
 
Zurück