我喜歡Dynamic SQL的靈活性,我喜歡安全性+改進的Prepared Statements性能。所以我真正想要的是Dynamic Prepared Statements,這很麻煩,因爲bind_param和bind_result接受「固定」數量的參數。所以我使用了一個eval()語句來解決這個問題。但我覺得這是一個糟糕的主意。這裏是我的意思的示例代碼動態準備的語句錯誤嗎? (使用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);
是最後一個eval()語句是個壞主意嗎?我試圖通過在變量名稱$ param後面封裝值來避免代碼注入。
有沒有人有意見或其他建議?我需要注意哪些問題?
您可能要改一下你的問題標題有點,所以其他人可以更容易地找到你的問題。 – Tomalak 2008-10-14 16:06:31