Eliminare i record multipla usando Caselle di controllo
-
26-09-2019 - |
Domanda
Sto cercando di capire come posso eliminare più record utilizzando le caselle di controllo. Ho una tabella sulla mia pagina che riceve i dati dal database. La prima colonna per ogni riga ha una casella di controllo che appare come il seguente:
<input type="checkbox" name="checked[]" value='.$row['UserId'].' class="checkbox" />
I miei sguardi codice come il seguente:
<?php
// get required includes
require_once(ROOT_PATH.'connections/mysql.php');
require_once(ROOT_PATH.'admin/controls/users_az/error_messages.php');
// declare variables
$msg = '';
// ------------------------------------------------------------------
// DELETE SELECTED USERS
// ------------------------------------------------------------------
if(isset($_POST['btnDeleteSelected']) && isset($_POST['checked']))
{
$checked = array_map(mysqli_real_escape_string($conn, $_POST['checked']));
$list = "'" . implode("','", $checked) . "'";
$delete_selected = mysqli_query($conn, "DELETE FROM users WHERE UserId IN ($list)")
or die($dataaccess_error);
if($delete_selected)
{
$msg = mysqli_affected_rows($delete_selected).' '.$msg_success;
}
}
elseif(isset($_POST['btnDeleteSelected']) && !isset($_POST['checked']))
{
$msg = $msg_error;
}
?>
Problema: Naturalmente questo non funziona. Questa è la prima volta che sto cercando di fare questo.
Domanda: Sono sulla strada giusta con questo? Come ho bisogno di modificare questo per farlo funzionare?
Soluzione
Questo produrrà un errore:
$checked = array_map(mysqli_real_escape_string($conn, $_POST['checked']));
Poiché array_map
vuole un callback come prima, e una matrice come secondo argomento. Il resto della configurazione è piuttosto buona, ma come mysqli_real_escape_string
bisogno di una connessione, array_map o array_walk non sono così convenienti, si potrebbe provare un normale ciclo foreach
. In alternativa, se i di id sono sempre interi:
$checked = array_map('intval',$_POST['checked']);
... e rilasciare le virgolette attorno ai valori del conto implode (provate a alimentazione interi MySQL per le colonne integer, stringhe per altre (car / data / blob / text) colonne).
Altri suggerimenti
di controllo Solo che ogni elemento dell'array è un numero intero (con ctype_digit ()), per esempio, e quindi è possibile utilizzare implodere senza virgolette, in questo modo:
$list = implode(", ", $checked);
Con PHP> = 5.3 è possibile utilizzare una funzione anonima:
$checked = array_map(function($s) use ($conn) { return mysqli_real_escape_string($conn, $s); }, $_POST['checked']);
In caso contrario si potrebbe o callback per una funzione definita dall'utente:
$checked = array_map('myescape', $_POST['checked']);
function myescape($s)
{
global $conn;
return mysqli_real_escape_string($conn, $s);
}
o semplicemente ciclo manualmente.