php - mysqli_query - Función preparada dinámica de MySQLi con enlace de matriz
mysqli_fetch_array (1)
Estoy intentando crear una función de consulta de base de datos que puede tomar múltiples parámetros y reutilizarse en otro lugar; sin embargo, probé varios métodos en línea similares a mi enfoque y no funcionan como se esperaba.
function query($query, $bindings, $type)
Deseo poder ejecutar consultas sobre la marcha con esta única función, este tipo de función es mucho más fácil con el controlador PDO ya que simplemente puede ingresar el enlace dentro ->execute($binding);
sin embargo, en este caso, estoy obligado a utilizar MySQLi ya que la aplicación actualmente depende de él pero desea actualizarlo para usar declaraciones preparadas.
Un ejemplo de cómo necesito poder usar la función para garantizar que sea reutilizable y flexible:
$engine->query("SELECT * FROM accounts WHERE email = :mail AND id = :id",array('':mail'' => $_POST[''mail''], '':id'' => 2))->fetch_assoc();
Vamos a dividir cada uno de ellos. Primero está el enunciado, luego el conjunto que se utiliza para vincular los parámetros utilizados, luego los tipos de los parámetros, y finalmente el tipo de fetch_ a utilizar en la consulta (ASSOC, OBJECT, ARRAY), etc.
"SELECT * FROM accounts WHERE email = :mail AND id = :id", array('':mail'' => $_POST[''mail''], '':id'' => 2), "si" ->fetch_assoc();
aunque implementar parámetros nombrados sería toda una tarea, el resto es bastante factible.
Una variante PHP> = 5.6, implementando el operador splat:
function query($query, $params = NULL, $types = NULL)
{
if (!$params)
{
return $mysqli->query($query);
}
$statement = $this->mysqli->prepare($select);
$types = $types ?: str_repeat(''s'', count($params));
$statement->bind_param($types, ...$params);
$statement->execute();
return $statement->get_result();
}
usado así
$sql = "SELECT * FROM accounts WHERE email = ? AND id = ?";
$row = $engine->query($sql, [$_POST[''mail''], 2])->fetch_assoc();
o, si desea establecer tipos explícitamente
$row = $engine->query($sql, [$_POST[''mail''], 2], "si")->fetch_assoc();