Me gusta la flexibilidad de Dynamic SQL y me gusta la seguridad + el rendimiento mejorado de las declaraciones preparadas. Entonces, lo que realmente quiero es declaraciones preparadas dinámicas, lo cual es problemático porque bind_param y bind_result aceptan una cantidad de argumentos "fija". Así que hice uso de una declaración eval() para evitar este problema. Pero tengo la sensación de que esta es una mala idea. Aquí está el código de ejemplo de lo que quiero decir¿Las declaraciones preparadas dinámicas son malas? (con 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);
¿Es esa última declaración de eval() una mala idea? Intenté evitar la inyección de código encapsulando valores detrás del nombre de la variable $ param.
¿Alguien tiene una opinión u otras sugerencias? ¿Hay algún problema que deba tener en cuenta?
Es posible que desee formular su pregunta titular un poco, para que otros puedan encontrar su pregunta más fácilmente. – Tomalak