¿Es esta una buena manera de eliminar todas las filas seleccionadas de la tabla SQL?

El código funciona bien, pero tal vez haya otras formas mejores de hacerlo. La función real_ escape_string está en el buen lugar, ¿o debería colocarla en el bucle foreach, antes de la consulta sql?

$('.deleteRows').click(function(e)
{
    e.preventDefault();
    var val = [];
    if(confirm("Biztos, hogy törölni szeretné a kijelölt sorokat?"))
    {
        $(':checkbox:checked').each(function(i){
          val[i] = $(this).val();
        });
        $.ajax({
            data: { val:val },
            type: 'POST',
            url: 'files/delete_all_uzenet.php',
            success: function(data) 
            {
                var result = $.trim(data);
                $('#newsletterResult').html(data);
                $('#newsletterModal').modal('show');
            },
            complete: function()
            {
                setTimeout(function() 
                {
                    location.reload();  
                }, 4000 );  
            }
        });
    }
    return false;
});

Archivo php:

<?php
include_once("../../files/connect.php");
if(isset($_POST['val']))
{
    foreach($_POST['val'] as $v)
    {
        mysqli_query($kapcs, $sql = "DELETE FROM kapcsolatfelvetel WHERE kapcsolat_id = '".mysqli_real_escape_string($kapcs, $v)."'") or die(mysqli_error($kapcs));
    }
    echo 'Rows deleted';
}
else
{
    exit("No rows selected.");
}
?>
0
Takács Zoltán 13 ago. 2016 a las 22:11

2 respuestas

La mejor respuesta

Su código se ejecutará mucho más rápido si combina todas las operaciones en una sola consulta. Una vez que haya verificado que tiene valores para eliminar, haga algo como:

$p = &$_POST['val']; //$p refers to $_POST['val'];

//clean all inputs
foreach($p as &$v) $v = "'". mysqli_escape_string($kapcs,$v) ."'";

//transform to "('value1', 'value2'...)"
$values = '('.implode(',',$p).')';

//build one sql to delete all rows
$sql = "DELETE FROM kapcsolatfelvetel WHERE kapcsolat_id IN $values";

Luego puede ejecutar la consulta para eliminar todas las filas a la vez.

PD: utilizas el escape de cuerdas para limpiar tus cuerdas; eso es mucho mejor que nada, pero no tan bueno como declaraciones preparadas y consultas parametrizadas.

PPS: También debe verificar que su consulta se haya ejecutado correctamente. Es un error suponer que solo porque llamó a mysqli_query, las filas se eliminaron.

2
BeetleJuice 14 ago. 2016 a las 10:24

@Jugo de escarabajo

Entonces, ¿esta es la forma correcta?

    <?php
include_once("../../files/connect.php");
if(isset($_POST['val']))
{
    $p = &$_POST['val'];
    foreach($p as &$v)
    {
        $v = "'". mysqli_escape_string($kapcs, $v) ."'";
    }
    $values = '('.implode(',',$p).')';

    mysqli_query($kapcs, $sql = "DELETE FROM kapcsolatfelvetel WHERE kapcsolat_id IN $values") or die(mysqli_error($kapcs));
    echo 'Rows deleted ok.';
}
else
{
    exit("No rows selected.");
}
?>
0
Takács Zoltán 14 ago. 2016 a las 10:38