[PHP] Mantenere selezionato il valore scelto dopo submit

samurai.sette

Utente Attivo
17 Dic 2015
228
6
18
Ciao a tutti. Vi chiedo un consiglio su come procedere.
Il mio problema è questo: nel form ho un drop-down box contenente dei dati e un bottone. Ogni volta che clicco sul bottone il drop-down box non mantiene selezionato il valore scelto ma torna a visualizzare il primo della lista.
Che voi sappiate, c'è un modo per risolvere questo?
Ciao, grazie.
 

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
26
Ciao. Innanzitutto il codice è fondamentale per inquadrare la situazione.
Così posso solo andare a tentativi.

Il comportamento comunque è lecito poiché quando clicchi su submit la pagina viene ricaricata (se il tuo form non rimanda a un'altra pagina).

Per mantenere selezionata la scelta devi per forza salvare da qualche parte i dati ricevuti. Variabili di sessione (validi fino a chiusura del browser, a meno di scadenze), cookie o tabella.

In questa discussione trovi un caso analogo (radio al posto di select) in cui i dati vengono scritti in tabella e successivamente letti per visualizzare la scelta, preselezionando un radio button.
 
Ultima modifica:

samurai.sette

Utente Attivo
17 Dic 2015
228
6
18
Ciao AdeKnite. Grazie per la risposta e scusa se non ho messo il codice.
Prima di inserire il codice te lo spiego brevissimamente.
1) ho selezionato tutto dalla tabella e ho calcolato il numero totale delle righe;
2) ho diviso il numero totale delle righe per 30;
3) con un ciclo "for" ho inserito il risultato nel drop-down box. Quindi se ad esempio nella tabella ci sono 90 righe, nel drop-down box comparirà 1,2,3.
Ora ti inserisco il codice che ho scritto.
PHP:
    <select name="pagina" style="width: 50px;">

    <?php

    // faccio la connessione al server e al database
    $con = mysql_connect ("localhost", "root","") or die ("Connessione non disponibile".mysql_error());
    $db = mysql_select_db ("database", $con) or die ("Connessione con il database non disponibile".mysql_error());

    // calcolo numero totale record
    $record_totali = mysql_query("SELECT * FROM tabella");
    $N = mysql_num_rows ($record_totali);
   
    // calcolo numero pagine (ogni pagina visualizza 30 record)
    $P=ceil($N/30);
       
    for ($i=1; $i<=$P; $i++)
    {
      echo '<option>' .$i.'</option>';          
    }

    $con = mysql_close();
   
    ?>

    </select>
La soluzione della tabella la vorrei evitare perchè ne sto già usando diverse. Credo che nel mio caso la soluzione migliore sia quella delle variabili di sessione.
Ma vorrei farti una domanda. Dopo che imposto la sessione, come faccio da codice a richiamare la drop-down box già presente nel form per poi sfruttare la sessione?
Ciao, grazie.
 
Ultima modifica di un moderatore:

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
intanto mi sembra che le tue option trasmettano tutte un valore vuoto
PHP:
echo "<option value=\"".$i."\">$i</option>";
poi potresti come ha detto adekinte usare le sessioni.
nella pagina dove ricevi i $_POST potresti
PHP:
<?php
session_start();
//....
$i=$_POST['pagina'];
$_SESSION[$i]=$i;
//....
?>
e nella pagina in cui hai la select
PHP:
<?php
session_start();
//......
$sel="";
for ($i=1; $i<=$P; $i++){
    if(isset($_SESSION[$i])){$sel="selected";}
    echo "<option value=\"".$i."\" $sel>$i</option>";         
}
//...
?>
è evidente che se la select e dovi leggi il $_POST è una pagina unica avra un solo session_start

dimenticavo:
usa mysqli
 

samurai.sette

