dati PHP SESSIONE persi tra caricamento della pagina con WampServer 2.0 su localhost
-
23-09-2019 - |
Domanda
Ho un sistema di autenticazione PHP sul mio sito web utilizzando la variabile $ _SESSION.
Una forma presenta un nome utente e una password per il file "login.php". E 'gestito in questo modo:
<?php include '../includes/sessionstart.inc.php'; ?>
<?php ob_start(); ?>
if($_POST){
$q = mysql_query("SELECT id, company FROM users WHERE username = '".mysql_real_escape_string($_POST['username'])."' AND password = '".md5($_POST['password'])."'");
if(mysql_num_rows($q) >= 1){
$f = mysql_fetch_Array($q);
$_SESSION['company'] = $f['company'];
$_SESSION['id'] = $f['id'];
$_SESSION['logedin'] = true;
session_write_close();
ob_clean();
header("Location: index.php");
}
In seguito, index.php viene caricato e controlla se 'logedin' è vero.
<?php include '../includes/sessionstart.inc.php'; ?>
<?php if(!isset($_SESSION['logedin'])) header('Location: login.php'); ?>
Sul mio server di produzione, continua, ma sul mio Wampserver, si ritorna ad login.php. Noto che Wampserver è molto lento nel caricamento della pagina, questo potrebbe avere a che fare qualcosa con esso. È per questo che ho inserito il session_write_close, per assicurarsi che i dati sessione viene salvata prima che le pagine sono accesi, ma non aiuta.
Il contenuto di session_start.inc.php sono semplicemente:
<?php
session_start();
?>
ho usato per avere più codice in là, ma al momento è solo questo. Il problema esisteva anche prima ho iniziato ad usare un file di inclusione.
Qualcuno ha idea di cosa sto facendo male? Perché non WampServer trasmettere i miei dati di sessione al file PHP successivo?
Soluzione 5
Dopo un lungo periodo di tempo ho fissato questo bug finalmente.
Al mio localhost WAMP, i dati della sessione non viene salvata tra caricamento della pagina, perché i dati della sessione è memorizzato in un cookie, e non c'è dominio cookie da impostare per localhost.
La soluzione:
'session.cookie_domain' deve essere impostato su una stringa vuota per tutti i nomi di dominio locale, non solo per il 'localhost' (ma non dovrebbe essere vuoto per gli indirizzi IP locali):
<?php
ini_set('session.cookie_domain', (strpos($_SERVER['HTTP_HOST'],'.') !== false) ? $_SERVER['HTTP_HOST'] : '');
?>
Grazie a Marcin Wiazowski che ha pubblicato qui .
Altri suggerimenti
del server WAMP 2 -. Impostazioni non sono impostate per impostazione predefinita per $_SESSION
var
php.ini richiede le seguenti impostazioni
C:\wamp\bin\apache\apache2.4.2\bin\php.ini
session.cookie_domain =
session.use_cookies = 1
session.save_path = "c:\wamp\tmp" ;ensure the \ is used not /
test Session -
load.php -. carico $_SESSION
var
<?PHP
session_start();
$_SESSION['SESS_MEMBER_ID'] = 'stored variable';
session_write_close();
header("location:print.php");
?>
print.php -. Print $ _SESSION var
<?PHP
session_start();
var_dump($_SESSION);
?>
eseguire lo script nella vostra var_dump()
browser dovrebbe produrre risultati
vai alla c:\wamp\tmp
file contenenti i dati della sessione verranno visualizzate qui.
Prima di tutto:.? La logedin
indice sembra strano per tenere traccia di un utente essere collegati E 'solo un errore di battitura su SO, o realmente un codice typo-
In secondo luogo (a seconda del comportamento desiderato), provare un approccio diverso per rendere le pagine protette da login. La pagina dovrebbe essere simile
<?php
include 'login.inc.php';
if(authorized()) {
// put some more script here, if needed
?>
// put some plain HTML here
<?php
}
?>
Dove login.inc.php
gestisce la sessione, cookie. In particolare, la funzione authorized
dovrebbe restituire TRUE se un client è già connesso. Se un client non è connesso, dovrebbe mostrare una forma ad azione $_SERVER['PHP_SELF']
e ritorno FALSE. Se il nome della cosa presentare ingresso come login_submit
, si può lasciare che login.inc.php
gestire la verifica.
In questo modo, non è necessario fare riferimento gli utenti a una pagina di login dedicata, e dopo il login, l'utente vengono visualizzati direttamente la pagina richiesta. È possibile modificare questo un po 'per fare delle query stringhe persistente tramite login pure.
Prova a sostituire
if($_POST){...}
con
if( isset($_POST['username']) && isset($_POST['password']) ){...}
... almeno per il debugging. E 'possibile che alcune impostazioni differenti stanno provocando un array $ _POST non vuoto in cui non è previsto.
Inoltre, il codice sembra mancare exit()
chiama dopo reindirizzamenti header()
. L'invio di un HTTP Posizione di testa non si ferma automaticamente lo script.
Ho avuto questo problema utilizzando WAMPSERVER per lo sviluppo su / localhost. Avevo bisogno di cambiare session.use_only_cookies
sia in linea o nell'impostazione php.ini
da
session.use_only_cookies = 1
a
session.use_only_cookies = 0
Spiegazione
sessioni basate su cookie Utilizzando predefinite lavorava come previsto, ma ho bisogno di una soluzione di cookie-less. Una pagina di prova iniziale:
<?php
// page1.php
ini_set('session.use_cookies', '0');
session_start();
$_SESSION['time'] = time();
echo '<br /><a href="page2.php?' . SID . '">page 2</a>';
?>
I dati della sessione è stato creato e memorizzato con successo nella directory temp WAMPSERVER, per esempio, C:\wamp\tmp\sess_0rkdlonl5uia717rf03d4svs16
. Il collegamento generato dal codice di cui sopra è simile a (notare l'UID corrisponde al nome del file di dati di sessione):
page2.php?PHPSESSID=0rkdlonl5uia717rf03d4svs16
Ma la page2.php destinazione stava gettando errori non definiti per il 'tempo' variabile mentre cerca di recuperare i dati di sessione:
<?php
// page2.php
ini_set('session.use_cookies', '0');
session_start();
echo date('Y m d H:i:s', $_SESSION['time']);
echo '<br /><a href="page1.php?' . SID . '">page 1</a>';
?>
Con l'impostazione session.use_only_cookies
FALSE sia lo script prima session_start();
:
ini_set('session.use_only_cookies', '0');
o cambiando globalmente in php.ini
:
; This option forces PHP to fetch and use a cookie for storing and maintaining
; the session id. We encourage this operation as it's very helpful in combatting
; session hijacking when not specifying and managing your own session id. It is
; not the end all be all of session hijacking defense, but it's a good start.
; http://php.net/session.use-only-cookies
session.use_only_cookies = 0
ha risolto il problema.
Di fronte lo stesso problema ma è stato causato da
session_regenerate_id(true);
Così ho cancellato dal mio codice.
Aggiorna per WAMP 2.5 e ora il problema è risolto!