Mailinglisten-Archive |
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