Undefined Variable? Volgens mij is hij wel gedefinieerd.

Status
Niet open voor verdere reacties.

l.degroot01

Gebruiker
Lid geworden
18 jan 2003
Berichten
161
Hallo,

Ik ben wat aan het oefenen met PHP en heb een functie aangemaakt met daarin een while loopje, de code wordt wel succesvol uitgevoerd maar krijg wel 2 foutmeldingen:

  1. Notice: Undefined variable: result in C:\Users\Leslie de Groot\Desktop\School\USBstick\USBWebserver\root\function\while.php on line 18
  2. Notice: Undefined variable: result in C:\Users\Leslie de Groot\Desktop\School\USBstick\USBWebserver\root\function\while.php on line 19

Hieronder de code:

Code:
<!--
Programmer: Leslie de Groot
Date: 31-10-2010
Exercise While loop
Goal: Multiply 5 till result reaches 150.
-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>While loop PHP</title>
    </head>
    <body>
        <?php
        $result = "0";

        function multiply5($a) {
            while ($result <= 150) {
                print($result . "<BR>");
                $a++;
                $result = $a * 5;
            }
        }

        multiply5(0);
        ?>
    </body>
</html>

Zal wel een klein beginnersfoutje zijn, maar kom er zo 1,2,3 niet uit.
Ander vraagje, is er niet net als de W3 vaidator voor HTML ook niet zoiets voor PHP? Dat pakt de W3 validator namelijk niet. Ik programmeer met Netbeans welke vaak al de meeste fouten aangeeft, maar bij dit stukje code geeft hij niks aan.
 
Welkom in de wondere wereld van de variable scope.

Het probleem is dat
PHP:
$result = "0";
(weet je trouwens zeker dat hier aanhalingstekens rond het getal moeten?) zich in de global scope bevindt, terwijl "$result" op regel 18 en 19 gezocht worden in de local scope.
Je kan dit probleem oplossen met het keyword "global" of de "$GLOBALS" superglobal (zie bovenstaande link), maar netter (en in dit geval voldoende) is om "$result = 0;" binnen de functie te zetten (als eerste regel).
 
Bedankt voor de hulp. nu werkt het inderdaad, heb de code verder uitgebreid naar:

Code:
<!--
Programmer: Leslie de Groot
Date: 31-10-2010
Exercise Multiply through form
Goal: Multiply.
-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>While loop PHP</title>
    </head>
    <body>
        <div align="center">
            <h2>
                Oefening PHP
            </h2>
        </div>
        <form action="index.php" method="POST">
            <table>
                <tr>
                    <th>
                        Tafel van:
                    </th>
                    <td>
                        <input type="text" name="tafel">
                    </td>
                </tr>
                <tr>
                    <th>
                        Antwoord niet hoger dan:
                    </th>
                    <td>
                        <input type="text" name="max">
                    </td>
                </tr>
                <tr>
                    <td>
                        <input type="submit" name="submit" value="Bereken">
                    </td>
                </tr>
            </table>
        </form>
        <hr><br>
        <div align="center">
            <table border='1'>
        <?php
        if(isset($_POST["submit"])){
        print("
            <tr>
                <th>
                    Berekening
                </th>
                <th>
                    Antwoord
                </th>
            </tr>");
        }
            ?>
            <?php
            if (isset($_POST["submit"])) {

                function multiply($a) {
                    $result = "0";
                    $tafel = $_POST["tafel"];
                    $max = $_POST["max"];
                    while ($result <= $max) {
                        print("<tr><td>" . $a . " x " . $tafel . " =</td><td align='center'>" . $result . "</td></tr>");
                        $a++;
                        $result = $a * $tafel;
                    }
                }

                multiply(0);
            }
            ?>
        </table></div>
    </body>
</html>

En hij doet netjes wat hij moet doen.

Nu probeer ik hetzelfde te bereiken met een for loopje, wat volgens mij was:
for(beginwaarde; eindwaarde; stapwaarde){
Code
}

Maar ik krijg de eindwaarde van 150 niet geprint.

Code:
<!--
Programmer: Leslie de Groot
Date: 31-10-2010
Exercise For loop
Goal: Multiply 5 till result reaches 150.
-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>For loop PHP</title>
    </head>
    <body>
        <?php
        function multiply5($a) {
            for ($result = 0; $result <= 150; $a++) {
                print($result . "<BR>");
                $a++;
                $result = $a * 5;
            }
        }

        multiply5(0);
        ?>
    </body>
</html>

Als ik de eindwaarde verander naar: $result = 150, dan flipt de browser en loopt de boel vast.

Edit 17:53 - Als ik de eindwaarde verander naar"$result <= 155, dan print hij wel de eindwaarde van 155 maar nog steeds niet de waarde 150. anyone?
Edit 18:06 - De uitkomsten kloppen ook niet helemaal vanaf 15, telt hij er steeds 10 bij op, daarom weergeeft hij de 150 wss ook niet.
 
Laatst bewerkt:
Laat maar probleem is opgelost, had er per ongeluk 2 keer $a++ in staan, zie code:

PHP:
        <?php
        function multiply5($a) {
            for ($result = 0; $result <= 150; $a++) {
                print($result . "<BR>");
                $a++;
                $result = $a * 5;
            }
        }

        multiply5(0);
        ?>
 
Dit is trouwens geen betrouwbare manier om te controleren of het formulier verstuurd is
PHP:
if(isset($_POST["submit"])){
Niet alle browsers sturen dit, in alle gevallen, mee. Een betrouwbare manier is
PHP:
if ($_SERVER['REQUEST_METHOD'] == "POST"){
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan