Problema sessioni...

  • Creatore Discussione Creatore Discussione Emix
  • Data di inizio Data di inizio

Emix

Utente Attivo
15 Feb 2010
596
0
16
Salve a tutti,
ho una pagina con la quale gestisco delle carte fedeltà, i loro punti e l'operatore che sta lavorando...
Tutto parte dalla pagina di login:
PHP:
<?php
//creo la sessione
//in TUTTE le pagine in cui uso le sessioni
if(!isset($_SESSION)){
  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 http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Benvenuti nel Gestionale</title>
<style type="text/css">
body { 
font: Eras Medium ITC;
text-align: center;
}
</style>

<style type="text/css">
#main {
	width:420px;
	height:300px;
	position:absolute;
	top:50%;
	left:50%;
	margin:-150px 0 0 -179px;
}
</style>
</head>

<body bgcolor="#f7b76b">
<div id="main" text align="left">
	<p><font size="4px" face="Eras Medium ITC">Effettua il Login per accedere al gestionale</font></p><br><br><br>
<form action="session_start.php" method="post">
<table style="">
<tr> 
<td height="41"><font size="4px" face="Eras Medium ITC">Inserisci Username: </font></td><td><input name="user" type="text" value="">
</td>
</tr>
<tr>
<td height="41"><font size="4px" face="Eras Medium ITC">Inserisci Password: </font></td><td>
  <input name="pwd" type="password" value="">
</td>
</tr>
</table>

<p align="center">
<input type=submit value="Login" name="B1" style="font-weight: 700"></font></td></tr></p>
</form>
</div> 
</body>
</html>

Da qui si arriva alla pagina session_start.php che gestisce la sessione e il controllo di user password e attivazione:
PHP:
<?php
//creo la sessione
//in TUTTE le pagine in cui uso le sessioni
if(!isset($_SESSION)){
  session_start ();
  }
?>
<?php
   //ho verificato che provengo da login
    //collegamento al db
   //verifiche sui post ....e li leggo
    $user = $_POST['user'];
    $user = addslashes(htmlspecialchars(($_POST['user'])));
    if($user==""){
    echo '<P> User Vuota</P>';
    header('Location:user_empty.php');
    //ritorno al form
    $a=1;
    }
    $pwd = $_POST['pwd'];
    $pwd = addslashes(htmlspecialchars(($_POST['pwd'])));
    if($pwd=="") {
    header('Location:pwd_empty.php');
    //ritorno al form
    $b=1;
    }
?>
<?php

include('connect.php');
//verifico di provenire da login.php e non digitando sul bw il nome della pagina
if(basename($_SERVER['HTTP_REFERER']) != 'login.php'){
    //non provengo da login.php
    unset($_SESSION);
    //distruggo eventuali sessioni e quindi rimando a login
    @header('Location:login.php');
} else { 
    if ($a!=1 && $b!=1){
    //interrogo il db, non ho messo la codifica dell'user e pass
    $query=mysql_query("SELECT * FROM utenti WHERE user='$user' and pwd='$pwd' and active='1'");
    //verifico che esista un utente con tale username e tale password
    $esiste=mysql_num_rows($query);
    //se $esiste == 0 non cè
    if($esiste > 0){//esiste
        //estraggo usn e pass
        $rows=mysql_fetch_array($query);
	$utente=1;
        //e li passo in sessione
        $_SESSION['user']=$rows['user'];
        $_SESSION['pwd']=$rows['pwd'];
        //accedo alla/alle pag riservate
        @header('Location:ready.php');
    }else{
	$querynoactive=mysql_query("SELECT * FROM utenti WHERE user='$user' and pwd='$pwd' and active='0'");
    //verifico che esista un utente con tale username e tale password
    $esisteactive=mysql_num_rows($querynoactive);
    //se $esiste == 0 non cè
    if($esisteactive > 0){//esiste
        //estraggo usn e pass
        $rows=mysql_fetch_array($querynoactive);	
		echo "Devi attivare il tuo account tramite la mail che ti è stata inviata!";
		}
	//non esiste
	// controlla che siano di un amministratore
    $queryadmin = mysql_query("SELECT * FROM admin WHERE user='$user' AND pwd='$pwd'");
    $esisteadmin=mysql_num_rows($queryadmin);
    //se $esiste == 0 non cè
    if($esisteadmin > 0){//esiste
        //estraggo usn e pass
        $rows=mysql_fetch_array($queryadmin);
	$admin=1;
        //e li passo in sessione
        $_SESSION['user']=$rows['user'];
        $_SESSION['pwd']=$rows['pwd'];
        //accedo alla/alle pag riservate
        @header('Location:ready.php');
	}else{
        unset($_SESSION);
	@header('location:error_pwd_user.php');
    }
}
}
}
?> 
<html>
<head>
<style type="text/css">
body { background-image: url(sfondo.jpg); 
background-repeat: repeat-x;
font: Eras Medium ITC;
}
</style>
</head>