Utente Attivo
17 Dic 2015
228
6
18
Ciao a tutti.
Per Borgo Italia.
Ho provato il tuo codice ma mi funziona in una maniera un po strana. Quando scelgo un qualsiasi valore dal drop-down box e clicco su submit mi va sempre sull'ultimo valore della lista. In più compare questo errore:"Notice: Unknown: Skipping numeric key 3 in Unknown on line 0".
Questo è il codice che ho scritto:
Codice:
<?php
session_start();
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Untitled 1</title>

</head>

<body>

<form method="post">
    <select name="pagina" style="width: 100px">
    
    <?php
    
      $host = "localhost";
      $user = "root";
      $pass = "";
      $db = "database";
      
      // connessione al server ed al database
      $connessione = new mysqli($host, $user, $password, $db);
      if ($connessione->connect_errno)
      {
        echo "Connessione fallita: ". $connessione->connect_error . ".";
        exit();
      }
      
      $query = "SELECT * FROM tabella ORDER by id DESC";
      $result = @mysqli_query($connessione, $query);
      
          $N = @mysqli_num_rows ($result);
          
        // calcolo numero pagine (ogni pagina visualizza 30 record)
          $P=ceil($N/3);
          
          $i = $_POST['pagina'];
          $_SESSION[$i] = $i;
          
          $sel = "";
          
          for ($i=1; $i<=$P; $i++)
          {
            if(isset($_SESSION[$i])){$sel="selected";}
            echo "<option value=\"".$i."\" $sel>$i</option>";
          }

    ?>
    
    </select>
<br />
<br />
    <input name="submit" type="submit" value="submit" />
</form>

</body>

</html>
Secondo voi dove sbaglio?
Ciao, grazie.
 

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
26
Prova a cambiare la condizione in questo modo.
PHP:
if(isset($_SESSION['selezione'])){
  if($_SESSION['selezione'] == $i) {
    echo "<option value=\"".$i."\" selected>".$i."</option>";
  } else {
    echo "<option value=\"".$i."\">".$i."</option>";
  }
}

In più compare questo errore:"Notice: Unknown: Skipping numeric key 3 in Unknown on line 0".
Cambia il valore che memorizzi nella sessione in questo modo.
PHP:
$_SESSION['selezione']=$i;
Non sono in grado di testare al momento, per cui fammi sapere se funziona. ;)
____________________


UPDATE: ho modificato il codice.
 
Ultima modifica:

samurai.sette

Utente Attivo
17 Dic 2015
228
6
18
Ciao ragazzi.
Per AdeKnite.
Ho provato il primo codice che hai postato e funziona perfettamente solo che continua a generare questo errore: Notice: Unknown: Skipping numeric key 5 in Unknown on line 0
Questo è il codice che ho scritto.
Codice:
<?php
session_start();
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Untitled 1</title>

</head>

<body>

<form method="post">
    <select name="pagina" style="width: 100px">
    
    <?php
    
      $host = "localhost";
      $user = "root";
      $pass = "";
      $db = "database";
      
      // connessione al server ed al database
      $connessione = new mysqli($host, $user, $password, $db);
      if ($connessione->connect_errno)
      {
        echo "Connessione fallita: ". $connessione->connect_error . ".";
        exit();
      }
      
      $query = "SELECT * FROM tabella ORDER by id DESC";
      $result = @mysqli_query($connessione, $query);
      
          $N = @mysqli_num_rows ($result);
          
        // calcolo numero pagine (ogni pagina visualizza 30 record)
          $P=ceil($N/3);
          
          $i = $_POST['pagina'];
          $_SESSION[$i] = strval ($i);
          
          $sel = "";
          
          for ($i=1; $i<=$P; $i++)
          {
          
            if(isset($_SESSION[$i])){$sel="selected";}
            {
              if ($_SESSION[$i] == $i)
              {
                echo "<option value=\"".$i."\" selected>$i</option>";
              }
              else
              {
                echo "<option value=\"".$i."\">$i</option>";
              }
            }

          }

    ?>
    
    </select>
<br />
<br />
    <input name="submit" type="submit" value="submit" />
</form>

</body>

