Prepared Statements über MySQLi in eigener MySQL-Klasse

Milliongame

Mitglied
Hallo,

ich bin gerade dabei meine alte MySQL-Klasse zu überarbeiten. Dabei stelle ich natürlich, mit dem samt den neuen "Features", auf die MySQLi-Erweiterung um. Das Problem sind die Prepared Statements.

Ich möchte über eine Methode die Platzhalter ("?") definieren, da dieser aber nicht als Array oder ähnliches definiert werden, sondern man direkt die Referenz über die Methode mysqli_stmt::bind_result() angibt, gibt ein Problem. Zwar kann man ja über func_get_args() und co relativ leicht die "unbegrenzte" Anzahl an Parameter umsetzen, jedoch kann man diese nicht als Referenz setzen, kennt jemand eine Lösung für das Problem?

Ich hoffe, ich habe meine Problem verständlich ausgedrückt ...

EDIT: Im Prinzip suche ich nur einen Weg, mysqli_stmt::bind_result und mysqli_ stmt:: bind_ param über einen bzw. zwei Parameter aufrufen, im Ideal ein Array, das die Namen zu den Referenz Variablen beinhaltet, quasi wie bei einer Callback-Angabe ...
 
Zuletzt bearbeitet:
Hallo Milliongame,

ich glaube, die Funktion [phpf]call_user_func_array[/phpf] ist genau das richtige für dich!
Ein kleines Beispiel: http://codepad.org/p43eE9fw
PHP:
<?php

function func2()
{
  var_dump( func_get_args() );
}

function func1()
{
  $args = func_get_args();
  
  $new_args = array_merge( array('func1'), $args );

  call_user_func_array(func2, $new_args);
}
func1('hello', 'world');
Hier ruft die Funktion func1() die Funktion func2() auf und zwar ist der 1. Parameter 'func1' und der Rest sind die eigenen, die an func1() selbst übergeben worden sind.
 
Der Ansatz von ComFreek war, das nachdem ich gesucht habe, hätte ich eigentlich auch selbst daruf kommen können, aber trotzdem danke erstmal ...

Nun habe ich meine Methode entsprechend umgebaut, hier der entsprechende Teil (unnötiger Code entfernt):
PHP:
	protected $statement = null;
	
	public function __construct(MySQLi_Stmt $statement) {
		$this->statement = $statement;

	}

	public function bindResult() {
		$arguments = func_get_args();
		return call_user_func_array(array($this->statement, 'bind_result'), $arguments);
	}

Das Problem ansich ist, ich bekomme einen Fehler (Warnung), das ich keine Referenzen angeben habe ("Parameter 1 to mysqli_stmt::bind_result() expected to be a reference, value given").

Ich könnte jetzt zwar theoretisch der Methode bindResult etliche Parameter eintragen, welche eine Referenz sein müssen, jedoch ists natürlich alles andere als eine schöne und Standard-Konforme Lösung.

Gibt's ne andere Möglichkeit, wie ich voraussetzten kann, das die Parameter der Methode bindResult() Referenzen sein müssen?
 
Zuletzt bearbeitet:
Du müsstest IMHO die Variablen als Referenz an bindResult() übergeben. Mit Hilfe des Adress-Operators & kannst du eine Referenz anstatt eine Kopie der Variable übergeben. Dies ist allerdings eine als DEPRECATED eingestufte Behandlung und könnte mit einer der nächsten Versionen von PHP entfernt werden.

Was spricht denn eigentlich gegen meine Lösung? Damit wärst du von solchen Nebenkriegsschauplätzen unabhängig. Sowas verkompliziert den Code nur.

EDIT: Im Übrigen gibts in den Kommentaren zur bind_result()-Methode ein schönes Beispiel für die Anwendung von call_user_func_array(): http://www.php.net/manual/de/mysqli-stmt.bind-result.php#99175
 
Zuletzt bearbeitet:
@Saftmeister: Das ganze wäre ja etwas Sinnlos, wenn ich extra ein Statement erstelle und wieder zurück gehe auf ein "stink normales" Result Objekt, außerdem auch Performance verschwendung.

Ich möchte die Vorteile von Prepared Statements verwenden, d.h. Performance-Gewinn bei mehrfacher Abfrage und den Platzhalter. Wenn auf ein MySQLi_Result zurück gehe, habe ich ja diese Vorteile nicht mehr.

@All: Habe mir das Beispiel (siehe oben) angeschaut und entsprechende auf meine Bedürfnisse eben schnell umgebastelt / abstrahiert, das ganze läuft nun wie gewünscht.

Für alle, die unwahrscheinlicher Weise, das selbe Problem haben sollten, hier der Lösungsansatz:
PHP:
/* 
* $this->statement = MySQLi_Stmt
*
* $data = Enthält später die entsprechende Werte aus dem Prepared Query
* $columns = Die entsprechenden Spalten, welche aus der Datenbank ausgelesen werden
*/
	public function bindResult(array &$data, array $columns) {
		$parameter = array();
		
		foreach ($columns as $column) {
			$parameter[] = &$data[$column];
		}
		
		return call_user_func_array(array($this->statement, 'bind_result'), $parameter);
	}
 
Zuletzt bearbeitet:
Zurück