Hallo,
ich habe folgende Methode in einer selbstgebauten Query-Klasse, die mit Singleton auf ein Databaseobjekt zugreift (das über eine Factory).
Ich wollte mir die mysqli Klasse einfacher schreiben, sodass ich nur noch mit bind( mixed $something ) einen Parameter binden muss. Ohne die Angabe der Typen 's' für string etc...
Nun muss ich den bind_param Aufruf mithilfe der Reflection und einem invoke-Aufruf vornehmen.
Das Problem ist, dass bind_param als Parameter Referenzen haben will, sodass invokeArgs(...) nicht funktioniert, das der zweite Parameter ein Array. Mir ist klar, wieso der Fehler auftritt, jedoch weiß ich nicht wie ich das umgehen kann. Wieso ist denn bind_param so scharf auf Referenzen?
Hier noch mein Code, vielen Dank schon mal ;-)
ich habe folgende Methode in einer selbstgebauten Query-Klasse, die mit Singleton auf ein Databaseobjekt zugreift (das über eine Factory).
Ich wollte mir die mysqli Klasse einfacher schreiben, sodass ich nur noch mit bind( mixed $something ) einen Parameter binden muss. Ohne die Angabe der Typen 's' für string etc...
Nun muss ich den bind_param Aufruf mithilfe der Reflection und einem invoke-Aufruf vornehmen.
Das Problem ist, dass bind_param als Parameter Referenzen haben will, sodass invokeArgs(...) nicht funktioniert, das der zweite Parameter ein Array. Mir ist klar, wieso der Fehler auftritt, jedoch weiß ich nicht wie ich das umgehen kann. Wieso ist denn bind_param so scharf auf Referenzen?
Hier noch mein Code, vielen Dank schon mal ;-)
PHP-Code:
public function execute( )
{
// singleton
$database = Factory :: getComponent( "Database" ) -> getConnection( );
$this -> _statement = $database -> stmt_init( );
if( ! $this -> _statement )
throw new DatabaseQueryException( $database -> connect_errno . ': ' . $database -> connect_error );
$this -> _statement -> prepare( $this -> _query );
$o = new ReflectionObject($this -> _statement );
$rClass = new ReflectionClass( "mysqli_stmt" );
$rMethod = $rClass -> getMethod( "bind_param" );
// liefert den String mit den Typen (s,i,...)
// und den konkreten Werten
$reflectionCall = $this -> _binding -> getReflectionCallArray( );
$rMethod -> invokeArgs( $this -> _statement, $reflectionCall );
$this -> _statement -> execute( );
// just a test
echo $this -> _statement -> num_rows( );
}
Kommentar