[PHP] Sessione Login

  • Creatore Discussione Creatore Discussione miagy
  • Data di inizio Data di inizio

miagy

Utente Attivo
2 Nov 2014
83
1
8
Ciao ragazzi.
Data una tabella MySql chiamata event, ho creato un calendario di "promemoria" che funziona correttamente. Quando un dato, attualmente globale, viene inserito, l'icona del calendario si riempie attraverso questo pezzo sorgente:

PHP:
for ($list_day = 1; $list_day <= $daysinmonth; $list_day++) {
        $tm = date("U", mktime(0, 0, 0, $month, $list_day, $year)) - 86400; // Bir gün önce
        $tn = date("U", mktime(0, 0, 0, $month, $list_day, $year)); // O gün ...
        $tp = date("U", mktime(0, 0, 0, $month, $list_day, $year)) + 86400; // Bir gün sonra
        $Q = sprintf("SELECT * FROM ´events´ WHERE ´Autore´ = ´$Autore´ AND ´date´ > ´%s´ AND ´date´ < ´%s´ AND ´day´ = ´%s´;", $tm, $tp, $list_day);
        $R = mysql_query($Q);
        $D = mysql_fetch_assoc($R);
        $S = mysql_num_rows($R);
        $Y = $D[´date´];
        $TheDay = date(´d´, $Y);
        $TheMon = date(´F´, $Y);
        $TheYea = date(´Y´, $Y);
        $time = $D[´time´];
        list($hour, $minute) = explode(´:´, $time);
        mysql_free_result($R);
        if (($S) AND ($Autore == ´´)) {
        ?>
            <td align="center" style="background-color: #FFFFFF; color: #FFFFFF; border: 1px solid #FFFFFF; cursor: pointer;" onmouseover="return overlib(´<table width="100%" border="0" class="popupDateTable"><tr><td align="center" class="popupDate"><?php echo stripslashes($D[´title´]); ?> ore <?php echo date($D[´time´]); ?> <?php echo ´@´ . stripslashes($D[´location´]); ?></td></tr></table>´);" onmouseout="return nd();" title="">
        <?php
        }

Come promemoria globale, funziona tutto alla perfezione.
Ultimamente ho in mente di creare un promemoria personalizzato, legato cioè al singolo utente loggato.
Ho agito dunque in questo modo:

  • Ho già creato un panel in cui l´inserimento dei dati (prenotazioni utente), dentro la tabella event, avviene senza problemi.
  • Ho valorizzato all´inizio, dopo il session_start(), la sessione Login (ho provato anche con un print ed è tutto okay)
    PHP:
    $utente = $_SESSION['Login'];
  • Dopo il primo if qui sopra, ho aggiunto questa riga
    PHP:
    } elseif (($S) AND ($Autore == $utente)) {
            ?>
                <td>bla bla

Il risultato però è nullo e non capisco il motivo.
Ho provato anche il blando Autore == $_SESSION['Login'], ma nulla. E' come se non esistesse nessun dato (cosa falsa, ovviamente).
 
ciao
sarebbe opportuno che tu scrivessi un po' più di codice relativo a quell'if

Certo: nella sua interezza è questo:

PHP:
<?
//Personalizzato//

if (($S) AND ($Autore == $utente)) { ?>
            <td align="center" style="background-color: #e6e7e7; color: #618dd6; border: 1px solid #888888; cursor: pointer;" onmouseover="return overlib('&lt;table width=&quot;100%&quot; border=&quot;0&quot; class=&quot;popupDateTable&quot;&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; class=&quot;popupDate&quot;&gt;<?php echo stripslashes($D['title']); ?> ore <?php echo date($D['time']); ?> <?php echo '@' . stripslashes($D['location']); ?>&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;');" onmouseout="return nd();" title="">
<? //Chiudo e Globale

        } elseif (($S) AND ($Autore == '')) {
        ?>
            <td align="center" style="background-color: #e6e7e7; color: #618dd6; border: 1px solid #888888; cursor: pointer;" onmouseover="return overlib('&lt;table width=&quot;100%&quot; border=&quot;0&quot; class=&quot;popupDateTable&quot;&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; class=&quot;popupDate&quot;&gt;<?php echo stripslashes($D['title']); ?> ore <?php echo date($D['time']); ?> <?php echo '@' . stripslashes($D['location']); ?>&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;');" onmouseout="return nd();" title="">
        <?php
        } elseif ($tn > $tm AND $tn < $tp AND date('j') == $list_day AND date('m') == $month AND date('Y') == $year) {
        ?>
            <td align="center" style="background-color: #11243a; color: #618dd6;  border: 1px solid #618dd6;">
        <?php
        } elseif ($theday == 6 or $theday == 0) {
        ?>
            <td align="center" style="background-color: #11243a; color: #e6e7e7; border: 1px solid #888888;">
        <?php
        } else {
        ?>
            <td align="center" style="background-color: #11243a; color: #e6e7e7; border: 1px solid #888888;">
        <?php
        }
       
       
       
        echo $list_day;

        echo '</td>';
 
ciao
non vedo session_start(), session_start deve esserci in tutte le pagine in cui usi le sessioni
poi non usare lo shortag <? ma usa <?php è meglio, soprattutto non fare la mescolanza
 
Corretto con la tua indicazione.
Il session_start() è a inizio pagina:

PHP:
<?php session_start();

include ("../inc/parametri.inc.php");
include ("../inc/controllo.php");
include ("../inc/open2.php");
include ("../inc/controlloesilio.php");
include ("../inc/header.html.inc.php");

$utente = $_SESSION['Login'];

//inizio html//

?>
 
Ultima modifica:
ciao
e dove valorizzi $_SESSION['Login']?
da dove proviene?
se questa è la pagina in cui verifichi il log (almeno così sembra o sbaglio?), dovresti avere prima un form in cui l'utente pinco immette le sue credenziali
riceverle con i loro $_POST, verificare se le credenziali sono in tabella (utente registrato) e a quel punto valorizzare la sessione e accedere promemoria personalizzato


p.s.
abbandona le vecchie istruzioni php mysql_xy deprecate e in via di abbandono e passa alle nuove mysqli_xy
 
La sessione $_SESSION['Login'] viene valorizzata dentro un file include (ho fatto un print di prova e mi viene stampato correttamente il risultato).
Se vuoi posso portarti la pagina, ma in teoria non dovrebbe esserci bisogno dato che, ribadisco, con un print il risultato c'è :S
 
ciao
prova così
PHP:
<?php
session_start();
//Personalizzato//
var_dump($_SESSION['login']);//poi lo togli dopo aver visto cosa riporta
if(isset($_SESSION['login'])){
?>
<td align="center" style="background-color: #e6e7e7; color: #618dd6; border: 1px solid #888888; cursor: pointer;" onmouseover="return overlib('&lt;table width=&quot;100%&quot; border=&quot;0&quot; class=&quot;popupDateTable&quot;&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; class=&quot;popupDate&quot;&gt;<?php echo stripslashes($D['title']); ?> ore <?php echo date($D['time']); ?> <?php echo '@' . stripslashes($D['location']); ?>&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;');" onmouseout="return nd();" title="">

<?php   
}else{//Chiudo e Globale
    //quello che ci va nel globale
}
?>
eventualmete posta tutto il codice in particolare dove valorizzi la sessione
 
Allora, con il var_dump il risultato mostra il log correttamente.
Con la tua soluzione, tutte le caselle vengono "attivate" (ovviamente, considerando che si attivano non se $Autore == LOGIN ma se sei loggato e basta).

Per quanto riguarda la valorizzazione, ci sono degli include (vedi codice in #5)

In open2 attivo il db:

PHP:
<? $db = mysql_connect("localhost",$par_DbUser,$par_DbPassword) or die("<b>ERRORE DI ACCESSO AI DATI</B><br>L'errore di solito &egrave; dovuto a problemi di sovraccarico del server, &egrave; temporaneo e sparisce dopo qualche minuto.<br><a href='Javascript:location.reload()'>riprova</a>");
mysql_select_db($par_Conn);
function pars($var) {
    return addslashes($var);
}
?>

In controllo.php

PHP:
<? $Login = $_SESSION['Login'];

if ($Login == '') {
    include("header.html.inc.php");
    echo "<center>Sei stato inattivo troppo a lungo. Rientra.<br><br><a href='inizio.php' target='_top'>esci</a></center>";
    exit();
};
?>

Per quanto riguarda la valorizzazione del dato in events:

PHP:
<?php
/*
   +-------------------------------------+
   + NEW                                 +
   +-------------------------------------+
*/
if ($_GET['sa'] == 'new') {
/*
   +-------------------------------------+
   + NEW                                 +
   +-------------------------------------+
*/
?>
<table width="768" border="0" align=center>
<form name="form1" action="prenota.php?sa=save" method=Post>
  <center>
    Tipo:<br>
    <select name="title" class="ares">
    <option>Impegno Personale</option>
    <option>Impegno Pubblico</option>
    </select>
    <br><br>
    
    Tuo Login:<br>

    <select name="Autore" class="ares">
    <option><?= $utente ?></option>
    </select><br><br>
    Quando:<br>
    <select name="day" class="ares">
                    <option value="1"<?php if (date('j') == '1') { echo ' selected'; } ?>>01</option>
<? //FINO A 31// ?></select>
                <select name="month" class="ares">
                    <option value="1"<?php if (date('n') == '1') { echo ' selected'; } ?>>Gennaio</option><? //FINO A 12// ?>
                </select>
                <select name="year" class="ares">
                    <option value="2017"<?php if (date('Y') == '2017') { echo ' selected'; } ?>>2017</option></select>
                &nbsp; &nbsp;
                -
                &nbsp; &nbsp;
                <input type="text" size=3 name="hour" value="<?php echo date('H'); ?>" class="ares" style="text-align: center;">
                :
                <input type="text" size=3 name="minute" value="<?php echo date('i'); ?>" class="ares" style="text-align: center;">
            
                <br><br>
<input type=submit name=op value='Avanti' class=ares></center>
</form><br><br>
</td></tr></table>

<?php
/*
   +-------------------------------------+
   + SAVE                                +
   +-------------------------------------+
*/
} elseif ($_GET['sa'] == 'save') {
/*
   +-------------------------------------+
   + SAVE                                +
   +-------------------------------------+
*/
?>


<?php
// Variables from Form
$title = trim(addslashes($_POST['title']));
$event = trim(addslashes($_POST['event']));
$Autore = trim($_POST['Autore']);
$day = trim($_POST['day']);
$month = trim($_POST['month']);
$year = trim($_POST['year']);
$hour = trim($_POST['hour']);
$minute = trim($_POST['minute']);
$date = date('U', mktime(0, 0, 0, $month, $day, $year));
$time = $hour.':'.$minute;

// Query
$query = sprintf("INSERT INTO `events` (`event_id`, `title`, `event`, `Autore`, `day`, `month`, `year`, `date`, `time`) VALUES (NULL, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s');", $title, $event, $Autore, $day, $month, $year, $date, $time);

// Run it!
$run = mysql_query($query);

}

//ULTIMO HTML//
?>
 
ciao
ok, ma allora dovrebbe funzionare con
PHP:
if (($S) and ($Autore == $_SESSION['Login'])) {
a qusto punto un dubbio, verifica $Autore e $s
PHP:
session_start();
var_dump($s);
var_dump($Autore);
var_dump($_SESSION['Login']);//questo mi hai detto che va bene
if (($S) and ($Autore == $_SESSION['Login'])) {//ecc....
 
Questo è il risultato attuale (no, ancora non funziona)

20thybl.png
 
ciao
se $s e $Autore sono NUL la parte personalizzata non verra mai eseguita
a parte che non so dove generi quel $s ma per $autore mi sembra che in una pagina derivi da un $_POST, quindi passa anche quello in sessione e analogamente in sessione il valore di $s e prova a correggere quell'if così
PHP:
if (isset($_SESSION['s']) and $_SESSION['Autore'] == $_SESSION['Login']) {
 
Allora, il POST di $Autore è in una pagina chiamata prenota.php ed è l'ultimo codice in #9
Per quanto riguarda $S, valorizzo nella pagina calendario, nello specifico:

PHP:
$tm = date("U", mktime(0, 0, 0, $month, $list_day, $year)) - 86400; // Bir gün önce
        $tn = date("U", mktime(0, 0, 0, $month, $list_day, $year)); // O gün ...
        $tp = date("U", mktime(0, 0, 0, $month, $list_day, $year)) + 86400; // Bir gün sonra
        $Q = sprintf("SELECT * FROM `events` WHERE `Autore` = '$Autore' AND `date` > '%s' AND `date` < '%s' AND `day` = '%s';", $tm, $tp, $list_day);
        $R = mysql_query($Q);
        $D = mysql_fetch_assoc($R);
        $S = mysql_num_rows($R);
        $Y = $D['date'];
        $TheDay = date('d', $Y);
        $TheMon = date('F', $Y);
        $TheYea = date('Y', $Y);
        $time = $D['time'];
        list($hour, $minute) = explode(':', $time);
        mysql_free_result($R);
 
ciao
allora sempre ricordando di mettere all'inizio session_start();
nella pagina calendario
PHP:
//....
$R = mysql_query($Q);
$D = mysql_fetch_assoc($R);
$S = mysql_num_rows($R);
if($S>0) $_SESSION['s']=$S;
$Y = $D['date'];
//.....
e nella pagina prenota
PHP:
//.....
$event = trim(addslashes($_POST['event']));
$Autore = trim($_POST['Autore']);
if(!empty($Autore) $_SESSION['autore']=$Autore;
$day = trim($_POST['day']);
//......
con l'ultimo if che ti ho postato "dovrebbe" funzionare.

poi una cosa, attento alle maiuscole/minuscdole, io avevo sbagliato nel var_dump avevo messo $s invece che $S
 
Funziona tutto :)
Ti ringrazio della pazienza.

Ho solo un ultimo bug.
Mi sono accorto che se prenoto un utente personalizzato (e compare nel calendario) scompaiono gli eventi globali, come se non potessero coesistere insieme.
Viceversa, se cancello il promemoria personale, torna l'evento globale.
 
No, rettifico tutto. Sto impazzendo.
Mi sono accorto di un altro bug:

  • Se prenoto una personale, non solo scompaiono quelli globali ma non posso neanche più prenotare i globali. Se esco e riloggo, tuttavia, scompaiono i personali e tornano i globali.
  • Se prenoto globalmente è tutto okay.
 

Discussioni simili