Markus: Endlosschleife bei include()-Anweisung

Hallo,

ich habe folgendes Problem:

Ich binde mittels include() dynamisch Dateien eines Verzeichnisses ein. Dabei kommt php in eine Endlosschleife.

Im Quelltext schaut das folgendermassen aus:

/*
 * Einlesen der Verzeichnis-Einträge im Verzeichnis
 * './defaults'
 * Das Ergebnis ist ein assoziatives Array der Form
 * array( 'filea' => './defaults/filea.irgendwas.php',
 *        'fileb' => './defaults/fileb.irgendwas.php',
 *        ... );
 */
$data = scan('./defaults');
// Schlüssel aus dem assoz. Array extrahieren:
$keys = array_keys($data);
for ($i = 0; $i < count($keys); $i++) {
   include($data[$keys[$i]]);
}

Das Einlesen der einzubindenden Dateinamen funktioniert einwandfrei, das habe ich mir ausgeben lassen. Die Grössen der Arrays $keys und $data stimmen mit den aktuellen überein.

Die Dateien sind php-Skripte, die sich an folgendes Schema halten:
<?php
   // Jeweils anderer Variablenname pro Datei.
   // Übereinstimmung mit $data im obigen Code-Fragment
   // zufällig - in den eigentlichen Dateien nicht gegeben
   $data = array ( array ( 'a', 'b', 'c', ... ),
                   array ( '1', '2', '3', ... ) );
   // Heisst ebenfalls in jeder eingebundenen Datei anders:
   $dataTable = new CDataTable();
   for ($i = 0; $i < count($data); $i++) {
      $current = $data[$i];
      $dataTable->insert($current[0],$current[1],...);
   }
?>

php kommt nicht sofort in eine Endlosschleife, sondern arbeitet die erste Datei ordentlich ab, die zweite Datei auch, versucht dann aber unmittelbar danach die gerade eingebundene Datei nochmal einzubinden. Da $dataTable->insert() einen Datensatz in eine mysql-Datenbank einträgt, bekomm ich natürlich sql-fehler wegen Schlüssel-Duplikaten beim Einfügen.

Ich habe versucht, das ganze mit include_once() zu umgehen, aber php versucht trotzdem die eine Datei mehrmals einzubinden. Nicht mehr in einer Endlosschleife, aber öfter als es sollte.

Ich hoffe, ich hab alle notwendigen Informationen drin und jemand hat eine Idee. Danke schon mal - wenigstens fürs Durchlesen, dauert ja auch seine Zeit ;-)

Markus

  1. Moin!

    Im Quelltext schaut das folgendermassen aus:

    /*
    * Einlesen der Verzeichnis-Einträge im Verzeichnis
    * './defaults'
    * Das Ergebnis ist ein assoziatives Array der Form
    * array( 'filea' => './defaults/filea.irgendwas.php',
    *        'fileb' => './defaults/fileb.irgendwas.php',
    *        ... );
    */
    $data = scan('./defaults');

    Was macht diese Funktion?

    // Schlüssel aus dem assoz. Array extrahieren:
    $keys = array_keys($data);
    for ($i = 0; $i < count($keys); $i++) {
       include($data[$keys[$i]]);
    }

    Das kriegt man auch einfacher hin, mit foreach.

    <?php
       // Jeweils anderer Variablenname pro Datei.
       // Übereinstimmung mit $data im obigen Code-Fragment
       // zufällig - in den eigentlichen Dateien nicht gegeben
       $data = array ( array ( 'a', 'b', 'c', ... ),
                       array ( '1', '2', '3', ... ) );

    $data wird schon benutzt - von deinem Einbindungscode oben. Er stört also deine Schleife.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Hi,

      /*
      * Einlesen der Verzeichnis-Einträge im Verzeichnis
      * './defaults'
      * Das Ergebnis ist ein assoziatives Array der Form
      * array( 'filea' => './defaults/filea.irgendwas.php',
      *        'fileb' => './defaults/fileb.irgendwas.php',
      *        ... );
      */
      $data = scan('./defaults');

      Was macht diese Funktion?

      Die Funktion scan geht ein spezifiziertes Verzeichnis durch und trägt jede php-Datei in dem Verzeichnis in ein assoziatives Array ein, welches dem reinen Namen der Datei (ohne die Endung .irgendwas.php) den Include-Pfad zuordnet.

      // Schlüssel aus dem assoz. Array extrahieren:
      $keys = array_keys($data);
      for ($i = 0; $i < count($keys); $i++) {
         include($data[$keys[$i]]);
      }

      Das kriegt man auch einfacher hin, mit foreach.

      Jupp. Weiss ich, ist auch Absicht.

      <?php
         // Jeweils anderer Variablenname pro Datei.
         // Übereinstimmung mit $data im obigen Code-Fragment
         // zufällig - in den eigentlichen Dateien nicht gegeben
         $data = array ( array ( 'a', 'b', 'c', ... ),
                         array ( '1', '2', '3', ... ) );

      $data wird schon benutzt - von deinem Einbindungscode oben. Er stört also deine Schleife.

      Nein: Siehe Kommentar. Die Variable hat in jeder einzubindenden Datei einen anderen Namen.

      Naja...Danke für deine Mühe, aber hoffentlich gibt es noch andere Ideen....

      Markus

      1. Moin!

        Die Funktion scan geht ein spezifiziertes Verzeichnis durch und trägt jede php-Datei in dem Verzeichnis in ein assoziatives Array ein, welches dem reinen Namen der Datei (ohne die Endung .irgendwas.php) den Include-Pfad zuordnet.

        Sicher, dass das korrekt abläuft?

        Das kriegt man auch einfacher hin, mit foreach.

        Jupp. Weiss ich, ist auch Absicht.

        Warum?

        <?php
           // Jeweils anderer Variablenname pro Datei.
           // Übereinstimmung mit $data im obigen Code-Fragment
           // zufällig - in den eigentlichen Dateien nicht gegeben
           $data = array ( array ( 'a', 'b', 'c', ... ),
                           array ( '1', '2', '3', ... ) );

        $data wird schon benutzt - von deinem Einbindungscode oben. Er stört also deine Schleife.

        Nein: Siehe Kommentar. Die Variable hat in jeder einzubindenden Datei einen anderen Namen.

        Aber $i ist identisch.

        Naja...Danke für deine Mühe, aber hoffentlich gibt es noch andere Ideen....

        Mit Funktionen oder Klassen wäre sichergestellt, dass es keine Namenskonflikte gibt.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
        1. Morgen...

          Aber $i ist identisch.

          Gnaaaaa.....das war das Problem...jetzt gehts.

          Vielen Dank, den Fehler hätte ich wahrscheinlich noch einen Tag gesucht...Dankeschön...

          Markus