[FRAGE] Funktion gibt keinen wert zurück --WARUM??

tklustig

New member
Hallo Leute,
benötige den wert aus der Funktion 'berechnen' für weitere Operationen.
Leider meldet mir der Interpreter, die Variable sei nicht bekannt, obgleich ich sie mittels 'return $paketmas;' explizit zurück gegeben habe. Wo liegt der Fehler?
Vorab vielen Dank.....
PHP:
<?php
function berechnen($l,$b,$h,$g){
    switch ($l){
        case $l>$b && $h>$b:
        $paketmas=$l+$b;
    return $paketmas;
	break;
 case $l>$h && $b>$h:
        $paketmas=$l+$h;
return $paketmas;    
	break;
      case $l<$b && $h>$b:
        $paketmas=$h+$b;
	return $paketmas;
	break;}
}
if(isset($_REQUEST["Button"]) && $_REQUEST["Button"] == "BERECHNEN"){
// if(!(empty($_POST["submit"] && $_POST["Abschicken"]=="Abschicken"){ // ist eine Alternative
$fehler=array();


if(empty($_REQUEST["laenge"])){
echo "<br><p><a href='paket_formular.html' title='Zurück zum Formular'>Zurück zum Formular</a></p>";
$fehler["laenge"]="Bitte Die Länge in (cm) eingeben";
}
if(empty($_REQUEST["breite"])){
$fehler["breite"]="Bitte die Breite in (cm) eingeben";
}
if(empty($_REQUEST["hoehe"])){
$fehler["hoehe"]="Bitte die Höhe in (cm) eingeben";
}
if(empty($_REQUEST["gewicht"])){
$fehler["gewicht"]="Bitte das Gewicht in (kg) eingeben";
}

if ($fehler){
$messages='';
foreach($fehler as $value){
    $messages .=$value . '<br>';
    }
echo $messages;
}
}
echo "$_POST[laenge]";
echo"<br>";
echo "$_POST[breite]";
echo"<br>";
echo "$_POST[hoehe]";
echo"<br>";
echo "$_POST[gewicht]";
echo"<br>";
if(!empty($_POST['laenge'])and (!empty($_POST['breite']))and (!empty($_POST['hoehe']))and (!empty($_POST['gewicht']))){ 
berechnen($_POST["laenge"],$_POST["breite"],$_POST["hoehe"],$_POST["gewicht"]);

 echo" <font size=6px>...das Paketmaß betraegt $paketmas</font>"; // hier wird $paketmas nicht verarbeitet --WARUM???
 echo" <font size=6px>...das Paketmaß betraegt". $paketmas." cm</font>"; //klappt auch nicht :=(

echo "<br><p><a href='paket_formular.html' title='Zurück zum Formular'>Zurück zum Formular</a></p>";}    
?>
 
Zuletzt bearbeitet:
Du musst den Rückgabewert einer Funktion schon einer Variablen zuweisen, wenn du ihn außerhalb der Funktin verwenden willst. Nur dadurch, dass du eine Variable zurückgibst, wird sie im aufrufenden Kontext nicht sichtbar.

PHP:
$paketmas = berechnen($_POST["laenge"],$_POST["breite"],$_POST["hoehe"],$_POST["gewicht"]);

PS: Dein switch sieht falsch aus...
 
Danke. Das hatte ich schlichtweg nicht gewusst. Was meinst du mit der vermeintlich falschen switch-Anweisung?
Syntaktisch ist sie jedenfalls fehlerfrei - der Interpreter meldet nix. Und logisch sollte dadurch der größte mit dem kleinsten Wert addiert werden.....
Könnte das natürlich auch wesentlich eleganter über ein array und den in php vorhandenen Sortierfunktionen lösen;
allerdings wurde dieser Lösungsweg bereits implementiert und steht mir somit nicht (mehr) zur Verfügung....
 
Das hatte ich schlichtweg nicht gewusst.
Ist ja kein Problem.
Was meinst du mit der vermeintlich falschen switch-Anweisung?
$l ist doch die Länge (eine Zahl). Diese wird im switch mit $l>$b && $h>$b verglichen, was einen Boolean zurückliefert. Durch den automatischen Typecast wird dann $l als Boolean interpretiert, was nicht immer das ist, was du haben willst:
PHP:
function berechnen($l, $b, $h, $g){
	switch ($l){
		case $l>$b && $h>$b:
			echo "erstes<br>\n";
			$paketmas=$l+$b;
			return $paketmas;
			break;
		case $l>$h && $b>$h:
			echo "zweites<br>\n";
			$paketmas=$l+$h;
			return $paketmas;    
			break;
		case $l<$b && $h>$b:
			echo "drittes<br>\n";
			$paketmas=$h+$b;
			return $paketmas;
			break;
	}
}

