[php] Funktion wird nach WHILE nochmal aufgerufen

tkiela

Hüüüüäääh? :):)
25 August 2007
634
44
PHP:
<?php 

if($_GET['action']=='')
{
	// Auflistung:
	function angebote(){
		$result = mysql_query("SELECT TYP, angebote.NAME AS angebotname, kaeufe.`id` AS id, `angebot` , `user` , `datum` , kaeufe.`status` AS status, `PREIS` FROM (`kaeufe` INNER JOIN angebote ON kaeufe.angebot = angebote.ID) INNER JOIN user ON kaeufe.user = user.id WHERE user = ".quote_smart($_SESSION['userid']));
		echo mysql_error();
		while ($zeile = mysql_fetch_object($result)) {
			$id = $zeile->id;
			$name123 = $zeile->angebotname;
			$allnames[] = $name123;
			$preis = $zeile->PREIS;
			$writerabatt ="";
			$psatz = vars('vrabatt');
			if($psatz!=0)
				{
				$psatz2 = $psatz / 100;
				$rabatt = ceil($preis * $psatz2);
				$rabattpreis = $preis - $rabatt;
				$writerabatt = '<small style="color:orange;">('.$psatz.'% Rabatt auf '.$preis.' Mio. Lose: '.$preis.' Mio. Lose - '.$rabatt.' Mio. Lose = '.$rabattpreis.' Mio. Lose)</small>';
				}
			$status = $zeile->status;
			switch($status)
				{
					case "0": 
						$status='<span style="color:red;">Nicht bezahlt!</span><br><a href="#">Jetzt bezahlen!</a>';
					break;
					
					case "1": 
						$status='<span style="color:green;">Bezahlt!</span><br><a href="#">Jetzt verlängern!<br></a>'.$writerabatt;
					break;
					
					case "2": 
						$status='<span style="color:orange;">Ausgelaufen!</span><br><a href="#">Jetzt verlängern!</a>'.$writerabatt;
					break;
				}
				
			
			$zeit = $zeile->datum;
			$zeit = date("d.M.Y", $zeit);
			// WHILE LIST!
			
	function list_typen($typen){
			$query2 = "";
			$endstring = "";
			$k = 0;
			
			if($typen=="ALL"){
				
				$query2="SELECT id, name FROM typ";
				$result2 = mysql_query($query2);
				echo mysql_error();
				echo '<table>';
				while($zeile2 = mysql_fetch_object($result2)){
					$k++;
					$id = $zeile2->id;
					$name = $zeile2->name;
					echo '<tr><td><input type="checkbox" name="typen'.$k.'" value="'.$id.'" checked="checked"></td><td>'.$name.'</td></tr>';
				}
				
			}else{
				$typen=explode("|",$typen);
				$count=count($typen);
				

				
				$query2="SELECT id, name FROM typ";
				$result2 = mysql_query($query2);
				echo mysql_error();
				echo '<ul>';
				while($zeile2 = mysql_fetch_object($result2)){
					
					$k++;
					$id = $zeile2->id;
					if(in_array($id,$typen)){
					$checked="checked=\"checked\"";
					}else{$checked="";}
					$name = $zeile2->name;
					echo '<li>'.$name.'</li>';
				}
			}
			
			
			
			

			echo '</ul>';
		}
			require 'templates/mykaeufe_while.tpl';
		}
	}

	require 'templates/mykaeufe.tpl';
	// ENDE Auflistung
}

?>

Naja, in mykaeufe.tpl wird angebote() aufgerufen und dann in mykaeufe_while list_typen. Jetzt ist natürlich klar, was passiert, wenn die while-Schleife öfter aufgerufen wird:

Code:
Fatal error: Cannot redeclare list_typen() (previously declared in C:\xamp\xampp\htdocs\user\inc\mykaeufe.php:44) in C:\xamp\xampp\htdocs\user\inc\mykaeufe.php on line 44

Allerdings weiß ich nicht, wie ich es anders machen kann.
Kann mir einer helfen?
 
Funktion darf nur einmal definiert werden.

Also fehlt vor
PHP:
function list_typen($typen){
schon mal ein }
 
Moin.

Sorry, hatte irgendwie gedacht, dass die Funktion innerhalb der WHILE-Schleife stehen muss, war aber Quatsch...sollte lieber schlafen gehen ;)
 
Korrekt...

Denn Deine while() schleife reicht derzeit runter bis hin zu "require 'templates/mykaeufe_while.tpl';" erst dann ist das while beendet.. und das ist warscheinlich nicht beabsichtigt gewesen.

Edit: Arg zulange den Code gelesen und dann erst geschrieben ^^
Edit-II: Mir ist auch nicht bekannt das man Functionen in einer anderen function schreibt. Also ich schreib jede function für sich ^^
 
Edit-II: Mir ist auch nicht bekannt das man Functionen in einer anderen function schreibt. Also ich schreib jede function für sich ^^

Man kann funktioen bedingt erstellen lassen, also auch innerhalb einer anderen Funktion soweit ich weiß. Hab aber keine Ahnung, wie das dann mit den Zugriffsrechten aussieht..

@Topic: Funktionsdeklarationen würde ich meist auslagern, oder, wenn es mehr Sinn macht, in einen durch Kommentare á la /* ### */ in einen abgetrennten Bereich ganz oben in die Datei schreiben..
 
Edit-II: Mir ist auch nicht bekannt das man Functionen in einer anderen function schreibt. Also ich schreib jede function für sich ^^
Imo wäre der einzige Grund, eine Funktion so "komisch" zu definieren, wenn man sie nur einmalig z.B. als Callback ein paar Zeilen weiter drunten braucht. Doch hier würde sich auch ne anonyme Funktion nach dem Lambda-Kalkül anbieten.

Ansonsten sollte man seine Funktionen immer in einer einzelnen (oder mehreren) Dateien auslagern und zu Beginn inkludieren.
 
Das Problem scheint ja gelöst zu sein.

Wollte nur noch anmerken das es sinnvoll ist seinen Code zu kommentieren, wenn ihn andere schnell verstehen sollen. (Zum Beispiel hier helfen wollen.)

Ausserdem würde ich mich auf eine Bezeichnung der Variablenamen / Funktionnamen auf Englisch oder Deutsch festlegen. Ist zwar egal aber sieht irgendwie komisch aus. ;)