[php 4.3.11]Vreemde foutmelding bij foreach in Windows

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • DPLuS
  • Registratie: April 2000
  • Niet online
Ik heb de volgende code:

PHP:
1
2
3
4
5
$res = NULL;

foreach ($res as $key => $value) {
    echo $key . "<br />";
}


Nu krijg ik in windows (Apache en PHP 4.3.11) de volgende foutmelding:
Warning: Invalid argument supplied for foreach() in c:\htdocs\temp\array.php on line 24

Terwijl als ik diezelfde code op mijn Debian Testing machine (php 4.3.10-15) uitvoer, GEEN foutmelding krijg.

Ik ging er eigenlijk vanuit dat als $res een NULL-value had, dat foreach dan GEEN foutmelding moet geven.
Is dit nu een bug in de Win32 port van PHP?

De reden van deze post is eigenlijk deze code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    function &GetSingleRow($function, $query, $data=null) {
        if (!isset($this->dbh) || !is_object($this->dbh)) $this->openDatabase();
        if (DB::iserror($this->dbh)) {
            $this->handle_error($this->dbh, $function);
            return;
        }

        $res =& $this->dbh->getRow($query, $data);

        if (DB::iserror($this->dbh)) {
            $this->handle_error($this->dbh, $function);
            return;
        }
        if (DB::iserror($res)) {
            $this->handle_error($res, $function);
            return;
        }
        
        if (!is_null($res)) {
            foreach ($res as $key => $value) {
                $res[$key] = stripslashes($value);
            }
        }
        return $res;
    }


Waarin ik nu de is_null-controle heb toegevoegd (if (!is_null($res))) zodat PHP geen warning geeft op mijn W2K-machine.

Acties:
  • 0 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Staat je error reporting anders ingesteld op je W2k machine? Zowiezo hoor je dat eerst te checken imo.

Acties:
  • 0 Henk 'm!

  • DPLuS
  • Registratie: April 2000
  • Niet online
EALL, op beide machines, php.ini's zijn identiek aan elkaar.
Het gaat mij erom wat de standard-behaviour moet zijn van PHP in deze situatie.

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
In plaats van controleren op null kun je ook casten naar een array, of een lege array assignen. In beide gevallen word de foreach ook niet doorlopen.
PHP:
1
2
3
foreach ((array) null as $k => $v);
//of
if(is_null($array)) $array = array();


Overigens
This simply gives an easy way to iterate over arrays. foreach works only on arrays, and will issue an error when you try to use it on a variable with a different data type or an uninitialized variable.

[ Voor 36% gewijzigd door PrisonerOfPain op 10-06-2005 17:32 ]


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

DPLuS schreef op vrijdag 10 juni 2005 @ 17:26:
EALL, op beide machines, php.ini's zijn identiek aan elkaar.
Het gaat mij erom wat de standard-behaviour moet zijn van PHP in deze situatie.
Zoals gezegd is het dus standaard om een melding te geven van het niet-array zijn van de variabele. Ik gok dat je op een of andere manier foutmeldingen onderdrukt (kijk es in je error_log op die debian doos) zodat je ze in het ene geval wel en andere geval niet ziet.

Acties:
  • 0 Henk 'm!

  • DPLuS
  • Registratie: April 2000
  • Niet online
Nee, 't ligt toch echt aan de PHP4-package uit de Debian Testing branch.
Ik heb al een bug gesubmit via hun "reportbug"-pakketje.
Pagina: 1