PHP->Klammer zu viel, nur unbekannt wo...

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von koli.bri, 27.04.2006.

  1. koli.bri

    koli.bri Thread Starter

    Hallo.

    da wollte ich mal eben für Mauki eine Funktion erstellen, damit er eine Sitemap auf seiner Homepage anbieten kann, und dann passiert mir sowas:
    Ich bekomme die Fehlermeldung, dass eine geschweifte Klammer "}" zu viel ist...
    Hier geht es zu dem Thread von Mauki, wo er sein Problem schildert, und folgendermaßen sieht mein Quelltext aus:

    PHP:
    <html><head><title>blubb</title></head><body><form><textarea style="width:1000px; height:300px;">

    <?php
    function schreibeordner($ordner,$html "\n",$sortart 0,$sortflg 0)
    {  
    // #1
    /* schreibeordner() => Gibt Ordnerinhalt mit formatierung und sortierung zurueck
     *   Laeuft NICHT Rekursiv (gibt immer nur einen Ordner aus)
     * Argumente:
     *   $ordner => Ordner, der durchsucht werden soll
     *   $html => Formatierung der Ausgabe. Folgende Platzhalter sind erlaubt:
     *     _DATEI_ => Die Datei, die angezeigt wird.
     *     _ORDNER_ => gibt den Ordner zu der Datei aus
     *     _ENDUNG_ => Gibt die Dateiendung aus
     *     _GROS_ => Gibt die Groesse der Datei aus
     *     _ZEIT_ => Gibt die Zeit aus, zu der die Datei zuletzt editiert worden ist
     *     __ => 
     *   $sortart => Gibt an, wonach Sortiert werden soll
     *     0 => Keine Sortierreihenfolge
     *     1 => Alphabetisch nach Dateinamen
     *     2 => Aphabetisch nach Dateiendungen
     *     3 => Dateigroesse
     *     4 => Letzte Bearbeitungszeit
     *     5 => Ordner oder Datei
     *     
     *     
     *   $sortflg => Sortierreihenfolge
     *     0 => Aufsteigend
     *     1 => Absteigend
     */
     
     
    if($verz opendir($ordner))
     {
        
    $x 0;
        
    $file = array();
        while(
    $temp readdir($verz))
        {  
    //#3
            
    if($temp != '.' AND $temp != '..')
            {  
    //#4
                
    $file[$x]['1'] = $temp;                            // Nach Dateiname
    //            $file[$x]['4'] = filemtime($temp);            // Nach letzter Bearbeitungszeit
    //            $file[$x]['3'] = filesize($temp);            // Dateigroesse
    //            $file[$x]['5'] = is_dir($temp) ? "o" : "f";    // Ordner oder Datei

                // Infos aus pahtinfo()
                
    $temp2 pathinfo($ordner."/".$temp);
    //            $file[$x]['2'] = $temp2['extension'];    // Dateiendung

                
                
    $x++;
            }  
    //+4
        
    }  //+3
        
    closedir($verz);
        
    /*
    print_r($file);            //Nur zum Testen
    echo "-->".$x."<--";    //Nur zum Testen
    */

        // Sortieren:
        
    if($sortart AND $sortart <= 5)
        {
            for(
    $y=0;$y<$x;$y++)
            {
                for(
    $z=$y;$z<$x;$z++)
                {
                    
    $chk strnatcmp($file[$y][$sortart], $file[$z][$sortart]);
                    if(
    $chk 0)
                    {
                        
    $t $file[$y];
                        
    $file[$y] = $file[$z];
                        
    $file[$z] = $t;                
                    }
                }
            }
        }
        
    //Umdrehen
        
    if($sortflg != 0)
        {
            
    $file array_reverse($file);
        }
        
        
    // Vorbereiten zur Ausgabe:
        
    $return = array();
        foreach(
    $file as $var){
            
    $t $html;
            
    $ar = array('_DATEI_' => $file[1][1]);
    //                    '_ORDNER_' => $ordner,
    //                    'ENDUNG' => $var[2],
    //                    'GROS' => $var[3],
    //                    'ZEIT' => $var[4],
    //        );
    //echo $t;   // Nur zum Testen
            
    $t strtr($t$ar);
        }
        
    $t implode("",$return);
        return 
    $t;

     
    // Das hier kommt nur, wenn es den Angegebenen Ordner nicht gibt
     

     else
     {
        return 
    "Keinen Ordner mit diesem Namen gefunden";
     }
    }
    echo 
    schreibeordner("Homepages","_DATEI_");
    ?>
    </textarea></form>

    <?
    echo schreibeordner("Homepages","_DATEI_");

    ?>
    <body></html>
    Die Textarea habe ich drin, damit das "print_r" vernünftig angezeigt wird, was aber im Beispiel auskommentiert ist.
    Würd jetzt noch gerne mehr dazu schreiben, aber ich muss noch was essen, falls ihr den Fehler nicht auf anhieb seht, fragt einfach nach.
    Aber ich muss jetzt essen ^^

    PS.: Ich habe schon mehrere Stunden Suche hinter mir, aber ich denke mal, da es mein Script ist, finde ich ihn nicht...

    Ich denke auch im Namen von Mauki, vielen Dank für die kommende Hilfe.


    gruß
    Lukas
     
  2. balufreak

    balufreak MacUser Mitglied

    Beiträge:
    1.556
    Zustimmungen:
    28
    Mitglied seit:
    12.10.2003
    in welcher zeile sagt er ist die }?
     
  3. kazu

    kazu MacUser Mitglied

    Beiträge:
    1.366
    Zustimmungen:
    47
    Mitglied seit:
    09.11.2005
    Ich mache das immer so, dass ich teile des Skriptes wegkommentiere und wenn' s dann ohne Fehlermeldung geht hat man's gefunden. :)
     
  4. wegus

    wegus MacUser Mitglied

    Beiträge:
    14.831
    Zustimmungen:
    1.431
    Mitglied seit:
    13.09.2004
    Dazu ad hoc 2 Tipps:

    (1) ich schreibe hinter jede schließende Klammer was sie schließt:

    PHP:

    function Tudas ($damit) {
      if (
    $a==$damit) {
       .....
      } 
    // end if $a==$damit

    // end of function Tudas
    sieht übertrieben aus, hilft aber bei größeren Projekten enorm. Ich mache das für alle geschwiffenen Klammern

    (2) Ich mische nie HTML und PHP

    Wenn ich in PHP-Seiten HTML generiere, dann immer mittels echo/print oder Funktionen. Das ewige PHP-HTML-Gewechsel schadet nur der übersicht. Damit kann man auch schön einrücken, ohne die Einrückungen im HTML-Code zu haben:

    PHP:

    print "<table>";
      print 
    "<tr>";
        print 
    "<td>blablub</td>";
        print 
    "<td>schrubbel</td>";
      print 
    "</tr>";
    print 
    "</table>";
    damit verliere ich auch bei Skripten über mehrere 1000 Zeilen nicht den Faden oder finde ihn zumindest wieder! Sortier mal Dein Skript nach den Kriterien, Du findest dann die Klammer.

    Ich hab gelernt, daß ich Zeit spare, wenn ich sie gleich in diese Art von Kommentaren investiere. Dazu gehört auch eine gute History, wer wann warum was geändert hat. Alle Änderungen werden als PATCHxy gemarkert und die Originalzeilen als Kommentare aufgehoben!
     
  5. maceis

    maceis MacUser Mitglied

    Beiträge:
    16.693
    Zustimmungen:
    602
    Mitglied seit:
    24.09.2003
    So hat jeder seine Tricks und Kniffe.

    Ich z.B. mache mit jeder (!) öffnenden Klammer sofort die schließende.
    Das mit dem Kommentieren mache ich auch wie wegus nur vielleicht nicht ganz so intensiv ;).
    Im vim hat man auerßdem die Möglichkeit zu jeder Klammer das Gegenstück zu finden (%). Auch das ist sehr nützlich, wenn man sich trotzdem mal verzettelt.
     
  6. goddess

    goddess MacUser Mitglied

    Beiträge:
    229
    Zustimmungen:
    10
    Mitglied seit:
    26.02.2006
    In Zeile 94 sind vor der Klammer zwei Zeichen drin, die nicht hingehören. Man sieht sie im in deinem Code nicht, aber Zend sei dank... Einfach rauslöschen und mit blanks wieder anfüllen.
     
  7. wegus

    wegus MacUser Mitglied

    Beiträge:
    14.831
    Zustimmungen:
    1.431
    Mitglied seit:
    13.09.2004
    ich bin da gebranntes Kind! Am Anfang war es ein kleines Intranet was ich aufbaute, jetzt ist es eine 8 Jahre alte Software gewachsen ab PHP 3.06, mit hunderten Dateien und unterschiedlichen Zugriffsbeschränkungen. Täglich benutzt von mehr als 50 usern. Wenn man da den Überblick behalten will, wird man sehr pedantisch - im eignen Interesse! ;)

    Stimmt! Ein Editor ohne diese Funktion ist Keiner :D

    Da kann ich ( neben zend) auch den Textwrangler sehr empfehlen. Die Funktion "Zap Gremlins" löscht sowas automatisch! Auch sehr praktisch!
     
  8. koli.bri

    koli.bri Thread Starter

    Vielen dank. Ich vermute, dass Taco mir die anstatt eines Tabs da reingehauen hat, auf jeden Fall bekomm ich jetzt keine Fehlermeldung mehr.
    (Aber auch nicht das, was ich wollte...)
    Ich denke, den Rest schaff ich alleine.

    Noch einmal Danke an die Tipps, normalerweise mache ich das auch so, dass ich zu eine öffnenden Klammer direkt die schließende daneben schreibe.
    Nur ist mir erst am Ende aufgefallen, dass ich die Möglichkeit, dass ein falsches Verzeichniss aufgerufen wird, gar nicht abfange, weshalb ich da noch schnell das if hinzugefügt habe.

    Aber das Der Fehler wohl von Tavo kam ist blöd, dabei mochte ich das Teil so...

    Naja, vielen lieben Dank nochmal.

    gruß
    Lukas
     
  9. kazu

    kazu MacUser Mitglied

    Beiträge:
    1.366
    Zustimmungen:
    47
    Mitglied seit:
    09.11.2005
    Das geht aber auch prima mit
    PHP:

    echo("<table>
      <tr>
        <td>blablub</td>
        <td>schrubbel</td>
      </tr>
    </table>"
    );

    Übrigens, was genau unterscheidet eigentlich print und echo? Ich habe bisher immer nur echo benutzt. :confused:
     
  10. koli.bri

    koli.bri Thread Starter

    http://www.faqts.com/knowledge_base/view.phtml/aid/1/fid/40

    Das hab ich bei der www.php.net gefunden, bei "echo()".
    Der Unterschied, den ich jetzt für wichtig halte, weil man ihn auch einsetzen kann, ist, das print() einen Rückgabewert hat, also, wenn das Schreiben erfolgslos war, kann man dies Abfangen. da man aber keine Meldung rausgeben kann, fällt mir gerade kein Beispiel ein.

    Im Prinzip, würde ich sagen, ist es vollkommen Egal, was man benutzt.
    Eventuell ist echo() schneller, da es keinen Rückgabewerd hat.
     
Die Seite wird geladen...

Diese Seite empfehlen