Warning: session_start() [function.session-start]: Cannot send session cache limiter

hobby

Nuovo Utente
22 Dic 2009
5
0
0
Ciao a tutti. Chiedo l'aiuto.

Ho un problema che non riesco a risolvere da almeno 2gg.

Quando carico la pagina php protetta da

<? include("check.php"); ?>

mi appare un errore:

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /..../home.php:1) in /...../check.php on line 2

Il sistema di iscrizione e conferma funziona perfettamente, invece effettuando il login appare l'errore.

Il codice file check.php:

<?
session_start(); //dice che è questo errore

// controlliamo se è stata inizializzata la sessione
if(isset($_SESSION['userid']))
{
//controllo id con esito positivo
echo "<a href=logout.php>Logout</a>";
}else{
//controllo sessione con esito negativo
@header("Location: form_login.php");
}
?>


Il codice di login ho utilizzato simile a quello della conferma di registrazione:

<?
session_start();

// controllo sul parametro d'invio
if( isset($_POST['submit']) && (trim($_POST['submit']) == "login") )
{
// controllo sul formato dell'email
if((!isset($_POST['email'])) || (!eregi("^([a-z0-9\._-]+)(@[a-z0-9.-]+)(\.{1}[a-z]{2,4})$", $_POST['email'])))
{
echo "Attenzione: \nil formato dell'email risulta scorretto.";
}
// controllo sul formato della password
elseif((!isset($_POST['password'])) || ($_POST['password'] == "") || (!preg_match("/^[a-z0-9]+$/i", $_POST['password'])))
{
echo "Attenzione: \nla password inserita risulta scorretta.";
}else{
// se i parametri sono in formato corretto interroghiamo il database
$email = $_POST['email'];
$password = $_POST['password'];

// includiamo il file di configurazione
@include "config.php";

// controlliamo se i parametri sono presenti in tabella
$ctrl_login = @mysql_query("SELECT userid FROM login WHERE email='$email' AND password='$password'") or die (mysql_error());
if(@mysql_num_rows($ctrl_login)==0)
{
// esito login negativo
echo "Login errato.";
}else{

// creiamo un id di sessione corrispondente all'utente
$_SESSION['userid'] = $obj->userid;

// redirect alla pagina degli iscritti
@header("Location: home.php");
}
}
}else{
// form per la conferma
?>

<form align="center" name="login" method="post" action="<? $_SERVER['PHP_SELF']; ?>">
<input placeholder="email" size="20" type="Text" name="email">
<input placeholder="password" type="password" id="password" size="20" name="password">
<b>Ricordami </b><input type="checkbox" name="ricordami[]" value="ON" class="check">
<input type="reset" value="resetta" class="button">
<input type="submit" value="login" name="submit" id="submit" class="button">
</form>
Se non sei registrato <a href="form_iscrizione.php">clicca qui</a>

<?
}
?>


Qualcuno ha una soluzione?


Ringrazio per l'attenzione riservatami.
 
Quell'errore compare perché come dice lui medesimo: Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /..../home.php:1) in /...../check.php on line 2 hai già inviato gli header alla riga 1 del file chiamato index.php.
E infatti non puoi caricare un file in una pagina che inizia con session_start(), il file incluso è a tutti gli effetti la continuazione del primo file, quello che lo include.
Se fai così in pratica è come se richiamassi la sessione due volte, la prima quando apri il file index.php ad esempio e la seconda quando includi check.php.
La soluzione al tuo problema è di togliere il richiamo alle sessioni dai file che includi, e lasciarle solo nei file che richiami dall'url.
 
Intanto ti ringrazio per l'indicazione. :fonzie: Dato che ho provato a modificare qualcosa ma non ho il risultato che vorrei. Potresti scrivermi la soluzione in codice?

Per proteggere le pagine devo utilizzare necessariamente:

<? include("check.php"); ?> tranne index.html

Ipotizzando l'assenza del file check.php:

nella home.php e altre pagine il codice da scrivere sarebbe:

<?
session_start();

// controlliamo se è stata inizializzata la sessione
if(isset($_SESSION['userid']))
{
//controllo id con esito positivo
echo "<a href=logout.php>Logout</a>";
}else{
//controllo sessione con esito negativo
@header("Location: form_login.php");
}
?>

Utilizzando questa modalità, la pagina non è protetta è non viene effettuato il trasferimento alla form_login.php . :confused:
 
Rinnovo il ringraziamento.

Ho effettuato le modifiche da te suggerite e ho il risultato:
le pagine non hanno nel caso positivo echo (Logout);
le pagine non risultano protette (riesco ad accedere con un semplice copia incolla dell'url e non c'è il redirect a form_login.php)
Insomma, credo che include() non interagisca con check.php
Forese il problema è nelle variabili della sessione?
Oppure l'incompatibilità con la pagina index.html?

Forse serve qualche altro script di connesione al database MySQL?:confused:

Saluti.:byebye:
 
difficile che MySQL centri qualcosa con un problema di reindirizzamento, comunque togli tutti quegli operatori di silence ("@") e vedi se ti restituisce qualche errore
 
Ringrazio Eliox per il suggerimento.

Ho provato ad applicare il tuo suggerimento, tuttavia togliendo @ da check.php mi da l'errore nella riga di header.
Attualmente non ci sono errori ma la protezione delle pagine è assente, cosa che è fondamentale.

Cordiali saluti.:byebye:
 
controlla quanti session_start() vengono eseguiti e dove tra tutte le pagine che vengono incluse
 
Grazie a tutti voi.
Ho trovato la soluzione che consisteva nella modifica del codice.
Ho aggiunto il riferimento mancante alla riga
$_SESSION['userid'] = $obj->userid;

Cordiali Saluti. :byebye:
 

Discussioni simili