tutorials.de Buch-Aktion 05/2012
Like Tree5Danke
  • 1 Beitrag von ComFreek
  • 1 Beitrag von Laser
  • 1 Beitrag von Yaslaw
  • 1 Beitrag von Yaslaw
  • 1 Beitrag von Yaslaw
ERLEDIGT
NEIN
ANTWORTEN
14
ZUGRIFFE
387
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Haruzept Haruzept ist offline Mitglied Bronze
    Registriert seit
    Feb 2012
    Beiträge
    34
    Hallo Zusammen,

    ich bin noch nicht sehr lang mit PHP zugange.

    Ich möchte gerne eine Datei einlesen.
    In dieser Datei gibt es mehrere Zeilen.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    [account]
    user = test
    pwd = test159
    group = 1,2
     
    user = blub
    pwd = blub123
    group = 1,2
     
    usw....

    Nun möchte ich wie bereits geschrieben, diese Datei einlesen. Am einfachsten und besten würde ich dies meiner Meinung nach mit einem Array sprich
    PHP-Code:
    file('bla.txt'); 
    machen.

    Nach dem ich die Datei eingelesen habe, soll z.B. bei user test die Gruppe 1,2 auf 1,3 geändert werden. Dies soll natürlich nur bei einem bestimmten User und somit auch nur in einer bestimmten Zeile passieren.

    Mein Problem ist nun, ich weiß nicht, wie die Datei als Array eingelesen und eine bestimmte Zeile des arrays verändert werden kann. Dies muss selbstverständlich auch alles zurück in die Datei geschrieben werden. Da ist auch das eigentliche Problem.

    Wenn ich etwas zurück in eine Datei schreiben will, muss ich dies mit fwrite und fclose tun.
    Dies setzt aber vorraus, dass ich fopen benutze um die Datei zu öffnen.

    Bei php Manual bin ich mehr oder weniger auf dies gestoßen.

    PHP-Code:
    <?php
    $file 
    'people.txt';
    // Open the file to get existing content
    $current file_get_contents($file);
    // Append a new person to the file
    $current .= "John Smith\n";
    // Write the contents back to the file
    file_put_contents($file$current);
    ?>
    doch leider funktioniert das nicht so ganz.

    Mein code:

    PHP-Code:
    $datei1 file('bla.txt');
    $pz "7";

    $current file_get_contents($datei1);
    $current[$pz] = str_replace('2''3'$current[$pz]);

    file_put_contents($datei1$current[$pz]); 
    Da ich bereits seit gut 2 Tagen an diesem Problem sitze und einfach nicht mehr weiter weiß, eine große Bitte an euch. Kann mir bitte jemand bei diesem script bzw. Problem helfen?

    Ich wäre euch mehr als dankbar, wenn ihr mir diesen kleinen code bauen könntet.


    Viele Grüße

    Haruzept
     

  2. #2
    Avatar von ComFreek
    ComFreek ComFreek ist gerade online [x] Let it be logic!
    tutorials.de Moderator
    Registriert seit
    Jun 2009
    Beiträge
    2.364
    Blog-Einträge
    4
    Du vermischst hier file() und file_get_contents().

    file() gibt die alle Zeilen einer Datei als Array zurück.
    file_get_contents() gibt den kompletten Inhalt der Datei als String zurück (d.h. Zeilen werden entweder per LF, CR oder CR LF begrenzt).

    Den Code, den du im Manual gefunden hast, sollte eigentlich funktionieren!

    Nach dem ich die Datei eingelesen habe, soll z.B. bei user test die Gruppe 1,2 auf 1,3 geändert werden.
    Du müsstest entscheiden anhand welcher Kriterien man diese Zeile finden kann.

    Am einfachsten ist folgendes:
    PHP-Code:
    <?php 
    $file 
    'people.txt'

    $current file_get_contents($file); 

    $current str_replace('group = 1,2''group = 1,3'$current);

    file_put_contents($file$current); 
    ?>
    Es gibt übrigens auch die Funktion parse_ini_file() zum Einlesen von INI-Dateien.
    Haruzept bedankt sich. 
    mfg ComFreek

    Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
    Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
    [PHP] Überprüfen, ob Website erreichbarSicherheit in PHP-Codes schaffenGoogle Chrome-Extension für tutorials.dejson_compress()

  3. #3
    Laser Laser ist offline Mitglied Bronze
    Registriert seit
    Nov 2002
    Beiträge
    28
    Ich finde das ganze etwas dreckig. Ich würde mich eher für eine DB-Basierte Variante entscheiden. Zum lernen aber ein schönes Beispiel.

    Um damit zu arbeiten würde ich die Datei zunächst parsen und als Array verarbeiten. Mit diesem kannst du dann später die Werte manipulieren und die Datei am Ende neu speichern.

    Ich hab dir mal was vorbereitet:
    Code php:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    
    <?php
    // file
    $file       = 'settings.ini';
    // muh
    $fileArr    = file($file);
    // init
    $output     = array();
    // skip N rows
    $skipRow    = 1;
     
    if(count($fileArr) > 0) {
        $row    = 0;
        for($i=0; $i<count($fileArr); $i++) {
            // val zwischenspeichern und whitespaces entfernen (trim)
            $value  = trim($fileArr[$i]);
            // setze row +1
            if($value == '') $row++;
            // skip N rows && skip wenn die val leer ist
            if($skipRow>$i OR $value == '') continue;
        
            // das zeug in das array packen
            $tmp[$row][]    = $value;
        }
    }
     
    // debug!
    echo '<pre>';
    print_r($tmp);
    echo '</pre>';
    ?>

    Damit hast du schon mal ein kleinen Grundstein gelegt und kannst die Werte vernünftig in ein Array speichern. Du müsstest jetzt nur noch die einzelnen Values in das Array splitten. Da würde ich aber evtl. eher mit explode arbeiten. Zu str_replace würde ich eher nicht greifen.

    Möp ... parse_ini_file scheint hier die bessere Variante sein zum einlesen Arbeit umsonst, egal. Schau dir trotzdem mein Code an und versuche ihn zu verstehen. Gibt nichts besseres zum lernen.

    Erstell dir daraus am besten ein Formular welches du dann wieder als Array einlesen kannst und so nach und nach die Datei neu schreiben kannst.
    Haruzept bedankt sich. 

  4. #4
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    parse_ini_file() funktioniert hier nicht, da er gleiche Keys hat. parse_ini_file() nimmt nur ein User....
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  5. #5
    Haruzept Haruzept ist offline Mitglied Bronze
    Registriert seit
    Feb 2012
    Beiträge
    34
    Erst mal vielen vielen Dank für deine Arbeit

    Als ergebnis bekomme ich jedoch nur "s" in die Datei geschrieben. @Laser

    @ComFreek die genaue Zeile im array weiß mein php script bereits. Ich habe nur kein plan, wie ich auch nur etwas in dieser Zeile ändere.

    Viele Grüße

    Haru
    Geändert von Haruzept (06.02.12 um 21:47 Uhr)
     

  6. #6
    Laser Laser ist offline Mitglied Bronze
    Registriert seit
    Nov 2002
    Beiträge
    28
    Dann machst du was falsch. Hab es getestet. Hier mein Datei-Inhalt:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    [account]
    user = test
    pwd = test159
    group = 1,2
     
    user = blub
    pwd = blub123
    group = 1,2
     

  7. #7
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Die Problematik ist, dass es kein ini- und kein xml-File ist.
    Man muss auf einer Zeile feststellen, dass ein User beginnt und dann folgen die Details. Dann eine Leerzeile und wieder ein User. Ergo muss das gaze Schrittweise durchgeackert werden.

    Nunja, meine Lösung ist wahrscheinlich etwas zu komplex am Anfang. Dafür ist der Aufruf umso einfacher. Ich habe mich für ein ArrayObjekt entschieden, das alle User aus dem File aufnimmt. Man kann jeden Parameter jedes Users verändern und das ganze wieder speichern. Man könnte die Klasse auch noch ausbauen, damit man User hinzufügen und löschen könnte. Das ist aber im Moment nicht umgesetzt. Im Moment ist nur Lesen und Ändern.

    Der Aufruf
    PHP-Code:
    //Vorgaben
    $user 'test';
    $newGroup '2,3';
    $fileName 'people.txt';

    //Users anlegen
    $users = new MyUsers($fileName);
    //Beim User $user den Wert von group ändern
    $users[$user]->group $newGroup;
    //Die Änderung speichern
    $users->save(); 
    Die Klasse
    PHP-Code:
    /**
     * Die Klasse MyUsers
     */
    class MyUsers extends ArrayObject{
        const 
    C_USER_KEY 'user';
        private 
    $rowIndex = array();
        
        
    /**
         * Konstrukteur
         * @param   String      Pfad zum Settingfile
         */
        
    public function __construct($filePath){
            
    $this->filePath $filePath;

            
    //Durchgehen von jeder Zeile
            
    foreach(array_map('trim'file($filePath)) as $rowNum => $line){
                
    $item parse_ini_string($line);
                if(
    self::extract($item$param$value)){
                    if(
    $param == self::C_USER_KEY){
                        
    //Ein neuer User ($block) beginnt
                        
    $block $value;
                        
    $this[$block] = new stdClass();
                    }
                    
    $this[$block]->$param $value;                
                    
    $this->rowIndex[$rowNum][$block] = $param;
                }else{
                    
    //User ist fertig
                    
    unset($block);
                    
    $this->rowIndex[$rowNum] = $line;
                }            
            }
        }
        
        
    /**
         * Speichert den ganzen Karsumpel
         * @param   Boolean     Wenn true, dann nur mit var_dump() ausgeben
         */
        
    public function save($debug false){
            
    $outputLine = array();
            foreach(
    $this->rowIndex as $item){
                if(
    self::extract($item$block$param)){
                    
    $outputLine[] = "{$param} = {$this[$block]->$param}";
                }else{
                    
    $outputLine[] = $item;
                }
            }
            if(
    $debug){
                
    var_dump(implode("\n"$outputLine));          
            }else{
                
    file_put_contents($this->filePathimplode("\n"$outputLine));
            }
        }
        
        
    /**
         * Extrahiert den Schlüssel ($key) und den Wert ($value) 
         * @param   Array oder String
         * @param   String      Schlüssel des ersten EIntrages im Array
         * @param   String      Wert des ersten EIntrages im Array
         * @return  Boolean     Ob $array ein Array war.
         */
        
    private static function extract($array, &$key, &$value){
            if(!
    is_array($array) || count($array) == 0) return false;
            
    $value reset($array);
            
    $key key($array);
            return 
    true;
        }

    Wenn du PHP unter 5.3 hast, msst du noch die Funktion parse_ini_string() implementieren
    PHP-Code:
    //http://php.net/manual/de/function.parse-ini-string.php
    //vor PHP 5.3:
    if(!function_exists('parse_ini_string')){
        function 
    parse_ini_string($str$ProcessSections=false){
            
    $lines  explode("\n"$str);
            
    $return = Array();
            
    $inSect false;
            foreach(
    $lines as $line){
                
    $line trim($line);
                if(!
    $line || $line[0] == "#" || $line[0] == ";")
                    continue;
                if(
    $line[0] == "[" && $endIdx strpos($line"]")){
                    
    $inSect substr($line1$endIdx-1);
                    continue;
                }
                if(!
    strpos($line'=')) // (We don't use "=== false" because value 0 is not valid as well)
                    
    continue;
               
                
    $tmp explode("="$line2);
                if(
    $ProcessSections && $inSect)
                    
    $return[$inSect][trim($tmp[0])] = ltrim($tmp[1]);
                else
                    
    $return[trim($tmp[0])] = ltrim($tmp[1]);
            }
            return 
    $return;
        }

    Haruzept bedankt sich. 
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  8. #8
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    *blöng* War ich gestern müde und habe im Kreis gedacht. Wenn es nur darum geht, die Gruppe zu ändern, dann bietet sich da natürlich preg_replace() an.

    Code php:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    //Vorgaben
    $user = 'test';
    $newGroup = '2,3';
    $fileName = 'people.txt';
     
     
    //Pattern zusammenstellen
    $pattern = "/(user[[:blank:]]*=[[:blank:]]*{$user}[^[:alnum:]].*group[[:blank:]]*=[[:blank:]]*)[,[:digit:]]+[^,[:alnum:]]/isU";
    //Ersatzstring zusammenstellen
    $replace = "\${1}{$newGroup}\n";
     
    //Datei vollständig laden
    $fileString = file_get_contents($fileName);
    //Gruppe ersetzen
    $newFileString = preg_replace($pattern, $replace, $fileString);
    //Datei speichern
    file_put_contents($fileName, $newFileString);
    Haruzept bedankt sich. 
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  9. #9
    Haruzept Haruzept ist offline Mitglied Bronze
    Registriert seit
    Feb 2012
    Beiträge
    34
    MEGA MEGA vieln DANK!

    Ihr macht euch richtig viel mühe.

    @Yaslaw mit deinem Script habe ich ein kleines Problem.

    PHP-Code:
    <?php
    //Vorgaben
    $user 'blub';
    $newGroup '2,3';
    $fileName 'user.txt';
     
     
    //Pattern zusammenstellen
    $pattern "/(user[[:blank:]]*=[[:blank:]]*{$user}[^[:alnum:]].*group[[:blank:]]*=[[:blank:]]*)[,[:digit:]]+[^,[:alnum:]]/isU";
    //Ersatzstring zusammenstellen
    $replace "\${1}{$newGroup}\n";
     
    //Datei vollständig laden
    $fileString file_get_contents($fileName);
    //Gruppe ersetzen
    $newFileString preg_replace($pattern$replace$fileString);
    //Datei speichern
    file_put_contents($fileName$newFileString);
    ?>
    Wenn ich den User test auf blub ändern, passiert nichts mehr. Woran liegt es?
     

  10. #10
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    mach in deinem User.txt am Ende noch ein Enter ran. Dann gehts. Ich musste den Pattern ungierig machen um nicht immer die letzte Gruppe zu ändern. Doch um festzulegen wo die Gruppe fertig ist, prüfe ich auf ein Zeichen das weder ein Komma, noch ein Buchstabe oder eine Ziffer ist (Der Teil [^,[:alnum:]]). Wenn du aber nach der letzten Gruppe kein Zeichen mehr hast und das die gesuchte ist, dann findet er sie nicht.
    Haruzept bedankt sich. 
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  11. #11
    Haruzept Haruzept ist offline Mitglied Bronze
    Registriert seit
    Feb 2012
    Beiträge
    34
    okay... vielen, vielen, vielen, vielen dank.


    Zwei Frage habe ich noch.


    Wie muss ich
    PHP-Code:
    $pattern "/(user[[:blank:]]*=[[:blank:]]*{$user}[^[:alnum:]].*group[[:blank:]]*=[[:blank:]]*)[,[:digit:]]+[^,[:alnum:]]/isU"
    verändern, wenn Zeilen bzw. infos hinzukommen?

    PHP-Code:
    /(user[[:blank:]] 
    Hat user etwas mit der Variable zu tun oder hast du diesen abschnitt einfach nur user genannt?
    Geändert von Haruzept (07.02.12 um 19:19 Uhr)
     

  12. #12
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Du musst nix verändern
    Der Pattern sucht nach dem Text 'user = XYZ' und von dort bis zum nächsten 'group = '. Der folgende Text wird ersetzt. Ob vor oder nach dem group ncoh andere Params kommen ist egal.

    [[:blank:]] steht für diverse Leerzeichen
    Das '.*' im Pattern steht dafür, dass dort irgendwas kommt.
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  13. #13
    Haruzept Haruzept ist offline Mitglied Bronze
    Registriert seit
    Feb 2012
    Beiträge
    34
    Okay... scheinbar habe ich doch noch ein paar Fragen zu deinem script.

    User
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    [account]
    user                          = test
    pwd                           = testtest
    group                         = 1,2
     
    [account]
    user                          = bla
    pwd                           = testtest
    group                         = 1,2
    So sieht jetzt die User.txt Datei aus.





    PHP-Code:
    $login 'test';    
    $paket '1,3';
    $fileName 'user.txt';
     
     
    //Pattern zusammenstellen
    $pattern "/(user[[:blank:]]*=[[:blank:]]*{$login}[^[:alnum:]].*group[[:blank:]]*=[[:blank:]]*)[,[:digit:]]+[^,[:alnum:]]/isU";
    //Ersatzstring zusammenstellen
    $replace "\${1}{$paket}\n";
     
    //Datei vollständig laden
    $fileString file_get_contents($fileName);
    //Gruppe ersetzen
    $newFileString preg_replace($pattern$replace$fileString);
    //Datei speichern
    file_put_contents($fileName$newFileString); 

    Leider ändert das script die Gruppe jetzt nicht mehr. Liegt es an den vielen Leerzeichen bzw. Tabs dazwischen?
     

  14. #14
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Bei mir funktioniert das, auch mit Tabulatoren
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  15. #15
    Haruzept Haruzept ist offline Mitglied Bronze
    Registriert seit
    Feb 2012
    Beiträge
    34
    Hmm jetzt hat es funktioniert.

    Danke noch mal.
     

Ähnliche Themen

  1. str_replace
    Von Sasser im Forum PHP
    Antworten: 6
    Letzter Beitrag: 18.07.08, 12:55
  2. str_replace
    Von fUnKuCh3n im Forum PHP
    Antworten: 4
    Letzter Beitrag: 14.10.06, 14:55
  3. str_replace?
    Von Shooter2k im Forum PHP
    Antworten: 11
    Letzter Beitrag: 05.11.05, 12:14
  4. str_replace
    Von weightwatcher im Forum PHP
    Antworten: 22
    Letzter Beitrag: 07.04.05, 20:59
  5. str_replace ()
    Von rookie im Forum PHP
    Antworten: 0
    Letzter Beitrag: 22.05.02, 21:52