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