Frage

In einem Projekt, das ich bin, zu wrap up, habe ich schon geschrieben und implementiert ein Objekt-relationalen mapping-Lösung für PHP.Bevor die Zweifler und Träumer zu Schreien: "wie auf der Erde?", entspannen, - ich habe noch keinen Weg gefunden, um späte statische Bindung der Arbeit-ich arbeite einfach um es in der besten Weise, die ich nur kann.

Wie auch immer, ich bin derzeit nicht mit prepared statements für die Abfragen, denn ich konnte nicht kommen mit einem Weg, um pass eine variable Anzahl von Argumenten an, die die bind_params() oder bind_result() Methoden.

Warum brauche ich die Unterstützung einer Variablen Anzahl von Argumenten, Fragen Sie?Da die Superklasse meiner Modelle (denken Sie an meine Lösung als gehackt-up-PHP ActiveRecord Möchtegern -) ist, wo die Abfragen definiert ist, und so die find () - Methode, zum Beispiel, weiß nicht, wie viele Parameter würde es brauchen, zu binden.

Nun, ich habe schon gedacht, der Bau einer Liste von Argumenten und die übergabe eines string eval(), aber ich mag es nicht, dass die Lösung sehr viel-ich möchte lieber einfach umzusetzen meinem eigenen Sicherheit-Prüfungen und-pass auf-Anweisungen.

Hat jemand irgendwelche Vorschläge haben (oder success stories) über Sie, wie dieses zu erhalten getan?Wenn Sie mir helfen können, lösen dieses erste problem, vielleicht können wir bewältigen die Bindung des ResultSet (etwas, was ich vermute schwieriger sein wird, oder zumindest mehr Ressourcen-intensive, wenn es um eine erste Abfrage, um zu bestimmen, die die Struktur einer Tabelle).

War es hilfreich?

Lösung

In PHP können Sie übergeben Sie eine variable Anzahl von Argumenten an eine Funktion oder Methode, die durch die Verwendung von call_user_func_array.Ein Beispiel für eine Methode wäre:

call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params);

Die Funktion wird aufgerufen werden, das mit jedem Element im array übergeben, als sein eigenes argument.

Andere Tipps

Sie haben zu machen sicher, dass $array_of_params ist array von links zu Variablen, nicht die Werte selbst.Sollte sein:

$array_of_params[0] = &$param_string; //link to variable that stores types

Und dann...

$param_string .= "i";
$user_id_var = $_GET['user_id'];//
$array_of_params[] = &$user_id_var; //link to variable that stores value

Ansonsten (wenn es ist array von Werten) erhalten Sie:

PHP-Warnung:Parameter 2 zu mysqli_stmt::bind_param() erwartet, dass eine Referenz


Noch ein Beispiel:

$bind_names[] = implode($types); //putting types of parameters in a string
for ($i = 0; $i < count($params); $i++)
{
   $bind_name = 'bind'.$i; //generate a name for variable bind1, bind2, bind3...
   $$bind_name = $params[$i]; //create a variable with this name and put value in it
   $bind_names[] = & $$bind_name; //put a link to this variable in array
}

und BOOOOOM:

call_user_func_array( array ($stmt, 'bind_param'), $bind_names); 

Ich bin nicht erlaubt zu Bearbeiten, aber ich glaube, in den code

call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params);

Die Referenz vor $stmt ist nicht notwendig.Da $stmt ist das Objekt und bindparams ist die Methode in dem Objekt, die Referenz ist nicht nötig.Es sollte sein:

call_user_func_array(array($stmt, 'bindparams'), $array_of_params);

Weitere Informationen finden Sie im PHP-Handbuch unter Callback-Funktionen."

call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params);

Hat nicht funktioniert für mich in meiner Umgebung aber diese Antwort hat mich auf die richtige Spur.Was tatsächlich funktionierte war:

$sitesql = '';
$array_of_params = array();
foreach($_POST['multiselect'] as $value){
    if($sitesql!=''){
        $sitesql .= "OR siteID=? ";
        $array_of_params[0] .= 'i';
        $array_of_params[] = $value;
    }else{
        $sitesql = " siteID=? ";
        $array_of_params[0] .= 'i';
        $array_of_params[] = $value;
    }
}

$stmt = $linki->prepare("SELECT IFNULL(SUM(hours),0) FROM table WHERE ".$sitesql." AND week!='0000-00-00'");
call_user_func_array(array(&$stmt, 'bind_param'), $array_of_params);
$stmt->execute();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top