phpbar.de logo

Mailinglisten-Archive

[php] Problem "undefined index" lösen

[php] Problem "undefined index" lösen

Sebastian Mendel lists at sebastianmendel.de
Mit Aug 10 17:01:44 CEST 2005


Stephan Beck wrote:
> Hallo allerseits,
> 
> ich arbeite gerade an einer Klasse zur Vereinfachung der Datenbankabfragen.
> Dabei habe ich eine Funktion, die mir nach Übergabe eines Resultsets und einer Objektklasse ein Array mit Objekten der übergebenen Klasse zurückliefert.
> Da aber die übergebenen Klassen unterschiedliche Id-Benennungen haben können, muss ich zusätzlich die Ids == primären Datenbankschlüssel übergeben.
> 
> Nun wird aber beim eval-Aufruf auf einen vorher nicht definierten Index zugegriffen.
> Gibt es eine Möglichkeit dieses Problem zu umgehen oder zu lösen?
> 
> Gruß und danke,
> 
> Stephan
> 
>     function resultsetToArray($result,$object_class,$id_array=array("id"))
>     {
>         $i = 0;
>         $my_id = "";
>         foreach ($id_array as $currentId)
>         {
>             if ($i > 0) {
>                 $my_id .= ",";
>             }
>             $my_id .= "\$myrow['$currentId']";
>             $i++;
>         }
>     
>         $my_array = array();
>         $temp = ucfirst($object_class);
>         while ($myrow = $this->fetchRow($result))
>         {
>            eval("\$object = new $temp($my_id);");
>            $object->fillObject($myrow);
>            array_push($my_array,$object);
>         }
>         return $my_array;
>     }
> 

eval ist evil! und schwierig ;-)

class Foo {
     function Foo( $var ) { echo 'var: ' . $var; }
}

$id_array=array( 'id', 'name' );
$myrow['id'] = 15;
$myrow['name'] = 'fred';
$my_id = "return \$myrow['" . implode( "'] . ',' . \$myrow['", $id_array 
  ) . "'];";
$temp = 'Foo';
$object = new $temp(eval( $my_id ));


dein Funktion müsste also so aussehen:

function resultsetToArray( $result, $object_class, $id_array = array( 
'id' ) )
{
     $my_id = "return \$myrow['" . implode( "'] . ',' . \$myrow['", 
$id_array  ) . "']";

     $my_array = array();
     $object_class = ucfirst($object_class);
     while ($myrow = $this->fetchRow($result))
     {
         $pk = eval( $my_id );
         $my_array[$pk] = new $object_class($pk);
         $my_array[$pk]->fillObject($myrow);
     }
     return $my_array;
}


oder ohne eval():

function resultsetToArray( $result, $object_class, $id_array = array( 
'id' ) )
{
     $my_array = array();
     $object_class = ucfirst($object_class);
     while ($myrow = $this->fetchRow($result))
     {
         foreach ( $id_array AS $id )
         {
             $pk = empty( $pk ) ? '' : $pk.',';
             $pk .= $myrow[$id];
         }
         $my_array[$pk] = new $object_class($pk);
         $my_array[$pk]->fillObject($myrow);
     }
     return $my_array;
}


aber alles ungetested ...


-- 
Sebastian Mendel

www.sebastianmendel.de
www.sf.net/projects/phpdatetime | www.sf.net/projects/phptimesheet

php::bar PHP Wiki   -   Listenarchive