</html>
Secondo te da cosa può dipendere?
Un'altra domandina (scusa se ti riempio di domande, ma anche a Borgo Italia): nel secondo codice che hai postato che cos'è "selezione"?
Ciao, grazie mille.
 

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
26
Prova a sostituire TUTTA la condizione con quella che ti ho postato (quello che hai scritto tu corrisponde alla vecchia versione), cambiando PURE la dichiarazione della variabile di sessione.
Vedrai che il notice sparisce. ;)
(Compare perché tu dichiari all'interno del vettore $_SESSION una variabile sottoforma di numero. E in PHP ciò non è permesso. 'Selezione' è il nome che ho dato alla variabile di sessione al posto di $i).
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
@AdeKnite
scusa se ti contraddico
PHP:
<?php
session_start();
for($i=0; $i < 10 ; $i++){
    if($i==5){$_SESSION[$i]=$i;}
}
var_dump($_SESSION);
?>
output
array(1) { [5]=> int(5) }
ancora meglio
PHP:
<?php
session_start();
for($i=0; $i < 10 ; $i++){
   if($i==5){$_SESSION[$i]=$i;}
}
var_dump($_SESSION);
for($i=0; $i < 10 ; $i++){
   if(isset($_SESSION[$i])){
       echo "<br> la sessione con indice $i esiste coin valore ".$_SESSION[$i];
   }
}
?>
uot
array(1) { [5]=> int(5) }
la sessione con indice 5 esiste coin valore 5
 
Ultima modifica:

samurai.sette

Utente Attivo
17 Dic 2015
228
6
18
Ciao a tutti
@AdeKnite
Ho provato la tua nuova versione ma questa non mi funziona. Questo è il codice che ho scritto
Codice:
<?php
session_start();
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Untitled 1</title>

</head>

<body>

<form method="post">
    <select name="pagina" style="width: 100px">
    
    <?php
    
      $host = "localhost";
      $user = "root";
      $pass = "";
      $db = "database";
      
      // connessione al server ed al database
      $connessione = new mysqli($host, $user, $password, $db);
      if ($connessione->connect_errno)
      {
        echo "Connessione fallita: ". $connessione->connect_error . ".";
        exit();
      }
      
      $query = "SELECT * FROM tabella ORDER by id DESC";
      $result = @mysqli_query($connessione, $query);
      
          $N = @mysqli_num_rows ($result);
          
        // calcolo numero pagine (ogni pagina visualizza 30 record)
          $P=ceil($N/3);
          
          $i = $_POST['pagina'];
          $_SESSION['selezione'] = $i;
          
          $sel = "";
          
          for ($i=1; $i<=$P; $i++)
          {
          
            if(isset($_SESSION['selezione']))
            {
              if ($_SESSION['selezione'] == $i)
              {
                echo "<option value=\"".$i."\" selected>".$i."</option>";
              }
              else
              {
                echo "<option value=\"".$i."\">".$i."</option>";
              }
            }

          }

    ?>
    
    </select>
<br />
<br />
    <input name="submit" type="submit" value="submit" />
</form>

</body>

</html>
Ho letto il post di Borgo Italia ma non ho ben capito il suo significato. :( Quindi secondo voi come dovrei muovermi? Dovrei tornare alla vecchia soluzione?
Ciao, grazie mille
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
intanto non mescolare la programmazione ad oggetti con la procedurale, poi cosa hai alla riga 0?
correggi così
PHP:
<?php
session_start();
?>
<!DOCTYPE html">
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Untitled 1</title>
</head>
<body>
<?php
$host = "localhost";
$user = "root";
$pass = "";
$db = "database";
$connessione = mysqli_connect($host,$username,$password,$db) or die (mysql_error());
if(!$connessione){
    echo "Connessione fallita: ". mysql_error();
       exit();
      }
$query = "SELECT * FROM tabella ORDER by id DESC";
$result = mysqli_query($connessione, $query);//NON usare il silent @, gli errori vanno corretti non nascosti
$N = mysqli_num_rows ($result); 
$P=ceil($N/3);   
?>
<form method="post">
    <select name="pagina" style="width: 100px">
<?php
    if(isset($_POST['pagina']){
        $i = $_POST['pagina'];
        $_SESSION[$i] = (int)$i;
    }
    $sel = "";
    for ($i=1; $i<=$P; $i++){
        if(isset($_SESSION[$i])){$sel="selected";}
        echo "<option value=\"".$i."\" selected>$i</option>";
    }
    ?>
    </select><br /><br />
    <input name="submit" type="submit" value="submit" />
</form>
</body>
</html>
poi detto tra noi non capisco a cosa ti serva, quando hai selzionato e dato il sub cosa deve accadere?

p.s.
quando posti del codice usa gli appositi bccode in quello che hai postato dovresti usare quelli di php
 

samurai.sette

Utente Attivo
17 Dic 2015
228
6
18
Ciao a tutti. Innanzitutto scusatemi se nei post precedenti ho commesso degli errori. Cercherò di stare più attento.
@borgo italia
Ho testato il tuo codice ma con questo siamo nella stessa situazione iniziale. Mi spiego: dopo aver scelto un qualsiasi elemento e cliccato submit, mi visualizza soltanto l'ultimo elemento della lista e compare sempre l'errore "Notice: Unknown: Skipping numeric key 1 in Unknown on line 0".
Per quanto riguarda la riga 0 questo è tutto il codice che ho scritto:
PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Untitled 1</title>

</head>

<body>

<form method="post">
    <select name="pagina" style="width: 100px">
    
    <?php
    
      session_start();
    
      $host = "localhost";
      $user = "root";
      $pass = "";
      $db = "database";
      
      // connessione al server ed al database
      $connessione = new mysqli($host, $user, $password, $db);
      if ($connessione->connect_errno)
      {
        echo "Connessione fallita: ". $connessione->connect_error . ".";
        exit();
      }
      
      $query = "SELECT * FROM tabella ORDER by id DESC";
      $result = mysqli_query($connessione, $query);
      
      $N = mysqli_num_rows ($result);
      // calcolo numero pagine
      $P=ceil($N/3);
      
      if (isset ($_POST['pagina']))
      {
        $i = $_POST['pagina'];
        $_SESSION[$i] = (int)$i;
      }
      
      $sel = "";
      
      for ($i=1; $i<=$P; $i++)
      {
        if (isset ($_SESSION[$i])){$sel="selected";}
        echo "<option value=\"".$i."\" selected>$i</option>";
      }
      
    ?>
    
    </select>
<br />
<br />
    <input name="submit" type="submit" value="submit" />
</form>

</body>

</html>
Venendo alla tua domanda (detto tra noi non capisco a cosa ti serva...) ti rispondo subito.
Quando un utente si connette alla mia pagina può visualizzare un grafico Google Chart (Line Chart per la precisione). Per potersi costruire il grafico l'utente effettua delle selezioni (sono 10 scelte!!!). Quello che vorrei fare è riuscire a conservare all'interno dei drop-down box la scelta effettuata in modo da non far riselezionare il tutto per un nuovo grafico altrimenti diventerebbe alquanto noioso.
Ciao, grazie mille.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
intanto una cosa la session_start(); deve andare alla prima riga subito dopo il tag <?php e tavanti al tag php non deve esserci nemmeno uno spazio (o riga vuota)
ribadisco non mescolare a oggetti
$connessione = new mysqli($host, $user, $password, $db);
e procedurale
$result = mysqli_query($connessione, $query);
o usi un metodo o l'altro
poi d'accordo devi costruire ub grafico, ma nella stessa pagina o in un'altra?
e poi cosa trasmetti, un numero che va da 1 a $P e che legame ha col db?
 

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
26
Questo a me funziona
PHP:
 <?php
session_start();
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Untitled 1</title>

</head>

<body>

<form method="post">
    <select name="pagina" style="width: 100px">
    
    <?php
    
      $host = "localhost";
      $user = "root";
      $pass = "";
      $db = "database";
      
      //connessione al server ed al database
      $connessione = new mysqli($host, $user, $password, $db);

      if ($connessione->connect_errno)
      {
        echo "Connessione fallita: ". $connessione->connect_error . ".";
        exit();
      }
      
      $query = "SELECT * FROM tabella ORDER by id DESC";
      $result = @mysqli_query($connessione, $query);
      
      $N = @mysqli_num_rows ($result);
          
     // calcolo numero pagine (ogni pagina visualizza 30 record)
      $P=ceil($N/3);
      // $_POST['pagina'] =10;
      $i = $_POST['pagina'];
      $_SESSION['selezione']=$i;

      for ($i=1; $i<=$P; $i++) {
        if(isset($_SESSION['selezione'])){
          if($_SESSION['selezione'] == $i) {
            echo "<option value=\"".$i."\" selected>".$i."</option>";
          } else {
            echo "<option value=\"".$i."\">".$i."</option>";
          }
        }
      }

    ?>
    
    </select>
<br />
<br />
    <input name="submit" type="submit" value="submit" />
</form>

</body>

</html>
@borgo italia
Il problema credo risieda nel fatto che le regole per la sintassi dei nomi delle variabili di sessione coincida con le regole della sintassi di qualunque altra variabile (regole per la quale i nomi di variabile debbano iniziare con una lettera o un underscore), indipendentemente dal fatto che $_SESSION sia un array. E questo è anche il motivo del Notice che viene fuori.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
cio
$_SESSION è un array superglobale ed essendo un arry puo essere vettore [0]..[99] o associativo ['pinco'], ['pallo'] come qualsiasi array e anche bidimensionale (o più) $_SESSION['pinco'][33] o $_SESSION['pinco']['pallo'] ...

dimenticavo:
se prove le deu righe di codice che ho postato vedrai che non da nessun warning alla riga 0
 

samurai.sette

Utente Attivo
17 Dic 2015
228
6
18
Ciao ragazzi. Finalmente grazie al vostro aiuto sono riuscito nel mio intento!!! :D:D:D.
Il codice che ho utilizzato è quello di AdeKnite ma l'ho dovuto leggerissimamente modificare con quello di Borgo Italia.
Questo è il codice
PHP:
<?php
session_start();
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Untitled 1</title>

</head>

<body>

<form method="post">
    <select name="pagina" style="width: 100px">
   
    <?php
   
      $host = "localhost";
      $user = "root";
      $pass = "";
      $db = "database";
     
      //connessione al server ed al database
      $connessione = new mysqli($host, $user, $password, $db);

      if ($connessione->connect_errno)
      {
        echo "Connessione fallita: ". $connessione->connect_error . ".";
        exit();
      }
     
      $query = "SELECT * FROM tabella ORDER by id DESC";
      $result = @mysqli_query($connessione, $query);
     
      $N = @mysqli_num_rows ($result);
         
     // calcolo numero pagine (ogni pagina visualizza 30 record)
      $P=ceil($N/3);
      // $_POST['pagina'] =10;
      $i = $_POST['pagina'];
      $_SESSION['selezione']=$i;
      $sel = "";

      for ($i=1; $i<=$P; $i++) {
        if(isset($_SESSION['selezione'])){$sel="selected";}{
          if($_SESSION['selezione'] == $i) {
            echo "<option value=\"".$i."\" selected>".$i."</option>";
          } else {
            echo "<option value=\"".$i."\">".$i."</option>";
          }
        }
      }
    ?>
    </select>
<br />
<br />
    <input name="submit" type="submit" value="submit" />
</form>

</body>

</html>
@borgo italia
A proposito delle domande che mi facevi (a questo punto non so se ti interessa ancora sapere...)
1. il grafico viene costruito nella stessa pagina;
2. nella pagina ci sono diversi drop-down box ed ognuno ha un suo specifico valore. Ad esempio l'utente deve scegliere il tempo, la forza etc. Dopo aver scelto tutti i campi il PHP effettua dei calcoli e costruisce nella stessa pagina il grafico.
Spero di essermi spiegato bene.
Comunque vi ringrazio tantissimo per l'aiuto. Ciao.