// OK
var_dump(berechnen(20, 10, 30, 40));
var_dump(berechnen(20, 15, 10, 40));
var_dump(berechnen(10, 20, 30, 40));
var_dump(berechnen(10, 30, 20, 40));

// nicht OK
var_dump(berechnen(0, -10, 0, 40));
var_dump(berechnen(0, -15, -20, 40));
var_dump(berechnen(0, 20, 30, 40));
var_dump(berechnen(0, 30, 20, 40));

Was du wahrscheinlich eigentlich haben willst, ist folgendes:
PHP:
function berechnen($l, $b, $h, $g){
	if ($l>$b && $h>$b){
		$paketmas=$l+$b;
		return $paketmas;
	}
	else if ($l>$h && $b>$h){
		$paketmas=$l+$h;
		return $paketmas;
	}
	else if ($l<$b && $h>$b){
		$paketmas=$h+$b;
		return $paketmas;
	}
	else {
		// keine Ahnung, was hier passieren soll...
	}
}
 
Im vorliegenden Fall arbeitet das Skript korrekt, da mittels
PHP:
if(empty($_REQUEST["laenge"]) || ($_REQUEST["laenge"] < 10) ||($_REQUEST["laenge"] > 300)){
keine negativen Werte übergeben werden können.
Was ich aber nicht nachvollziehen kann ist der Unterschied zwischen meiner switch-Lösung und deinem If-Konstrukt, soll heißen, warum wird beim SWITCH ein automatisches Typecasting generiert, beim IF angeblich aber nicht?
Und warum wirkt sich das Typecasting auf negative Werte nachteilig aus, auf positive hingegen nicht??
 
Zuletzt bearbeitet:
Das erklärt allerdings nicht, warum bei positiven Ergebnissen das richtige Paketmaß berechnet wird. Lt. Typecasting müsste dann doch immer ein ungerades Paketmaß zurück geliefert werden. $l+ $b = 1(Boolean)+$b==ungerade Zahl.....
 
Nicht der Inhalt der Variablen $l wird gecasted, sondern nur im Vergleich des Switch-Statements.

Das Problem sind in meinem Beispiel nicht die negativen Zahlen, sondern dass $l Null ist, was dann beim Vergleich als false interpretiert wird.

Warum meinst du eigentlich, dass du in diesem fall ein Switch brauchst? Du hast in deinem Fall dadurch keinen Vorteil, nur ein falschen Verhalten in einem Sonderfall.
 
Ach sooo.
Also nur,sofern $l null ergeben sollte, ergibt sich die Problematik. Das kann erst recht nie eintreffen.
Und meine switch-Wahl lag darin begründet, dass ich es für bequemer halte, switch-Anweisungen zu programmieren als mehrere IF-Konstrukte....
So long...
 
dass ich es für bequemer halte
Das ist kein guter Grund... aber wenn du unbedingt ein switch verwenden willst, solltest du es richtig machen:
PHP:
function berechnen($l, $b, $h, $g){
    switch (true){
        case $l>$b && $h>$b:
            echo "erstes<br>\n";
            $paketmas=$l+$b;
            return $paketmas;
            break;
        case $l>$h && $b>$h:
            echo "zweites<br>\n";
            $paketmas=$l+$h;
            return $paketmas;    
            break;
        case $l<$b && $h>$b:
            echo "drittes<br>\n";
            $paketmas=$h+$b;
            return $paketmas;
            break;
    }
}

PS: Der Parameter $g wird gar nicht verwendet - warum ist der da?
 
Und logisch sollte dadurch der größte mit dem kleinsten Wert addiert werden.....
Da hast du denn aber noch logische Fehler in deinen Abfragen, soweit ich das überblicke.
Für Minimum und Maximum hat PHP doch Funktionen verfügbar, warum nutzt du diese nicht?
PHP:
$sumMinMax = min($l,$b,$h) + max($l,$b,$h);

Du solltest auch kein Geheimnis daraus machen, was du eigentlich berechnen möchtest und das Kind beim Namen nennen: Paketklassen?

LG jspit
 
Habe das jetzt letztlich so gelöst:
PHP:
<!--

  Übung Paketpreisberechnung
  
  Erstellen Sie ein Formular, welches folgende Eingaben entgegen nimmt:
  
  Länge, Breite, Höhe in cm und Gewicht des Pakets in Gramm
  
  Beim Absenden soll dieselbe Datei wieder aufgerufen werden.
  
  Überprüfen Sie, ob das Formular abgesendet wurde und prüfen Sie, ob alle Felder ausgefüllt wurden. Geben Sie anderfalls eine Meldung aus.
  
  Paketpreisermittlung:
  
  Schreiben Sie eine Funktion, welche die Formulareingaben als Argumente/Parameter entgegen nimmt und die Berechnung durchführt.
  Speichern Sie diese Funktion in einer separaten Datei paketpreis.inc.php und binden Sie diese Datei in die aktuelle Datei ein (Formulardatei).
  
  Ermitteln Sie das Paketmaß aus Addition der kürzesten und der längsten Seite.
  
  Ermitteln Sie anschließend die richtige Paketklasse
  
  Folgende Paketklassen sollen berücksichtigt werden:
  
  Päckchen bis 37cm Paketmaß, Preis 3,60 Euro
  S-Paket bis 50cm Paketmaß, Preis 4,30 Euro
  M-Paket bis 80cm Paketmaß, Preis 5,70 Euro
  L-Paket bis 120cm Paktemaß, Preis 8,90 Euro
  XL-Paket bis 150cm Paketmaß, Preis 27,70 Euro und
  XXL-Paket bis 310cm Paketmaß, Preis 32,70 Euro
  
  
  Ausgaben der Funktion unterhalb des Formulars:
  
  Geben Sie die Paketklasse und den Preis aus. Falls das Paket zu groß ist, geben Sie einen Text aus, dass das Paket nicht befördert werden kann.
  
  Bei Päckchen und S-Paket bis L-Paket soll zusätzlich folgender Hinweis ausgegeben werden:
  "für die Abgabe im PaketShop und die Zustellung an der Haustür."
  
  Bei XL und XXL-Paket soll folgender Hinweis ausgegeben werden:
  "nur bei Abholung an der Haustüre und die Zustellung an der Haustür."
  

-->
<!Doctype html> 
<html> 
<head> 
<meta charset="utf-8"> <!-- charset[utf-8:]  definiert den deutschen Zeichensatz -->
<title> Paketdienst </title> 
<style>     <!-- hier ggf. CSS direkt einfügen -->
table {border: 1 px solid blue;}
td { border: 1px solid red; }
th {border:2px solid blue;}
</style>
</head>

<body> <!-- Definition des Bodybereiches -->
<script language=JavaScript> <!-- Hier ggf. JS-Code einfügen -->
</script>
<!-- Hier den HTML-Code einfügen -->
<center><table>
      <tr>
        <th>Attribute</th>
        <th>mimimal</th>
        <th>maximal</th>
		<th>Maßeinheit</th>
      </tr>
      <tr>
        <td>Länge</td>
        <td>10</td>
        <td>300</td>
		 <td>cm</td>
      </tr>
      <tr>
        <td>Breite</td>
        <td>10</td>
		 <td>300</td>
		  <td>cm</td>
      </tr>
	   <tr>
        <td>Höhe</td>
        <td>1</td>
        <td>150</td>
		 <td>cm</td>
      </tr>
	   <tr>
        <td>Gewicht</td>
        <td>10</td>
        <td>5000</td>
		 <td>gr.</td>
      </tr>
</table></center>
<?php
session_start();
?>
<form id="formular" name="form" action="paket.php" method="post">
<p>Länge des Paketes</p>
<input type="text" name="laenge" value="<?php if (!empty($_SESSION['laenge'])) echo $_SESSION['laenge']; ?>">
<p>Höhe des Paketes</p>
<input type="text" name="hoehe" id="hoehe" value="<?php if (!empty($_SESSION['hoehe'])) echo $_SESSION['hoehe']; ?>">
<p>Breite des Paketes</p>
<input type="text" name="breite" id="breite" value="<?php if (!empty($_SESSION['breite'])) echo $_SESSION['breite']; ?>">
<p>Gewicht des Paketes</p>
<input type="text" name="gewicht" id="gewicht" value="<?php if (!empty($_SESSION['gewicht'])) echo $_SESSION['gewicht']; ?>">
<label for="einheit">Gramm</label>
<input type="radio" id="einheit0" name="einheit" value="1" checked>
<label for="einheit">Kilogramm</label>
<input type="radio" id="einheit1" name="einheit" value="2"><br><br><br>
<input style="height:100px;width:100px;"type="submit" name="Button" value="BERECHNEN">
</form> 
</body>
</html>

und die im Formular aufgerufene paket.php

PHP:
<?php
session_start();
// Aus dem Grunde der einfacheren Inbetriebnahme wird auf eine Auslagerung der Funktionen verzichtet. Ansonsten müsste man
// sie halt mittels include_once(""); einbinden. Auserdem wird, anderst als verlangt, diese php-Datei nicht ständig 
// selbst aufgerufen! Der statische und der dynamische Teil werden folglich getrennt!! Um eine Wiederholung der grafschen
// Lösung zu vermeiden, wurde das Paketmaß nicht über ein array bestimmt. Furthemore wurden zwei Funktionen implementiert,
// anstatt alles in einer einzigen zu codieren.


function entscheiden($l,$b,$h){
    switch (true){
        case $l>=$b && $b>=$h: //F1
		echo"F1";
        $paketmas=$l+$h;
		return $paketmas;
	break;
		case $l>=$b && $b<=$h: //F2
		echo"F2";
        $paketmas=$l+$b; 
		return $paketmas;
	break;
		case $l<=$b && $b>=$h: //F3
		echo"F3";
        $paketmas=$b+$l;
		return $paketmas;
	break;
	}
}

function berechnen ($preis){
	switch (true){
		case $preis<=37:
			$ausgabe="Paketklasse I: Ihre Kundenkarte wird mit 3,60€ belastet";
		echo"<font size=6px>". $ausgabe."</font>";
			break;
		case $preis<=50:
			$ausgabe="Paketklasse S: Ihre Kundenkarte wird mit 4,30€ belastet";
			echo"<font size=6px>". $ausgabe."</font>";
			break;
		case $preis<=80:
			$ausgabe="Paketklasse M: Ihre Kundenkarte wird mit 5,70€ belastet";
			echo"<font size=6px>". $ausgabe."</font>";
			break;
		case $preis<=120:
			$ausgabe="Paketklasse L: Ihre Kundenkarte wird mit 8,90€ belastet";
		echo"<font size=6px>". $ausgabe."</font>";
			break;
		case $preis<=150:
			$ausgabe="Paketklasse XL: Ihre Kundenkarte wird mit 27,70€ belastet";
			echo"<font size=6px>". $ausgabe."</font>";
			break;
		case $preis<=310:
			$ausgabe="Paketklasse XXL: Ihre Kundenkarte wird mit 32,70€ belastet";
			echo"<font size=6px>". $ausgabe."</font>";
			break;
		default:
			$ausgabe="Beförderung nicht möglich. Paket zu groß. Bitte korrigieren Sie Ihre Maßeingaben";
			echo"<font size=6px>". $ausgabe."</font>";
			echo "<br><p><a href='paket_formular.html' title='Zurück zum Formular'>Zurück zum Formular</a></p>";
			exit;
	}
	
}

if(isset($_REQUEST["Button"]) && $_REQUEST["Button"] == "BERECHNEN"){
$_SESSION['laenge']=$_POST['laenge'];
$_SESSION['breite']=$_POST['breite'];
$_SESSION['hoehe']=$_POST['hoehe'];
$_SESSION['gewicht']=$_POST['gewicht'];
$fehler=array();
if(empty($_REQUEST["laenge"]) || ($_REQUEST["laenge"] < 10) ||($_REQUEST["laenge"] > 300)){
$fehler["laenge"]="Bitte eine gültiges Längenmaß in(cm) eingeben";
}
if(empty($_REQUEST["breite"]) || ($_REQUEST["breite"] < 10) ||($_REQUEST["breite"] > 300)){
$fehler["breite"]="Bitte eine gültiges Breitenenmaß in(cm) eingeben";
}
if(empty($_REQUEST["hoehe"]) || ($_REQUEST["hoehe"] < 1) ||($_REQUEST["hoehe"] > 150)){
$fehler["hoehe"]="Bitte eine gültiges Höhennmaß in(cm) eingeben";
}
if(empty($_REQUEST["gewicht"])|| ($_REQUEST["gewicht"] < 10) ||($_REQUEST["gewicht"] > 5000)){
$fehler["gewicht"]="Bitte ein gültiges Gewicht in (Gramm) eingeben";
}
}
if ($fehler){
$messages='';
foreach($fehler as $value){
	$messages .=$value . '<br>';}
echo $messages;
echo "<br><p><a href='paket_formular.php' title='Zurück zum Formular'>Zurück zum Formular</a></p>";
exit;
}
$paketmas = entscheiden($_POST["laenge"],$_POST["breite"],$_POST["hoehe"],$_POST["gewicht"]); 
echo" <font size=5px>...das Paketmaß beträgt ".$paketmas." cm. Das führt zu folgender Kostenrechnung....<br><br><br></font>";
berechnen($paketmas);
echo "<br><p><a href='paket_formular.php' title='Zurück zum Formular'>Zurück zum Formular</a></p>";    
?>

Vielleicht nicht gerade die eleganteste Lösung, aber sie funzt!!
 
Zuletzt bearbeitet:
.. und ein Aufruf von entscheiden(20,30,50); bringt auch kein Resultat.

Intessiert aber scheinbar nicht mehr, funzt ja. Problem gelöst.
 
Zuletzt bearbeitet:
Zurück
Oben