Ich mag die Flexibilität von Dynamic SQL und ich mag die Sicherheit + verbesserte Leistung von vorbereiteten Anweisungen. Also, was ich wirklich will, ist Dynamic Prepared Statements, was mühsam zu machen ist, da bind_param und bind_result "feste" Anzahl von Argumenten akzeptieren. Also habe ich eine eval() Anweisung verwendet, um dieses Problem zu umgehen. Aber ich habe das Gefühl, dass das eine schlechte Idee ist. Hier ist ein Beispielcode dessen, was ich meineSind dynamische vorbereitete Anweisungen schlecht? (mit php + mysqli)
// array of WHERE conditions
$param = array('customer_id'=>1, 'qty'=>'2');
$stmt = $mysqli->stmt_init();
$types = ''; $bindParam = array(); $where = ''; $count = 0;
// build the dynamic sql and param bind conditions
foreach($param as $key=>$val)
{
$types .= 'i';
$bindParam[] = '$p'.$count.'=$param["'.$key.'"]';
$where .= "$key = ? AND ";
$count++;
}
// prepare the query -- SELECT * FROM t1 WHERE customer_id = ? AND qty = ?
$sql = "SELECT * FROM t1 WHERE ".substr($where, 0, strlen($where)-4);
$stmt->prepare($sql);
// assemble the bind_param command
$command = '$stmt->bind_param($types, '.implode(', ', $bindParam).');';
// evaluate the command -- $stmt->bind_param($types,$p0=$param["customer_id"],$p1=$param["qty"]);
eval($command);
Ist das letzte Eval() Aussage eine schlechte Idee? Ich habe versucht, die Code-Injektion zu vermeiden, indem ich Werte hinter dem Variablennamen $ param kapselt.
Hat jemand eine Meinung oder andere Vorschläge? Gibt es Probleme, auf die ich achten muss?
Vielleicht möchten Sie Ihre Frage umformulieren Titel ein wenig, damit andere Ihre Frage leichter finden können. – Tomalak