Daten werden in Array nicht richtig gespeichert

cesupa

Erfahrenes Mitglied
Hallo,

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

PHP:
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
 
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:
<?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:
$test = new snav();
$test->set_link('toast', 'http://abc.de');
erzeugt auf meiner Maschine
Code:
Size:  0<br>
URL:   http://abc.de<br>
http://abc.de
Also das, was gewollt ist :rolleyes:

Sollte es sich um ein Lese-bevor-geschrieben Problem handeln, könnte die Funktion [phpf]flock[/phpf] 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.
 
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...
 
So, also jetzt die ganze Klasse:

PHP:
<?

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)-1 || $id<0)
    return false;
    
    return $this->urls[$id];
}

  function get_name($id)
  {
    if($id>sizeof($this->names)-1 || $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:
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:
$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
 
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
 
Zurück