Pregunta

Estoy tratando de averiguar cómo puedo eliminar varios registros utilizando casillas de verificación. Tengo una tabla en mi página que obtiene los datos de la base de datos. La primera columna de cada fila tiene una casilla de verificación que se parece a lo siguiente:

<input type="checkbox" name="checked[]" value='.$row['UserId'].' class="checkbox" />

Mi código tiene el siguiente aspecto:

<?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 esto no funciona. Esta es la primera vez que estoy tratando de hacer esto.

Pregunta: ¿Estoy en el camino correcto con esto? ¿Cómo tengo que modificar esto para que funcione?

¿Fue útil?

Solución

Esto producirá un error:

$checked = array_map(mysqli_real_escape_string($conn, $_POST['checked']));

Debido array_map quiere una devolución de llamada como el primero, y una matriz como el segundo argumento. El resto de la configuración es bastante bueno, pero como mysqli_real_escape_string necesita una conexión, o array_map array_walk no son tan convenientes, puede probar con un bucle foreach normal. Alternativamente, si los identificadores son siempre números enteros:

$checked = array_map('intval',$_POST['checked']);

... y soltar las comillas alrededor de los valores de la cuenta de implosión (trate de números enteros MySQL alimentación para las columnas de números enteros, cadenas para otros (char / fecha / burbuja / texto) columnas).

Otros consejos

Sólo cheque que cada elemento de la matriz es un número entero (con ctype_digit ()), por ejemplo, y luego se puede utilizar implosión sin comillas, así:

$list = implode(", ", $checked);

Con PHP> = 5.3 se puede utilizar una función anónima:

$checked = array_map(function($s) use ($conn) { return mysqli_real_escape_string($conn, $s); }, $_POST['checked']);

De lo contrario, podría o bien devolver la llamada a una función definida por el usuario:

$checked = array_map('myescape', $_POST['checked']);
function myescape($s)
{
    global $conn;
    return mysqli_real_escape_string($conn, $s);
}

o simplemente bucle de forma manual.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top