form con checkbox

miagy

Utente Attivo
2 Nov 2014
69
0
6
Ciao a tutti.
Ho ereditato un codice al fine di studiare il funzionamento di MySqli da autodidatta e sono incappato in un dubbio.
Ho questa pagina che, mettendomi in elenco tutti gli elementi da cancellare secondo un determinato criterio, mi permette di selezionare tutti quelli che voglio e cancellarli. All'interno dello stesso codice, sopra a tutto, ho un isset post che, attivato, cancella i file selezionati (e che è corretto).

Il mio dilemma è: la pagina sichiama cancella_users.php


Detto questo, in
HTML:
<form action='??????' method='POST'>
devo rimettere la stessa pagina? :')


PHP:
<?php
  
$connect=mysqli_connect("bla bla bla"); /* DATI DB */
if(mysqli_connect_errno()){
echo "Error".mysqli_connect_error();
}

/* CANCELLO FILE SELEZIONATI */

if (isset($_POST['delete'])){
    $checkbox = $_POST['checkbox'];
    $count = count($checkbox);

    for($i=0;$i<$count;$i++){

        if(!empty($checkbox[$i])){ /* CHECK SE CHECKBOX SONO FLAGGATI */
        echo "cancellato $nickname";
        #$nickname= mysqli_real_escape_string($connect,$checkbox[$i]); /* ESCAPE INUTILE */
        mysqli_query($connect,"DELETE FROM users WHERE nickname = '$nickname'"); /* CANCELLO*/

        }

    }

}

$query = "SELECT * FROM users WHERE DATE_ADD(login, INTERVAL 180 DAY) <= NOW() ORDER BY nickname";
$result = mysqli_query($connect,$query);

echo "<form action='??????' method='POST'>"; /* SUBMIT */

echo "<table>";
echo "<tr><td>Name</td></tr>";
while ($row = mysqli_fetch_array($result)){
  
    echo "<tr><td><input type='checkbox' name='checkbox[]' value='$nickname'></td>";
    echo "<td>" . $row['nickname'] . "</td></tr>";
}
mysqli_free_result($result);
echo "</table>";
?>

<tr>
<td colspan="5" align="center"><input name="delete" type="SUBMIT" id="delete" value="delete" action="POST"></td>
</tr>
</form>
 
Ultima modifica:

Hormus

Utente Attivo
26 Giu 2020
83
10
8
La funzione isset restituisce true se la variabile è almeno definita e per leggere $_POST['delete'] dovrai indicare per forza cancella_users.php altrimenti i dati inviati con il metodo POST non saranno mai visibili. (tieni presente dovrà essere lo stesso percorso che visualizzi nella barra del tuo browser).
Comunque l'escape non è mai inutile a maggior ragione se lavori con variabili esterne cioè non provenienti dalla tua definizione di variabile.
Comunque sia devi validare il valore di ritorno di mysqli_query e solo se diversa da false puoi considerare che sia stata eseguita.
PHP:
<?php

$connect = mysqli_connect("bla bla bla"); /* DATI DB */
if(mysqli_connect_errno()){
echo "Error ".mysqli_connect_error();
}

/* CANCELLO FILE SELEZIONATI */

if (isset($_POST['delete'])){
    $checkbox = $_POST['checkbox'];
    $count = is_array($checkbox) ? count($checkbox) : false;
    if($count !== false) {

        for($i=0;$i<$count;$i++){

            if(!empty($checkbox[$i])){ /* CHECK SE CHECKBOX SONO FLAGGATI */
            $nickname= mysqli_real_escape_string($connect,$checkbox[$i]); /* ESCAPE INUTILE */
                if(mysqli_query($connect,"DELETE FROM users WHERE nickname = '$nickname'") !== false) {
                echo "cancellato $nickname";
                } /* CANCELLO*/

            }

        }

    }

}


