Problema passaggio variabili tra pagine

navajo75

Utente Attivo
16 Mar 2012
103
1
18
Buongiorno a tutti,
ho un file che si chiama mese.php in cui è inserito il seguente codice

Codice:
  if (isset($corrispettiviins)) {
    echo '<a href="php/verifica-febbraio.php?mese=Febbraio&corrispettiviins=inscorrispettivi"><img src="img/febbraio.png" /></a>';
  }  else {
       echo '<a href="php/verifica-febbraio.php?mese=Febbraio&corrispettivicons=conscorrispettivi"><img src="img/febbraio.png" /></a>';
      }
La variabile $corrispettiviins è settata e viene recuperata da un'altra pagina, anno.php, attraverso il GET, come a seguire

Codice:
  if (!isset($_GET['corrispettiviins'])) {
    } else {    
        $corrispettiviins=$_GET['corrispettiviins'];
      $posizionemeseins="Inserimento corrispettivi";
    }
  if (!isset($_GET['corrispettivicons'])) {
  } else {
        $corrispettivicons=$_GET['corrispettivicons'];
      $posizionemesecons="Consultazione corrispettivi";
    }
Dalla pagina mese.php, mi sposto alla pagina verifica-mese.php, dove, come prima cosa eseguo il controllo su quale variabile sia settata, $corrispettiviins o $corrispettivicons, utilizzando lo stesso codice di cui sopra, quindi:

Codice:
  if (!isset($_GET['corrispettiviins'])) {
    } else {    
        $corrispettiviins=$_GET['corrispettiviins'];
      $posizionemeseins="Inserimento corrispettivi";
    }
  if (!isset($_GET['corrispettivicons'])) {
  } else {
        $corrispettivicons=$_GET['corrispettivicons'];
      $posizionemesecons="Consultazione corrispettivi";
    }
e poi mando al mese corretto, febbraio.php o febbraio-bisestile.php, a seconda che l'utente scelga un anno in cui febbraio è bisestile o normale

Codice:
  if (isset($corrispettiviins)&&($year==2016)OR($year==2020)OR($year==2024)OR($year==2028)OR($year==2032)OR($year==2036)):
    header("Location: ../febbraio-bisestile.php?corrispettiviins=inscorrispettivi");
  elseif (isset($corrispettivicons)&&($year==2016)OR($year==2020)OR($year==2024)OR($year==2028)OR($year==2032)OR($year==2036)):    
    header("Location: ../febbraio-bisestile.php?corrispettivicons=conscorrispettivi");
  elseif (isset($corrispettiviins)&&($year!=2016)OR($year!=2020)OR($year!=2024)OR($year!=2028)OR($year!=2032)OR($year!=2036)):
    header("Location: ../febbraio.php?corrispettiviins=inscorrispettivi");
  elseif (isset($corrispettivicons)&&($year!=2016)OR($year!=2020)OR($year!=2024)OR($year!=2028)OR($year!=2032)OR($year!=2036)):
    header("Location: ../febbraio.php?corrispettivicons=conscorrispettivi");
  endif;
Cosa ottengo? Se l'utente scegli d'inserire i corrispettivi funziona tutto correttamente, sia che si scelga il febbraio di un anno bisestile, sia che si scelga il febbraio di un anno non bisestile.
I problemi cominciano quando l'utente sceglie di consultare i corrispettivi. Se si sceglie consultazione, anno 2016 e febbraio ok, ma come si sceglie un anno diverso, sballa tutto. Se ad esempio si sceglie anno 2017, nel riepilogo della pagina, ricevo l'informazione che sto inserendo i corrispettivi, anche se ho scelto di consultarli; e così anche se scelgo altri anni bisestili che non siano il 2016.
Per provare a capire meglio, sempre nella pagina verifica.php, ho inserito il seguente codice:

