[PHP] Passare variabile di sessione con metodo GET

maxus68

Nuovo Utente
1 Nov 2016
15
0
1
51
Ciao a tutti,
sto diventando matto con una cosa che all'apparenza dovrebbe essere semplice ma che per chi come me sta imparando non lo è.

Ho un elenco di clienti (index.php) prelevato da db e ogni riga presenta un pulsante Elimina, alla pressione di tale pulsante mi si apre la pagina elimina.php con i dettali del cliente dell'ID della riga.

Il problema sta nel fatto che quella variabile con il numero dell'ID la devo conservare nella pagina elimina.php per fare ulteriori operazioni, così ho deciso di usare una variabile di sessione.

Il codice della form è il seguente:
PHP:
echo '<td><form action="elimina.php" method="GET"><input type="hidden" name="idnota" value='.$row["IDNota"].'>
        <input type="submit" class="btnmodif" value="ELIMINA"></form></td>';
Nella pagina elimina.php inserisco
PHP:
 @$Id=$_GET['idnota'];
e tutto funziona perfettamente.

Il problema nasce quando creo la variabile di sessione:
PHP:
@$uno = $_GET['idnota'];
 $_SESSION['due'] = $uno;
ma nella pagina elimina.php il semplice echo non restituisce nulla
PHP:
 echo $_SESSION['due'];
Lo stesso codice utilizzandolo nella pagina index.php dove è presente l'elenco mi restituisce regolarmente l'ID del cliente alla pressione del pulsante.

Ho provato in vari modi ma non ne riesco venire a capo.

Spero di essere stato abbastanza chiaro nella spiegazione e ringrazio chiunque mi possa dare una mano.

Massimo
 

zorro

Utente Attivo
20 Ott 2014
218
10
18
ROMA
Ciao Maxus,
prima di usare le sessioni devi sempe anteporre la funzione

