php - texto - string strip_tags
Una declaración preparada, `WHERE.. IN(..)` consulta y clasificación-con MySQL (7)
Imagina que tenemos una consulta:
SELECT * FROM somewhere WHERE `id` IN(1,5,18,25) ORDER BY `name`;
y una matriz de ID para obtener: $ids = array(1,5,18,25)
Con las declaraciones preparadas se adviced preparar una declaración y llamarla varias veces:
$stmt = $mysqli->prepare(''SELECT * FROM somewhere WHERE `id`=?;'');
foreach ($ids as $id){
$stmt->bind_params(''i'', $id);
$stmt->exec();
}
Pero ahora tendré que ordenar los resultados manualmente. ¿Tengo alguna buena alternativa?
¿Ha considerado volver a escribir su consulta original utilizando una cláusula JOIN y WHERE para obtener el IDS que necesita para evitar la necesidad de una cláusula WHERE IN? Vine aquí con la misma pregunta y después de revisar las posibles soluciones, me di cuenta de que mi solución era INNER JOIN.
Creo que esta es la respuesta más simple posible:
$ids = [1,2,3,4,5];
$pdos = $pdo->prepare("SELECT * FROM somwhere WHERE id IN (:"
. implode('',:'', array_keys($ids)) . ") ORDER BY id");
foreach ($ids as $k => $id) {
$pdos->bindValue(":". $k, $id);
}
$pdos->execute();
$results = $pdos->fetchAll();
Mientras su matriz de Ids no contenga claves o claves con caracteres ilegales, funcionará.
En última instancia, agregaré una solución lenta y fea que, sin embargo, utiliza declaraciones preparadas para CUALQUIER número de elementos del arreglo :) 3 las declaraciones son universales para cualquier caso y se pueden reutilizar en cualquier lugar.
-
CREATE TEMPORARY TABLE
IDCREATE TEMPORARY TABLE
(
IDINT );
-
INSERT INTO
VALUES(?);
esto insertará sus identificaciones -
SELECT
IDFROM
IDsLEFT JOIN .... ;
Usa datos de otras tablas para ordenar la lista deids
-
SELECT
IDFROM
IDs;
selecciona todo de nuevo
De lo contrario, tendrá que usar IN (?,?,?,....
o ordenar las filas manualmente. La mejor idea es usar consultas de MySQL simples o, tratar de obtener la lista de ID ya ordenada de la forma te gusta.
No, no es recomendable, si va a recuperar ciertos registros de la base de datos utilizando la cláusula ORDER BY
.
Podrías hacerlo de esta manera:
$ids = array(1,5,18,25);
// creates a string containing ?,?,?
$clause = implode('','', array_fill(0, count($ids), ''?''));
$stmt = $mysqli->prepare(''SELECT * FROM somewhere WHERE `id` IN ('' . $clause . '') ORDER BY `name`;'');
call_user_func_array(array($stmt, ''bind_param''), $ids);
$stmt->execute();
// loop through results
Usando esto, estás llamando a bind_param para cada ID y has hecho la clasificación por mysql.
Tuvo el mismo problema y, además de la respuesta de @sled hace 7 años, aquí hay una posibilidad sin hacer call_user_func_array(array($stmt, ''bind_param''), $ids);
paso, pero solo llamar a bind_params una vez:
$ids = array(1,5,18,25);
// creates a string containing ?,?,?
$bindClause = implode('','', array_fill(0, count($ids), ''?''));
//create a string for the bind param just containing the right amount of iii
$bindString = str_repeat(''i'', count($ids));
$stmt = $mysqli->prepare(''SELECT * FROM somewhere WHERE `id` IN ('' . $bindClause . '') ORDER BY `name`;'');
$stmt->bind_params($bindString, ...$ids);
$stmt->execute();
Una alternativa sería usar la función de comando PHP en el objeto de resultado, pero esto es "manual".
Vea esto: Ordenar Objeto en PHP