$query = "SELECT * FROM users WHERE DATE_ADD(login, INTERVAL 180 DAY) <= NOW() ORDER BY nickname";
if(($result = mysqli_query($connect,$query)) !== false) {

echo "<form action=\"??????\" method=\"POST\">"; /* SUBMIT */

echo "<table>";
echo "<tr><td>Name</td></tr>";
while ($row = mysqli_fetch_array($result)){

    echo "<tr><td><input type=\"checkbox\" name=\"checkbox[]\" value=\"$row['nickname']\"></td>";
    echo "<td>" . $row['nickname'] . "</td></tr>";
}
mysqli_free_result($result);
echo "</table>".'

<tr>
<td colspan="5" align="center"><input name="delete" type="SUBMIT" id="delete" value="delete"></td>
</tr>
</form>';
}

?>
Adesso il form appare solo se la query è diversa da false controllo che il checkbox è un array altrimenti non faccio nulla imposta la tua url.
 
Ultima modifica:

miagy

Utente Attivo
2 Nov 2014
69
0
6
La funzione isset restituisce true se la variabile è almeno definita e per leggere $_POST['delete'] dovrai indicare per forza cancella_users.php altrimenti i dati inviati con il metodo POST non saranno mai visibili. (tieni presente dovrà essere lo stesso percorso che visualizzi nella barra del tuo browser).
Ti ringrazio della risposta.
Scrivendo questo, il risultato è false:

HTML:
<form action='cancella_users.php' method='POST'>
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
Ho modificato il codice per favore leggi nuovamente il messaggio precedente, cosa intendi per false? Un vero valore Boleano della funzione var_dump? O semplicemente non ti funziona.
Nel secondo caso assicurati http://domain.com/cancella_users.php sia nella web root e non in altra directory.
Abilità temporaneamente error_reporting(-1); in cima al tuo script alla risoluzione dovrai rimuoverlo.
 

miagy

Utente Attivo
2 Nov 2014
69
0
6
Ho modificato il codice per favore leggi nuovamente il messaggio precedente, cosa intendi per false? Un vero valore Boleano della funzione var_dump? O semplicemente non ti funziona.
Nel secondo caso assicurati http://domain.com/cancella_users.php sia nella web root e non in altra directory.
Abilità temporaneamente error_reporting(-1); in cima al tuo script alla risoluzione dovrai rimuoverlo.
Sì, scusami. Ho scritto dal cellulare e non sono stato chiaro.
Non mi riconosce il value nickname.
Anche postando la tua soluzione, il comando DELETE non funge e la echo mostra sola il testo cancellato, dandomi il $nickname vicino vuoto.

Quindi mettendo che io voglia cancellare UTENTE A, correttamente selezionabile nella lista iniziale, lo flaggo, clikko su delete e piuttosto che cancellarmi utente a con il messaggio "cancellato utente a", non me lo cancella e mi stampa "cancellato "
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
Puoi abilitare error_reporting(-1); mi sembra che la variabile $nickname non è mai stata definita e poiché non definita ha il valore null la funzione echo stampa una stringa vuota per $nickname se usi var_dump('cancellato', $nickname): avrai in stampa anche il valore null ma comunque sia error_reporting(-1); dovrebbe già segnalare l'errore di variabile $nickname non definita.
Inizialmente avrai $row['nickname'] se hai dubbi posta il codice e ti aiuto.
 
Ultima modifica:

miagy

Utente Attivo
2 Nov 2014
69
0
6
Puoi abilitare error_reporting(-1); mi sembra che la variabile $nickname non è mai stata definita e poiché non definita ha il valore null la funzione echo stampa una stringa vuota per $nickname se usi var_dump('cancellato', $nickname): avrai in stampa anche il valore null ma comunque sia error_reporting(-1); dovrebbe già segnalare l'errore di variabile $nickname non definita.
Inizialmente avrai $row['nickname'] se hai dubbi posta il codice e ti aiuto.
L'errore riportato è quello che hai sospettato:

Notice: Undefined variable: name in /membri/miagysite/cancella_users.php on line 21

vale a dire:


echo "cancellato $nickname";
Sei gentilissimo :)
Il codice intero è quello che ho postato all'inizio di questo topic :)