<body bgcolor="#f7b76b">

</body>

Da qui si arriva alla pagina ready.php, non è altro che un disegno che dice che hai effettuato accesso e ti spedisce alla pagina ddt_go.php
PHP:
<?php
//creo la sessione
//in TUTTE le pagine in cui uso le sessioni
if(!isset($_SESSION)){
  session_start ();
  } else {
  session_start();

unset($_SESSION['barcode']);
session_destroy($_SESSION['barcode']);
session_write_close();
}
 include('connect.php');
?>
<!DOCTYPE html>
<html lang="it">
  <head>
    <meta charset="utf-8">
    <title>Creazione DdT</title>
            <style type="text/css">
        * { font-family:Arial; }
        h2 { padding:0 0 5px 5px; }
        h2 a { color: #224f99; }
        a { color:#999; text-decoration: none; }
        a:hover { color:#802727; }
        p { padding:0 0 5px 0; }

        input { padding:5px; border:1px solid #999; border-radius:4px; -moz-border-radius:4px; -web-kit-border-radius:4px; -khtml-border-radius:4px; }
        </style>
        <script type="text/javascript" src="ajax.js"></script>
	<script type="text/javascript">
	
	var ajax = new sack();
	var currentClientID=false;
	function getClientData()
	{
		var clientId = document.getElementById('clientID').value.replace(/[^0-9]/g,'');
		if(clientId.length==4 && clientId!=currentClientID){
			currentClientID = clientId
			ajax.requestFile = 'getClient.php?getClientId='+clientId;	// Specifying which file to get
			ajax.onCompletion = showClientData;	// Specify function that will be executed after file has been found
			ajax.runAJAX();		// Execute AJAX function			
		}
		
	}
	
	function showClientData()
	{
		var formObj = document.forms['clientForm'];	
		eval(ajax.response);
	}
	
	
	function initFormEvents()
	{
		document.getElementById('clientID').onblur = getClientData;
		document.getElementById('clientID').focus();
	}
	
	
	window.onload = initFormEvents;
	</script>
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
        <script>
    $(function() {
      $("#aggiungi").click(function() {
        elem = $(".campo").first().clone();
        elem.css("display", "block");
        elem.appendTo("#campi");
      });

      $("#campi").on("click", ".remove", function() {
        $(this).parent().remove();
      });

      $("#aggiungi").click();
    });
    </script>
<style type="text/css">
body { background-image: url(sfondo.jpg); 
background-repeat: repeat-x;
font: Eras Medium ITC;
}
</style>

<style type="text/css">
#main {
	width:672px;
	height:600px;
	position:absolute;
	top:352px;
	left:523px;
	margin:-150px 0 0 -336px;
}
</style>
</head>
<body bgcolor="#f7b76b">
  <p align="center">
 <img src="images/logo.png" >
  <form action="read_ddt.php" method="post" name="read"> 
  <div id="main"> 
   Operatore: <font color="#FF0000"><?php echo $_SESSION[user]; ?></font><br>
   Data: <?php echo (date("d/m/Y"));?><br>
   Ora: <?php echo (date("H:i"));?><br>
   Barcode card:<font color="#FF0000"><?php echo $_SESSION[barcode]; ?></font><br><br>
   <input type="button" onClick="window.open('puntifidelity.htm', 'Cerca card', 'width=690, height=700, resizable, status, scrollbars=1, location');"
value="Cerca card">
   <p align="left"><a href="#" id="aggiungi">Aggiungi riga</a></p>

    <div id="campi">
    <p>
      <div class="campo" style="display: none;">
        <input type="text" placeholder="Barcode" name="campo[]" id="barcode">
        <input type="text" placeholder="Codice" name="codice[]" id="clientID">
        <input type="text" placeholder="Descrizione" name="descrizione[]" id="descrizione">
        <input type="text" placeholder="Quantità" name="quantita[]" id="quantita">
        <br><a href="#" class="remove">Rimuovi riga</a></br>
        </p>
      </div>
    </div>
    <p>
    <?php 
	$query=mysql_query("SELECT * FROM fidelitypoint WHERE barcode='$_SESSION[barcode]' ");
    //verifico che esista una una card con tale barcode 
    $esiste=mysql_num_rows($query);
    //se $esiste == 0 non cè
    if($esiste > 0){//esiste
        //estraggo usn e pass
        $rows=mysql_fetch_array($query);
		}
		$querypunti=mysql_query("Select sum(punti) from fidelitypoint where barcode='$_SESSION[barcode]'");
		$row=mysql_fetch_array($querypunti);
		?>
       Saldo punti:<font color="#FF0000"> <?php echo $row[0]; ?></font> <br><br>
       
<input name="read" type="submit" id="read" value="Inserisci"> 
</p>
</div>
</form> 
</p>
  </body>
</html>

Questa è la pagina principale... Da qui si vede l'operatore loggato passato in sessione, la data e l'ora, l'eventuale barcode della tessera, il pulsante per la ricerca tessera e il saldo dei punti... Funziona tutto alla grande... solamente che dal click del bottone "cercacard" si apre un popup che ti fa immettere codice, lo cerca e se lo trova, chiude il popup e aggiorna la pagina ddt_go con il numero del barcode passato in sessione... Anche questo TUTTO ok... solamente che ora mi rimane salvato FISSO il barcode dell'ultima tessera usata... Come posso fare?

La pagina cerca card è questa:

PHP:
<?php
session_start();
//CONNESSIONE AL DATABASE
include('connect.php');
//RECUPERA DATI DAL FORM
$mail = $_POST['mail'];
$mail = addslashes(htmlspecialchars(($_POST['mail'])));
$Barcode = $_POST['Barcode'];
$Barcode = addslashes(htmlspecialchars(($_POST['Barcode'])));
if($Barcode =="" ){
	
	
	if($mail==""){
		?>
    <script>
        alert('Il campo mail deve essere riempito!');
        location.href='puntifidelity.htm';
    </script>
    <?php
	}else{
	 if((!isset($_POST['mail'])) || (!eregi("^([a-z0-9\._-]+)(@[a-z0-9.-]+)(\.{1}[a-z]{2,4})$", $_POST['mail'])))
			{
            echo "Attenzione, formato email non valido.";
            //ritorno al form
            }else{
			$ctrl_mail = @mysql_query("SELECT * FROM fidelity            WHERE mail='$mail'") or die (mysql_error());
                   if(@mysql_num_rows($ctrl_mail)>0)
                   {
			       $_SESSION['mail'] = $mail;
				 ?>
    <script>
        location.href='fidelitypoint.php';
    </script>
    <?php
                   }else{
					   ?>
    <script>
        alert('Email non trovata');
        location.href='puntifidelity.htm';
    </script>
    <?php
				   }
	             }
		}
		}else{
			$ctrl_barcode = @mysql_query("SELECT * FROM fidelity WHERE barcode='$Barcode'") or die (mysql_error());
                if(@mysql_num_rows($ctrl_barcode)>0)
                {
			    $_SESSION['barcode'] = $Barcode;
				

	echo '<script>opener.location.href="ddt_go.php";self.close();</script>';

   
                }else{
					  ?>
    <script>
        alert('Numero tessera non trovato');
        location.href='puntifidelity.htm';
    </script>
    <?php
				   }
}
?>
 
il fatto è che se vado all'indirizzo diretto, oltretutto, mi apre normalmente la pagina, invece non dovrebbe....
 
il fatto è che se vado all'indirizzo diretto, oltretutto, mi apre normalmente la pagina, invece non dovrebbe....
ciao
se uno si logga vedo che passi in sessione
$_SESSION['user']=$rows['user'];
$_SESSION['pwd']=$rows['pwd'];
l'user e la passw, quindi nella/e pagina/e riservata/e
PHP:
<?php
session_start();
if(!isset($_SESSION['user']) || !isset($_SESSION['pwd'])){//verifichi che esistano entrambe
	//non esistono
	header("location:dove_vuoi.php");
	exit();
}
//eccetera.....

?>
due cose:
non usare il silent @: gli errori vanno eliminati non nascosti
dopo l'hedaer location metti exit()
 
ok ci avevo pensato hai perfettamente ragione... ora mi rimane il problema del barcode che viene replicato sempre l'ultimo...
 
ciao
un'altra cosa, vedo che usi eregi.
la funzione eregi è deprecata e è molto facile che a brevissimo ti dia errore. devi usare perg:match o meglio la funzione
filter_var($email, FILTER_VALIDATE_EMAIL)
che da false se errata true se giusta
per il bar code non ho guardato, anche perchè non ho capito bene.
da quello che ho capito comunque se devi cambiare il barcode devi uppare la tabella
 
il barcode praticamente viene letto da una tabella e automaticamente viene passato in sessione alla pagina madre... io vorrei semplicemente che ogni volta che venga premuto "inserisci" o "cerca card" o semplicemente effettuato un login e logout si cancelli.... non ci riesco...
 
per eliminare un dato in sessione ti basta usare unset
PHP:
unset($_SESSION['barcode']);
ogni volta che lo inserisci cancelli il dato in memoria
 
eh a se tu vedi bene c'è... è nelle prime righe...

PHP:
<?php
//creo la sessione
//in TUTTE le pagine in cui uso le sessioni
if(!isset($_SESSION)){
  session_start ();
  } else {
  session_start();

unset($_SESSION['barcode']);
session_destroy($_SESSION['barcode']);
session_write_close();
}
 include('connect.php');
?>
 
non ho letto, stasera sono un po appannato
questo però ha poco senso
PHP:
if(!isset($_SESSION)){
  session_start ();
  } else {
  session_start();
senon è settata la inizializzi altrimenti la inizializzi lo stesso?

cmq hai provato a vedere con un var_dump se te l'ha eliminata?
PHP:
unset($_SESSION['barcode']); 
var_dump($_SESSION)
 
no uesto non l'ho fatto... e hai perfettamente ragione sul fatto che la reinizializzo due volte... tecnicamente a me serve sempre attiva la sessione urser e pwd e il loro controllo, con annesso resend alla pagina login... E la sessione del barcode che va aperta nel momento in cui si desidera inserire una card e va ELIMINATA nel momento in cui finisce la transazione (quindi coi tasti "inserisci" o "cerca card" o "azzera vendita"...
 
i var_dump() sono utilissimini per capire dove e come risolvere i problemi
mettili prima e dopo eanche durante
quando trovi il problema lio togli
 
faccio una prova e ti posto risultato semmai... e vediamo... ma come faccio in modo che la sessione si distrugge con quei tasti?
 
non mi sono letto il codice
ogni tasto avra una sua funzione
nel momento che la richiami inserisci l'unset e i var_dump()
su "inserisci" per esempio presumo che sia un tasto submit
PHP:
if(isset($_POST['inserisci'])) {
var_dump($_SESSION)  
     unset($_SESSION['barcode']); 
var_dump($_SESSION)
 
ok ora riesce distruggere la sessione barcode... ma ora però non mi passa il barcode in sessione mai... e quindi il barcode non lo vede mai... inoltre il saldo dei punti sembrerebbe rimanere sempre anche se la query del saldo punti viene fatta passando come parametro la sessione del barcode... Non c'è un altro modo per passare il barcode come dato solamente quando si clicca cerca card e la trova?
 
controllato commentando la parte dell'unset session barcode e funziona ma chiaramente non si resetta... il var dump sembra corretto :

Codice:
array(3) { ["user"]=> string(9) "Webmaster" ["pwd"]=> string(5) "prova" ["barcode"]=> string(13) "1234567890123" }

Dovrei fare in modo di creare una if che dice:
se non provengo da "link inserimento barcode" elimina la sessione barcode, altrimenti lasciala... Solamente che io non provengo direttamente dalla pagina di inserimento barcode ma bensi è un popup che apre, controlla barcode inserito, passa in sessione il barcode e autochiude il popup... è la medesima cosa?
A me praticamente interessa che la sessione barcode sia sempre senza nulla, ma venga riempita nel momento in cui faccio quei passaggi sopra...
Chiaramente devo effettuare un controllo anche nella query, dove prima di farla controllo se il barcode è in sessione altrimenti stampo a video "0"...
è fattibile una cosa del genere? non so dove mettere le mani...
 
ho risolto confrantando la stringa di sito da dove proviene.. ora sembra funzionare tutto.... grazie
 

Discussioni simili