Wie binden mysqli bind_param Argumente dynamisch in PHP?
Ich gelernt haben, zu verwenden, vorbereitet und gebunden Anweisungen für meine sql-Abfragen, und ich komme mit diesem so weit, es funktioniert ok, aber es ist nicht dynamisch an alle, wenn kommt zu mehreren Parametern oder, wenn es keine parameter benötigt,
public function get_result($sql,$parameter)
{
# create a prepared statement
$stmt = $this->mysqli->prepare($sql);
# bind parameters for markers
# but this is not dynamic enough...
$stmt->bind_param("s", $parameter);
# execute query
$stmt->execute();
# these lines of code below return one dimentional array, similar to mysqli::fetch_assoc()
$meta = $stmt->result_metadata();
while ($field = $meta->fetch_field()) {
$var = $field->name;
$$var = null;
$parameters[$field->name] = &$$var;
}
call_user_func_array(array($stmt, 'bind_result'), $parameters);
while($stmt->fetch())
{
return $parameters;
//print_r($parameters);
}
# close statement
$stmt->close();
}
Dies ist, wie ich es nenne-Objekt-Klassen,
$mysqli = new database(DB_HOST,DB_USER,DB_PASS,DB_NAME);
$output = new search($mysqli);
Manchmal habe ich nicht übergeben zu müssen, in jedem Parameter,
$sql = "
SELECT *
FROM root_contacts_cfm
";
print_r($output->get_result($sql));
Manchmal brauche ich nur einen Parameter,
$sql = "
SELECT *
FROM root_contacts_cfm
WHERE root_contacts_cfm.cnt_id = ?
ORDER BY cnt_id DESC
";
print_r($output->get_result($sql,'1'));
Manchmal brauche ich nur mehr als einen Parameter,
$sql = "
SELECT *
FROM root_contacts_cfm
WHERE root_contacts_cfm.cnt_id = ?
AND root_contacts_cfm.cnt_firstname = ?
ORDER BY cnt_id DESC
";
print_r($output->get_result($sql,'1','Tk'));
So, ich glaube, dass diese Zeile nicht dynamisch genug für die dynamischen Aufgaben vor,
$stmt->bind_param("s", $parameter);
Bauen eine bind_param dynamisch, die ich gefunden habe, das auf die anderen posts online.
call_user_func_array(array(&$stmt, 'bind_params'), $array_of_params);
Und ich versuchte, Sie zu verändern code aus php.net aber ich bin nirgends bekommen,
if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+
{
$refs = array();
foreach($arr as $key => $value)
$array_of_param[$key] = &$arr[$key];
call_user_func_array(array(&$stmt, 'bind_params'), $array_of_params);
}
Warum? Irgendwelche Ideen, wie ich das hinbekomme?
Oder vielleicht gibt es bessere Lösungen?
InformationsquelleAutor laukok | 2011-02-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
fand die Antwort für mysqli:
dann:
mysqli ist so lahm, wenn dazu kommt. Ich denke, ich sollte die Migration auf PDO!
Die variable
$bind_name
ist acually unbenutzt und$$bind_name
macht den code unübersichtlich, während$$
nicht haben eine Besondere Bedeutung in PHP. Das gleiche gilt für$var
und$$var
.InformationsquelleAutor laukok
Verwendung von PHP 5.6 Sie können dies tun, einfach mit Hilfe von Auspacken Betreiber(
...$var
) und verwenden get_result() statt bind_result()Beispiel:
InformationsquelleAutor rray
Diese Antwort nicht wirklich viel helfen, aber Sie sollten ernsthaft erwägen, Umstellung auf PDO von mysqli.
Der Hauptgrund für dieses ist, weil PDO tut, was Sie zu tun versuchen, in mysqli mit built-in-Funktionen. Zusätzlich zu Handbuch param Bindung, die execute-Methode kann ein array von Argumenten statt.
PDO ist einfach zu verlängern, und das hinzufügen von convenience-Methoden zum abrufen-alles-und-zurück, statt der prepare-execute-Tanz ist sehr einfach.
Zu sagen
PDO
ist sehr langsamer ein wenig. Der Unterschied in der Leistung ist zu klein, um wahrscheinlich zu sein der Haupt-Engpass (wenn Auffällig)Vielen Dank für die Korrektur. Ich lese ein benchmark, wo der Unterschied war mehr als deutlich. Und meinen eigenen tests hatte mehr Bemerkenswerte Ergebnisse.
es ist schon langsam wie flippin Weihnachten jedesmal, wenn ich es benutzt habe. mysqli ist so viel schneller, ich kann es nicht rechtfertigen, die Bequemlichkeit. aber ich bin Neigung in Richtung zu ihm.
InformationsquelleAutor Charles
Mit PHP 5.6 oder höher:
Mit PHP 5.5 oder niedriger Sie könnte (und ich haben) erwarten, dass die folgenden arbeiten:
...aber
mysqli_stmt::bind_param
erwartet seine Parameter werden Referenzen in der Erwägung, dass diese übergibt eine Liste von Werten.Können Sie arbeiten, um dieses (obwohl es ein hässlicher workaround), indem zunächst ein array von Referenzen auf das original-array.
InformationsquelleAutor Matt Raines
Fand ich ein nettes mysqli-Klasse, es kann mit dynamischen Parametern und einfach zu bedienen
https://github.com/ajillion/PHP-MySQLi-Database-Class
Könnten Sie finden den Quellcode, wie es dynamische erstellen der Abfrage
https://github.com/ajillion/PHP-MySQLi-Database-Class/blob/master/MysqliDb.php
InformationsquelleAutor Steely Wing
Ich löste es, indem ein system ähnlich wie die PDO. Die SQL-Platzhalter-Zeichenfolgen sind, starten Sie mit der Doppel-Punkt-Charakter. Ex .:
Dann können Sie die Daten geben Sie direkt in die Platzhalter-Zeichenfolge, indem die Spezifikation Briefe sofort nach dem Doppel-Punkt und dem Anhängen eines Unterstrichs, bevor Sie den Merksatz variable. Ex .:
Wenn kein Typ Charakter Hinzugefügt wird, dann wird die Funktion bestimmt die Art der Daten, die durch die Analyse der php-variable, die die Daten hält. Ex .:
Die Funktion gibt ein array von Typen und ein array von Werte mit denen, die Sie ausführen können die php-Funktion mysqli_stmt_bind_param() in einer Schleife.
InformationsquelleAutor Sal Celli