tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
5
ZUGRIFFE
232
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    cesupa cesupa ist offline Mitglied Brokat
    Registriert seit
    Sep 2004
    Beiträge
    329
    Hallo,

    irgendwie hab ich ein merkwürdiges Problem mit meiner Klasse und zwei Arrays darin:

    PHP-Code:

    class snav{

    var 
    $urls;       
      var 
    $names;
      

      
      function 
    snav()
      {
      
    #Definitonen von Dateispeicherorten, etc.

      
    if(file_exists($this->filename_url))
      
    $this->urls=$this->file->read($this->filename_url);            #Array mit vorhanden Daten füllen
      
    else
      
    $this->urls=array();                                                       #wenn Datei nicht vorhanden->leeres Array machen
      
      
    if(file_exists($this->filename_sites))
      
    $this->names=$this->file->read($this->filename_sites);
      else
      
    $this->names=array();
    }

    function  
    set_link($name,$url)
      {
        
    $size=sizeof($this->urls);               #jetzige Arraygröße 
        
    echo "SIZE: ".$size."<br>";
        echo 
    "URL: ".$url."<br>";              #Daten erst ausgeben ("http://wekap.funpic.de/index.php")
        
    $this->urls[$size]="";                     #Array an neuer Stelle leeren
        
    $this->urls[$size]=$url;                 #neue Daten einfügen 
        
    echo $this->urls[$size];                 #neue Daten ausgeben("ha") ?
        
    $this->names[$size]=$name;
        
        
       
    #Daten serialisieren und speichern
        
    return $size;        #return ID
    }

    So, nun zu den Problemen: Wenn ich die schon erstellten Dateien lösche, das Skript starte, kommt manchmal der Fehler, dass keine Datei gefunden wurde, heißt also, file_exists() funktioniert irgendwie nicht richtig. Die Dateien werden dann komischerweise trotzdem erstellt, unzwar so, wie es auch sein sollte, die Daten wurden also richtig gespeichert. Wenn ich das Skript jetzt nochmal laufen lasse kommt zwar keine Fehler mehr, aber aus der URL, das in dem Array abgespeichert wurde, ist bloß noch "ha" übrig geblieben. Ich hab aber absolut keine Ahnung wieso, weshalb, warum. Könnt ihr mir bitte helfen?

    Gruß
    cesupa
     

  2. #2
    Avatar von nero_85
    nero_85 nero_85 ist offline Mitglied Platin
    Registriert seit
    Jul 2005
    Ort
    Österreich
    Beiträge
    734
    Was soll die Funktion "read()" denn machen! Oder meinst du vielleicht readdir() oder readfile() oder dgl. ?
     
    Als Hirte erlaube mir, zu dienen mein Vater dir. Deine Macht reichst du uns durch deine Hand, diese verbindet uns wie ein heiliges Band! Wir waten durch ein Meer von Blut, gib uns dafür Kraft und Mut. In nomine partris et filii et spiritu sancti...

    KLICK HIER ;)

    Tokio-Hotel's "Durch den Monsun" mal anders.

    (\_/)
    (O.o) This is Bunny. Copy Bunny into your signature
    (> <) to help him on his way to world domination.

  3. #3
    Avatar von maeTimmae
    maeTimmae maeTimmae ist offline Mitglied Platin
    Registriert seit
    Aug 2007
    Ort
    Erfurt, Saarbrücken, Leipzig und Fulda
    Beiträge
    515
    Leider fehlt in deiner Angabe der Klasse anscheinend ne Menge an Informationen - So genau kann ich dein Problem daher nicht rekostruieren. Bevor ich mich draufstürze, möchte ich dir gerne sowieso noch eine "ordentlichere" Schreibweise in PHP ans Herz legen. Damit meine ich nicht, wie man Funktionen und Variablen benennt, aber wie man seinen Code einrückt und lesen und schreiben kann. Habe einfach mal das, was du angegeben hast, ein wenig umgeformt und einen Ticken performanter gemacht.
    PHP-Code:
    <?php
    class snav{
        var 
    $urls  = array();
        var 
    $names = array();
        
        function 
    snav()
        {
            
    #Definitonen von Dateispeicherorten, etc.

            
    if(file_exists($this->filename_url)) {
                
    # Wo wird $this->file definiert? Wo $this->file->read ?
                
    $this->urls $this->file->read($this->filename_url);    // Array mit vorhanden Daten füllen
            
    }
            
            if (
    file_exists($this->filename_sites)) {
                
    # Wo wird $this->file definiert? Wo $this->file->read ?
                
    $this->names $this->file->read($this->filename_sites);
            }
        }
        
        function  
    set_link($name$url)
        {
            
    $count count($this->urls);

            echo 
    "LAST:  " . ($count 1) . "<br>"// immer gleich, daher unnötig
            
    echo "URL:   {$url}<br>";

            
    $this->urls[] = $url;                   // neues Element anhängen
            
    echo $this->urls[$count];
            
    $this->names[$size] = $name;

            
    // Daten serialisieren und speichern

            // momentane Größe zurückgeben?
            
    return $count 1;
            
    // oder Index des letzten Elements?
            
    return $count;
        }
    }
    An deinen Kommentaren zwischen den Zeilen war zu erkennen, dass da noch einiges mehr an Code ist, oder? Wäre nett, wenn du den nicht vorenthälst

    Zu deinem eigentlichen Problem kann ich, wie gesagt, noch nicht viel sagen - Ich denke zur Zeit einfach mal, dass die Datei noch geschrieben wird, während du sie schon wieder lesen möchtest. Oder gibst du die Daten in dem Fall aus, direkt nachdem du sie in das Array eingefügt hast, ohne dass du bereits die Datei neu geschrieben hast? Ist mir ein wenig unklar... Wenn das der Fall sein sollte, könnten nicht akzeptierte Sonderzeichen eventuell die Stringausgabe beenden - Sollte aber eigentlich nicht passieren.

    PHP-Code:
    $test = new snav();
    $test->set_link('toast''http://abc.de'); 
    erzeugt auf meiner Maschine
    Code :
    1
    2
    3
    
    Size:  0<br>
    URL:   http://abc.de<br>
    http://abc.de
    Also das, was gewollt ist

    Sollte es sich um ein Lese-bevor-geschrieben Problem handeln, könnte die Funktion flock() Abhilfe schaffen. Da du des Weiteren meintest, die Datei wird gelöscht und neu geschrieben, könnte ein Blick auf fopen($file, 'w+'); statt Löschen und Neuerzeugen von Vorteil sein, was die gesamte Geschwindigkeit angeht.
     

  4. #4
    Avatar von Igäl
    Igäl Igäl ist offline Mitglied Brokat
    Registriert seit
    Aug 2007
    Ort
    Winterthur
    Beiträge
    280
    Zeig mal deinen Klassen/Funktionsaufruf... Viele meiner Fehler beim OOP habe ich am Anfang gemacht, weil ich eine Funktion in der Klasse gleich genannt habe wie die Klasse selber. PHP interpretiert diese dann als Konstruktor und führt sie bei der Klasseninstanzierung aus. Als ich sie dann noch einmal manuell ausführte ($class_ref->function()) hatte ich plötzlich merkwürdige Fehler wegen dem Doppelaufruf...
     

  5. #5
    cesupa cesupa ist offline Mitglied Brokat
    Registriert seit
    Sep 2004
    Beiträge
    329
    So, also jetzt die ganze Klasse:

    PHP-Code:
    <?

    include_once("./data/php/file_io/file.php");
    include_once(
    "./data/php/html/selements.php");

    class 
    snav{
      
      var 
    $file;
      var 
    $filename_url;            #Filename of file with all necessary URL's
      
    var $filename_sites;            #names
      
    var $urls;
      var 
    $names;
      
      function 
    snav()
      {
      
    $this->file=new file();                          #eigene Klasse um Datei zu schrieben/zu lesen
      
    $this->filename_url="./data/files/URL/urls.txt";
      
    $this->filename_sites="./data/files/URL/sites.txt";
      
      
    #$this->urls=array();
      #$this->names=array();
      
      
    if(file_exists($this->filename_url))
      
    $this->urls=$this->file->read($this->filename_url);    #Daten einlesen (unserialize wird                                      automatisch ausgeführt), Array wird zurückgegeben
      
    else
      
    $this->urls=array();
      
      if(
    file_exists($this->filename_sites))
      
    $this->names=$this->file->read($this->filename_sites);
      else
      
    $this->names=array();
    }

      function 
    get_url($id)
      {
        if(
    $id>sizeof($this->urls)-|| $id<0)
        return 
    false;
        
        return 
    $this->urls[$id];
    }

      function 
    get_name($id)
      {
        if(
    $id>sizeof($this->names)-|| $id<0)
        return 
    false;
        
        return 
    $this->names[$id];
    }  

      function  
    set_link($name,$url)
      {
        
    $size=sizeof($this->urls);
        echo 
    "SIZE: ".$size."<br>";
        
        echo 
    "URL: ".$url."<br>";
        
    $this->urls[$size]="";
        
    $this->urls[$size]=$url;
        echo 
    $this->urls[$size];
        
        
    $this->names[$size]=$name;
        
        
        
    $this->file->write($this->filename_url,$this->urls);        #Datei überschreiben(serialize wird automatisch ausgeführt)
        
    $this->file->write($this->filename_sites,$this->names);
        return 
    $size;        #return ID
    }

      function 
    get_links(&$container)
      {
        if(!
    is_object($container))
        return 
    false;
        
        for(
    $i=0;$i<sizeof($this->urls);$i++)
        {
        
    $id=$container->link($this->urls[$i]);
        
    $container->link[$id]->text($this->names[$i]);
        }
        return 
    true;
    }
    }
    ?>
    Die Klasse file() hab ich auch geschrieben, aber da wird die Datei auch nur geschrieben bzw. gelesen. Hier nochmal die dafür relevanten Funktionen:

    PHP-Code:
    function writeFile($dst,$buf,$incp=true)
    {

                    if(
    is_object($buf) || is_array($buf))
                
    $buf=serialize($buf);

              if((
    $handle=fopen($dst,"w+",$incp)))
            {
                  if(!
    fwrite($handle,$buf))
                  return 
    false;
                  else
                  return 
    true;
            }
                else
                return 
    false;
    }

    function 
    readFile($src,$incpath=true)
    {
              
    $handle=fopen($src,"r",$incpath);
            if(
    $handle)
            {
              
    $content=fread($handle,filesize($src));
              
              
    fclose($handle);
              
              if(!
    unserialize($conten) && $content!=serialize(false))
              return 
    $content;    
              else
              return 
    unserialize($content);
            }
            else
            return 
    false;

    Das ganze rufe ich dann in meiner index.php so hier auf:

    PHP-Code:
    $nav=new snav();
    #sonstiger code

    $nav->set_link("Startseite","http://wekap.funpic.de/index.php");

    #echo $nav->get_url(0);
    #$nav->get_links($h->body->div[0]);

    #sonstiger code 
    Hoffe, das bringt euch weiter.

    Gruß
    cesupa
     

  6. #6
    cesupa cesupa ist offline Mitglied Brokat
    Registriert seit
    Sep 2004
    Beiträge
    329
    okay, das Problem hat sich gelöst. Ein Tippfehler in der read()-Funktion der file Klasse hat sich eingeschlichen. Dadurch wurde unserialize() nicht ausgeführt und hat somit alles durcheinander geworfen. Passiert halt
    Dennoch Danke für eure Hilfe.

    Gruß
    cesupa
     

Ähnliche Themen

  1. Antworten: 17
    Letzter Beitrag: 18.03.10, 20:23
  2. Daten werden nicht gespeichert
    Von bodoschmidt im Forum .NET Datenverwaltung
    Antworten: 2
    Letzter Beitrag: 22.01.08, 00:13
  3. Antworten: 6
    Letzter Beitrag: 06.02.05, 20:39
  4. php-daten als as-Array gespeichert, aber nicht abfragbar
    Von littlerichard im Forum Flash Plattform
    Antworten: 4
    Letzter Beitrag: 22.09.04, 15:58
  5. Daten werden nicht gespeichert...
    Von chpa im Forum PHP
    Antworten: 11
    Letzter Beitrag: 04.08.04, 19:49