Codice:
  $uno="Primo caso. Inserimento corrispettivi-anno bisestile.";
  $due="Secondo caso. Consultazione corrispettivi-anno bisestile.";
  $tre="Terzo caso. Inserimento corrispettivi-anno non bisestile.";
  $quattro="Quarto caso. Consultazione corrispettivi-anno non bisestile.";

  if (isset($corrispettiviins)&&($year==2016)OR($year==2020)OR($year==2024)OR($year==2028)OR($year==2032)OR($year==2036)):
    echo $uno;
  elseif (isset($corrispettivicons)&&($year==2016)OR($year==2020)OR($year==2024)OR($year==2028)OR($year==2032)OR($year==2036)):    
    echo $due;
  elseif (isset($corrispettiviins)&&($year!=2016)OR($year!=2020)OR($year!=2024)OR($year!=2028)OR($year!=2032)OR($year!=2036)):
    echo $tre;
  elseif (isset($corrispettivicons)&&($year!=2016)OR($year!=2020)OR($year!=2024)OR($year!=2028)OR($year!=2032)OR($year!=2036)):
    echo $quattro;
  endif;
Ed ecco cosa ottengo:
1) Inserimento corrispettivi anno 2016, o 2020, o 2024, o 2028, o 2032, o 2036: Primo caso. Inserimento corrispettivi-anno bisestile (CORRETTO)
2) Inserimento corrispettivi con qualunque anno non bisestile: Terzo caso. Inserimento corrispettivi-anno non bisestile (CORRETTO)
3) Consultazione corrispettivi anno 216: Secondo caso. Consultazione corrispettivi-anno bisestile (CORRETTO)
4) Consultazione corrispettivi con qualunque altro anno bisestile (2020, 2024, 2028, 2032, 2036): Primo caso. Inserimento corrispettivi-anno bisestile (NON CORRETTO)
5) Consultazione corrispettivi con qualunque altro anno non bisestile: Terzo caso. Inserimento corrispettivi-anno non bisestile (NON CORRETTO)

Ringrazio con anticipo chiunque voglia aiutrami
Saluti,
Marco
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
lei usa il parametro GET per identificare un singolo valore, sarà valido se presente esattamente uno e verifica se la variabile è vero e poi se vero o vero, aggiunto parentesi graffa e sostituito OR con && poiché non bisestile su un range di 2016-2020-2024-2028-2032-2036 è valido solo se tutti restituiscono true o l'unico false e in quel caso l'anno è bisestile.
PHP:
//un solo parametro altrimenti non valido
if(isset($_GET['corrispettiviins']) || isset($_GET['corrispettivicons'])) {
//per register_globals
unset($corrispettiviins, $corrispettivicons);
    if(!isset($_GET['corrispetivicons'])) {
        $corrispettiviins=$_GET['corrispettiviins'];
        $posizionemeseins="Inserimento corrispettivi";
    } elseif(!isset($_GET['corrispettiviins'])) {
        $corrispettivicons=$_GET['corrispettivicons'];
        $posizionemesecons="Consultazione corrispettivi";
    } else {
        unset($_GET['corrispettiviins'], $_GET['corrispettivicons']); // in realtà per la variabile $_GET occorrerebbe un redirect senza quella variabile GET ma comunque è solo un un'esempio.
    }
}
  $uno="Primo caso. Inserimento corrispettivi-anno bisestile.";
  $due="Secondo caso. Consultazione corrispettivi-anno bisestile.";
  $tre="Terzo caso. Inserimento corrispettivi-anno non bisestile.";
  $quattro="Quarto caso. Consultazione corrispettivi-anno non bisestile.";

  if (isset($corrispettiviins)&&(($year==2016)OR($year==2020)OR($year==2024)OR($year==2028)OR($year==2032)OR($year==2036))):
    echo $uno;
  elseif (isset($corrispettivicons)&&(($year==2016)OR($year==2020)OR($year==2024)OR($year==2028)OR($year==2032)OR($year==2036))):
    echo $due;
  elseif (isset($corrispettiviins)&&(($year!=2016)&&($year!=2020)&&($year!=2024)&&($year!=2028)&&($year!=2032)&&($year!=2036))):
    echo $tre;
  elseif (isset($corrispettivicons)&&(($year!=2016)&&($year!=2020)&&($year!=2024)&&($year!=2028)&&($year!=2032)&&($year!=2036))):
    echo $quattro;
  endif;
