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

K

koli.bri

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 > 0 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
 
Ich mache das immer so, dass ich teile des Skriptes wegkommentiere und wenn' s dann ohne Fehlermeldung geht hat man's gefunden. :)
 
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!
 
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.
 
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.
 
maceis schrieb:
Das mit dem Kommentieren mache ich auch wie wegus nur vielleicht nicht ganz so intensiv .

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! ;)

maceis schrieb:
Im vim hat man auerßdem die Möglichkeit zu jeder Klammer das Gegenstück zu finden

Stimmt! Ein Editor ohne diese Funktion ist Keiner :D

godess schrieb:
zwei Zeichen drin, die nicht hingehören. Man sieht sie im in deinem Code nicht

Da kann ich ( neben zend) auch den Textwrangler sehr empfehlen. Die Funktion "Zap Gremlins" löscht sowas automatisch! Auch sehr praktisch!
 
goddess schrieb:
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.

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
 
wegus schrieb:
PHP:
print "<table>";
  print "<tr>";
    print "<td>blablub</td>";
    print "<td>schrubbel</td>";
  print "</tr>";
print "</table>";

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:
 
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.
 
Danke!

Zumindest habe ich also nichts falsch oder besonders umständlich gemacht, wie ich schon manchmal berfürchtet habe! :)
 
Zurück
Oben Unten