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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top