Oppure riscrivi il secondo codice con l'operatore ternario e verifichi comunque se è vero se per due operazioni è false restituirà la stringa vuota o altrimenti una stringa numerica da 1 a 4 per questo motivo utilizzo anche if per verificare diversa da stringa vuota.
PHP:
$range_leap_year = array(''.'2016', ''.'2020', ''.'2024', ''.'2028', ''.'2032');
if(($result = (in_array("$year", $range_leap_year, true) ? (isset($corrispettiviins) ? '1' : (isset($corrispettivicons) ? '2' : '')) : (isset($corrispettiviins) ? '3' : (isset($corrispettivicons) ? '4' : '')))) !== '') {
    echo $result;
}
Fix prima parte codice.
Poi se sei sicuro della logica del tuo codice la stringa vuota è superflua.
 
Ultima modifica:

navajo75

Utente Attivo
16 Mar 2012
103
1
18
La ringrazio infinitamente. Funziona in questa maniera qua:

Codice:
session_start();
  
  if (!isset($_GET['corrispettiviins'])) {
  } else {    
     $corrispettiviins=$_GET['corrispettiviins'];
      $posizionemesesceltoins="Inserimento corrispettivi";
    }
  if (!isset($_GET['corrispettivicons'])) {
  } else {
        $corrispettivicons=$_GET['corrispettivicons'];
      $posizionemesesceltocons="Consultazione corrispettivi";
    }
    
  $year=$_SESSION['year'];
  $mese=$_GET['mese'];
  $_SESSION['month']=$mese;
  $month=$_SESSION['month'];

  $range_leap_year = array(''.'2016', ''.'2020', ''.'2024', ''.'2028', ''.'2032', ''.'2036');
if(($result = (in_array("$year", $range_leap_year, true) ? (isset($corrispettiviins) ? header("Location: ../febbraio-bisestile.php?corrispettiviins=inscorrispettivi") : (isset($corrispettivicons) ? header("Location: ../febbraio-bisestile.php?corrispettivicons=conscorrispettivi") : '')) : (isset($corrispettiviins) ? header("Location: ../febbraio.php?corrispettiviins=inscorrispettivi") : (isset($corrispettivicons) ? header("Location: ../febbraio.php?corrispettivicons=conscorrispettivi") : '')))) !== '') {
    echo $result;
}
Devo chiudere il post in qualche modo?
Di nuovo, mille grazie
 

Hormus

Utente Attivo
26 Giu 2020
83
10
8
No è sbagliato per la prima parte del codice le ho scritto il perché.. comunque va bene che ha risolto.
Editato il messaggio precedente. Fix prima parte del codice.
Se per l'esito vero e dunque dalla stringa numerica da 1 a 4 deve semplicemente impostare un header può togliere l'if
PHP:
$result = (in_array("$year", $range_leap_year, true) ? (isset($corrispettiviins) ? header("Location: ../febbraio-bisestile.php?corrispettiviins=inscorrispettivi") : (isset($corrispettivicons) ? header("Location: ../febbraio-bisestile.php?corrispettivicons=conscorrispettivi") : '')) : (isset($corrispettiviins) ? header("Location: ../febbraio.php?corrispettiviins=inscorrispettivi") : (isset($corrispettivicons) ? header("Location: ../febbraio.php?corrispettivicons=conscorrispettivi") : '')));
 
Ultima modifica:

MarcoGrazia

Utente Attivo
15 Dic 2009
788
16
18
59
Udine
www.stilisticamente.com
Quello che non capisco è questo: $range_leap_year = array(''.'2016', ''.'2020', ''.'2024', ''.'2028', ''.'2032', ''.'2036'); ma definire se l'anno è bisestile o meno con una funzione?

PHP:
if  ( ( $anno % 4 == 0 ) && ( !($anno % 100 == 0 ) || ( $anno % 400 == 0 ) ) )
{
$anno = bisesto
}
else
{
$anno = non bisesto
}
Se uno inserisce dati prima del 2016 che fai modifichi il programma? Se ci sono previsioni dopo il 2036 che fai modifichi il programma?

Poi vedo che non controlli cosa viene passato via GET, ti affidi alla sicurezza di una variabile calcolata e inserita dal programma nel link, ma se uno la modifica arbitrariamente mettendoci un valore non numerico?
Il programma va in crash?