PHP:
session_start();
Inoltre ti sconsiglio di usare il simbolo @ in quanto, se non sbaglio (non l'ho mai usato) non ti fa vedere gli eventuali messaggi d'errore . Ciao


Zorro
 

maxus68

Nuovo Utente
1 Nov 2016
15
0
1
51
Ciao Zorro,
la sessione vien avviata correttamanete in tutte e due le pagine.
Adesso però sembra funzionare:
PHP:
// nella index.php
echo '<td><form action="elimina.php" method="GET"><input type="hidden" name="idnota" value='.$row["IDNota"].'>
          <input type="submit" class="btnmodif" value="ELIMINA"></form></td>';  

//nella elimina.php
$Id = $_GET['idnota'];
$_SESSION['due'] = $Id ;
Il problema però è che il seguente codice non funziona nel senso che non cancella il record come se IDNota fosse null, e tra l'altro non restituisce errori (nome tabella e campo sono corretti!)
PHP:
if (isset($_POST['btnsi'])){
$query = "DELETE FROM tbl_note WHERE IDNota='" . $_SESSION['due'] . "';";
mysqli_query($conn,$query);
                
echo "Nota correttamente eliminata!";
            }
 

zorro

Utente Attivo
20 Ott 2014
218
10
18
ROMA
eventualmente puoi, prima della query, verilficare, tramite una echo, i vaori di btnsi, di due e di IDNota per verificare i dati passati e se effettivamente ti passa qualcosa
 

maxus68

Nuovo Utente
1 Nov 2016
15
0
1
51
Se metto l'ECHO prima della IF il valore di due mi appare, mentre se lo metto subito dopo sparisce
 

marino51

Utente Attivo
28 Feb 2013
2.600
132
63
Lombardia
Se metto l'ECHO prima della IF il valore di due mi appare, mentre se lo metto subito dopo sparisce
nel tuo codice é presente $_POST['btnsi'], probabilmente non é stata valorizzata

hai usato GET potrebbe essere POST sbagliato

se pubblichi elimina.php, si può capire meglio la sequenza delle operazioni,

a me sembra che,
1 produci una lista di oggetti passibili di cancellazione,
2 alla scelta del bottone "cancella", visualizzi le informazioni complete dell'oggetto
3 alla conferma con il bottone "btnsi" viene eseguita la cancellazione fisica

il 2 e 3 step sono gestiti dallo stesso script elimina.php

se ciò é vero controlla il passaggio delle variabili tra un'operazione e l'altra
 

maxus68

Nuovo Utente
1 Nov 2016
15
0
1
51
Ciao Marino,
con lo script che vedi sotto (elimina.php) sono riuscito a fare quello che volevo e cioè premendo il pulsante SI o NO mi elimina o meno il record.

Però secondo me non è la soluzione più corretta, intendo dire che vorrei capire il motivo per cui la variabile di sessione $_SESSION['idok'] si svuota nel momento in cui entra nella IF


PHP:
// pagina index.php

<?php
    session_start();
 ?>
.....
echo '<td><form action="elimina.php" method="GET"><input type="hidden" name="idnota" value='.$row["IDNota"].'>
          <input type="submit" class="btnmodif" value="ELIMINA"></form></td>';       



// pagina elimina.php
<?php
    session_start();
    ?>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <title>Untitled</title>
        <link rel="stylesheet"  type="text/css" href="../zappellini/css/noteelimina.css"/>  

</head>

<body>

<?php
        @$Id = $_GET['idnota'];
        $_SESSION['idok'] = $Id ;      

//stabilire la connessione      
        $conn = mysqli_connect("localhost","root","");
       
        if ($conn->connect_errno) {
        echo "Connessione fallita: ". $conn->connect_error . ".";
        exit();
        }
       
//selezionare il db
        mysqli_select_db($conn,"my_zappellini");
       
// chiedo conferma
        echo "<div class='domanda'>";
        echo "Stai per cancellare la Nota numero " . $_SESSION['idok'] . " vuoi continuare?";
        echo "</div>";

?>
<form action="elimina.php" method="POST">
<table align=center >
    <td><input type="hidden" name="SI" class="btnSi" value="<?php echo $_SESSION['idok'] ?>"></td>
    <td><input type="submit" name="btnsi" class="btnSi" value="SI"></td>
    <td></td>
    <td><input type="submit" name="btnno" class="btnNo" value="NO"></td>
</table>
</form>

<?php
    if (isset($_POST['btnsi'])){
    $idok = $_POST['SI'];
    //$query = "DELETE FROM tbl_note WHERE IDNota='$idok';";
    //$query = "DELETE FROM tbl_note WHERE IDNota='" . $_SESSION['due'] . "';";
    //mysqli_query($conn,$query);
    echo "<div class='notadelete'>";
    echo "Nota correttamente eliminata!";
    echo "</div>";
    }

    if (isset($_POST['btnno'])){
    echo "Nota NON eliminata";
    exit;
    }
?>
<p align="center" ><a href="index.php">TORNA ALL'ELENCO</a></p>

</body>
</html>
 

marino51

Utente Attivo
28 Feb 2013
2.600
132
63
Lombardia
Però secondo me non è la soluzione più corretta, intendo dire che vorrei capire il motivo per cui la variabile di sessione $_SESSION['idok'] si svuota nel momento in cui entra nella IF
perché chiami 2 volte lo script elimina,
la prima volta passando parametri in GET
la seconda volta in POST
in maniera abbastanza confusa,

come ti ho scritto stai facendo 3 "operazioni" con 2 script
andrebbe riscritto tutto, ma volendo mantenere il tuo modo di operare,
suddivido il tuo codice in 3 script e lascio a te la sistemazione complessiva

index.php
PHP:
// pagina index.php

<?php
    session_start();
 ?>
.....
echo '<td>
          <form action="conferma.php" method="GET">
              <input type="hidden" name="idnota" value='.$row["IDNota"].'>
              <input type="submit" class="btnmodif" value="ELIMINA">
          </form>
      </td>';
conferma.php
PHP:
// pagina conferma.php
<?php
    session_start();

    $Id = $_GET['idnota'];
    $_SESSION['idok'] = $Id ;    
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <title>Untitled</title>
        <link rel="stylesheet"  type="text/css" href="../zappellini/css/noteelimina.css"/>
</head>
<body>
<?php
// chiedo conferma
        echo "<div class='domanda'>";
        echo "Stai per cancellare la Nota numero " . $_SESSION['idok'] . " vuoi continuare?";
        echo "</div>";
?>
<form action="elimina.php" method="POST">
<table align=center >
    <td><input type="hidden" name="SI" class="btnSi" value="<?php echo $_SESSION['idok'] ?>"></td>
    <td><input type="submit" name="btnsi" class="btnSi" value="SI"></td>
    <td></td>
    <td><input type="submit" name="btnno" class="btnNo" value="NO"></td>
</table>
</form>
</body>
</html>
elimina.php
PHP:
// pagina elimina.php
<?php
    session_start();

//stabilire la connessione    
        $conn = mysqli_connect("localhost","root","");
     
        if ($conn->connect_errno) {
        echo "Connessione fallita: ". $conn->connect_error . ".";
        exit();
        }
     
//selezionare il db
        mysqli_select_db($conn,"my_zappellini");

    if (isset($_POST['btnsi'])){
    $idok = $_POST['SI'];
    //$query = "DELETE FROM tbl_note WHERE IDNota='$idok';";
    //$query = "DELETE FROM tbl_note WHERE IDNota='" . $_SESSION['due'] . "';";
    //mysqli_query($conn,$query);
    echo "<div class='notadelete'>";
    echo "Nota correttamente eliminata!";
    echo "</div>";
    }

    if (isset($_POST['btnno'])){
    echo "Nota NON eliminata";
    exit;
    }
?>
<p align="center" ><a href="index.php">TORNA ALL'ELENCO</a></p>
in questo modo puoi evitare l'uso di session, perché passi i parametri tra uno scrip e l'altro in sequenza

se hai ancora problemi fatti vivo
 
Ultima modifica:

maxus68

Nuovo Utente
1 Nov 2016
15
0
1
51
Grazie Marino.
Anche io avevo pensato ad una cosa del genere ma mi sembrava quanto meno curioso dover fare un passaggio intermedio (conferma.php) mentre mi pare di capire che sia necessario.

Io ho programmato per anni con la programmazione ad oggetti e oggettivamente mi trovo in difficoltà con il PHP tenuto conto anche che non lo faccio di professione ma solo per passione
 

marino51

Utente Attivo
28 Feb 2013
2.600
132
63
Lombardia
considera che server e client sono due entità che "non si conoscono",
il client invia una richiesta, il server risponde e tutto finisce
il server NON tiene aperto un "eseguibile" per quel client

il server non ha più nessun valore di quel client, dopo aver inviato la risposta, salvo sessioni (sul server) e cookies (sul client)

ogni volta che viene eseguito un "submit" il server risponde e ha finito il suo compito, tutte le variabili php sono perse

d'altra parte php é un "editor" per comporre pagine dinamiche (denigrandolo un po')

ripeto, é necessario capire che il server risponde, componendo la pagina di risposta ed ha finito il lavoro

poi i 3 passi,
lista con scelta dell'elemento (submit)
conferma (submit)
eliminazione
possono essere gestiti con 3 script o anche con 1 solo,
ma deve essere chiaro che quell'uno, viene chiamato 3 volte e deve gestire la situazione
 
Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
2.600
132
63
Lombardia
aggiungendo uno specifico codice javascript alla "pagina" di risposta con la lista, si possono ottenere benefici,
per esempio la conferma potrebbe essere demandata al client (non al server come nell'originale)
risparmiando una richiesta al server e relativa risposta

richiesta al server e risposta con la lista per la scelta dell'elemento

submit intercettato da javascript che gestisce la conferma

richiesta al server per eliminazione dell'elemento, risposta con una nuova lista
o ritorno alla lista (già attiva, senza richiesta al server) se possibile, in caso di non conferma
 
Ultima modifica: