PDA

View Full Version : [PHP] Piccolo dubbio su include, require, header


DigitalKiller
23-08-2006, 16:01
Ciao ragazzi!
Mi sono avvicinato da poco al php e sto provando a covertire una mia vecchia applicazione web scritta in jsp. Ho, però, alcuni dubbi sull'uso di include, require ed header.
Conosco le "caratteristiche" e le differenze tra include, require e header ma non riesco a capire il campo di applicazione!
Vi faccio un esempio per spiegarmi meglio.


include("config.inc.php");

if ($_POST['submit']){
if (($_POST['username'] == '') or ($_POST['password'] == '')){
$error = 'Inserire nome utente e/o password';
} else{
$conn = mysqli_connect($db_host, $db_user, $db_password, $db_name);

if (!$conn) {
echo "Si è verificato un errore durante la connessione al server MySQL";
exit();
}

$sql = 'SELECT IdUtenti, CONCAT_WS(\' \', Cognome, Utenti.Nome) AS Utente, Livello, Abilitato, ';
$sql .= 'CONCAT_WS(\' - \', CodFiliali, CONCAT_WS(\' \', Filiali.Nome, Citta)) AS Filiale ';
$sql .= 'FROM Utenti INNER JOIN Filiali ON Filiali_CodFiliali = CodFiliali ';
$sql .= 'WHERE Username = \'' . $_POST['username'] . '\' AND Passwd = \'' . $_POST['password'] . '\'';

$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0){
while ($row = mysqli_fetch_assoc($result)){
if ($row["Abilitato"] == 1){
include("default.php");
} else{
$error = 'Utente non abilitato';
}
}
} else{
$error = 'Nome utente e/o password errata';
}
}
if ($error){
include("index.tpl");
}
} else{
include("index.tpl");
}



Questa è la index.php, contentente il codice per autenticarsi all'area privata del sito. Richiamandola per la prima volta, viene visualizzato il contenuto della index.tpl (contenente il codice.html). Inseriti username e password, se l'autenticazione va a buon fine, dev'essere visualizzata la pagina default.php, in caso contrario nuovamente la index.tpl. E' corretto l'uso che ho fatto degli include? O devo cambiare qualcosa?
Grazie :)

loris_p
23-08-2006, 21:35
per fare ciò che desideri devi usare la funzione header, la quale invia headers http al browser..per redirezionare l'utente devi inserire la funzione prima di qualsiasi output altrimenti ti darà errore headers already sent
usando gli include non fai altro che includere del codice, senza redirigere il browser in un'altra pagina..
breve ripasso:
include: include del codice nella pagina nel punto in cui viene invocata la funzione
require: come include solo che se il file non riesce ad essere incluso da errore
header: invia headers http

la funzione come la dovrai usare tu è (al posto degli include):
header("Location: <pagina>");

DigitalKiller
24-08-2006, 10:38
per fare ciò che desideri devi usare la funzione header, la quale invia headers http al browser..per redirezionare l'utente devi inserire la funzione prima di qualsiasi output altrimenti ti darà errore headers already sent
usando gli include non fai altro che includere del codice, senza redirigere il browser in un'altra pagina..
breve ripasso:
include: include del codice nella pagina nel punto in cui viene invocata la funzione
require: come include solo che se il file non riesce ad essere incluso da errore
header: invia headers http

la funzione come la dovrai usare tu è (al posto degli include):
header("Location: <pagina>");

Parli di tutti gli include presenti nel codice che ho postato, o ti riferisci solo a quello relativo all'autenticazione andata a buon fine? :)

loris_p
24-08-2006, 11:06
per tutti i punti in cui dovevi redirigere l'utente o alla pagina stessa o all'altra, quindi qui:
if (mysqli_num_rows($result) > 0){
while ($row = mysqli_fetch_assoc($result)){
if ($row["Abilitato"] == 1){
include("default.php");
} else{
$error = 'Utente non abilitato';
}
}
} else{
$error = 'Nome utente e/o password errata';
}
}
if ($error){
include("index.tpl");
}
} else{
include("index.tpl");
mentre l'include iniziale è giusto..

p.s. tutto il sistema di login comunque non è il massimo, perché sarebbe buona regola creare un file php che controlla che l'utente sia loggato in base alla sessione ed includerlo in ogni pagina protetta..
se un utente scrive direttamente l'indirizzo della pagina post autenticazione adesso riuscirebbe ad accedervi giusto? ;)

DigitalKiller
24-08-2006, 11:20
per tutti i punti in cui dovevi redirigere l'utente o alla pagina stessa o all'altra, quindi qui:
if (mysqli_num_rows($result) > 0){
while ($row = mysqli_fetch_assoc($result)){
if ($row["Abilitato"] == 1){
include("default.php");
} else{
$error = 'Utente non abilitato';
}
}
} else{
$error = 'Nome utente e/o password errata';
}
}
if ($error){
include("index.tpl");
}
} else{
include("index.tpl");
mentre l'include iniziale è giusto..

p.s. tutto il sistema di login comunque non è il massimo, perché sarebbe buona regola creare un file php che controlla che l'utente sia loggato in base alla sessione ed includerlo in ogni pagina protetta..
se un utente scrive direttamente l'indirizzo della pagina post autenticazione adesso riuscirebbe ad accedervi giusto? ;)


La pagina che ti ho postato è solo una prova :)
Comunque, potresti farmi un esempio per essere più chiaro?
Grazie

loris_p
24-08-2006, 11:33
esempio:
if(utente_loggato_correttamente)
header("Location: autenticato.php");
else
header("Location: login.php");

questo è un esempio molto semplice tanto per spiegare come si usa header in questi casi..poi per usare le sessioni è un'altra storia :)

DigitalKiller
24-08-2006, 11:57
esempio:
if(utente_loggato_correttamente)
header("Location: autenticato.php");
else
header("Location: login.php");

questo è un esempio molto semplice tanto per spiegare come si usa header in questi casi..poi per usare le sessioni è un'altra storia :)

Allora avevo capito male quello che avevi scritto :)
Il codice di autenticazione che ho postato è solo una prova ed è incompleto :D
Se l'autenticazione va a buon fine, imposto a true una variabile che memorizzo in una sessione (almeno in jsp facevo così), ed in ogni pagina protetta verifico prima di ogni altra cosa il valore di questa variabile

loris_p
24-08-2006, 14:03
Se l'autenticazione va a buon fine, imposto a true una variabile che memorizzo in una sessione (almeno in jsp facevo così), ed in ogni pagina protetta verifico prima di ogni altra cosa il valore di questa variabile
:eekk: :eekk:
attenzione!! a meno che non sia una cosa importante questa scelta non è sicurissima..soprattutto se la variabile ha un nome tipo logged o cose simili..in questo modo se un utente si logga in un'altro sito che (ironia della sorte) utilizza la stessa variabile risulta loggato anche sul tuo :eek:
la soluzione più sicura è salvare in sessione nome utente e password controllando nel database ogniqualvolta accedi ad una pag protetta tramite il tuo file che includerai ad ogni pagina :cool:

DigitalKiller
24-08-2006, 14:17
:eekk: :eekk:
attenzione!! a meno che non sia una cosa importante questa scelta non è sicurissima..soprattutto se la variabile ha un nome tipo logged o cose simili..in questo modo se un utente si logga in un'altro sito che (ironia della sorte) utilizza la stessa variabile risulta loggato anche sul tuo :eek:
la soluzione più sicura è salvare in sessione nome utente e password controllando nel database ogniqualvolta accedi ad una pag protetta tramite il tuo file che includerai ad ogni pagina :cool:

Cavolo, questa cosa la ignoravo del tutto! In nessun libro di quelli letti (asp, jsp, php) se ne parla!
Quindi, vediamo se ho capito...Visualizzo la pagina di login e ad autenticazione avvenuta, memorizzo in una sessione i dati utente. Quando l'utente richiede pagina_protetta.php con una include richiamo una pagina all'interno della quale controllerò nuovamente i dati di login.
Ho capito bene?
Scusami, ho ancora una domanda su include ed header
Se devo visualizzare i dati di una query non mi conviene utilizzare la include? Spiego meglio. Ho una pagina query.php che legge da un db e mi stampa i record selezionati. Senza passare il controllo ad un'altra pagina, non mi conviene includere query.tpl per visualizzare i risultati?

loris_p
24-08-2006, 14:24
Cavolo, questa cosa la ignoravo del tutto! In nessun libro di quelli letti (asp, jsp, php) se ne parla!
effettivamente non c'è una grande attenzione a questo nella manualistica :(
Quindi, vediamo se ho capito...Visualizzo la pagina di login e ad autenticazione avvenuta, memorizzo in una sessione i dati utente. Quando l'utente richiede pagina_protetta.php con una include richiamo una pagina all'interno della quale controllerò nuovamente i dati di login.
proprio così :D
il tuo script check.php dovrà controllare i dati utente (se arrivano dal form da quello, altrimenti dalle variabili di sessione) e reindirizzare con gli header o alla pagina di login o non fare nulla (infatti se lo script viene incluso all'inizio della pagina e non fa niente perché l'utente è loggato, non ci si accorge di nulla)

p.s. se non è molto chiaro più tardi (perché ce l'ho in un'altra macchina) ti posto lo script responsabile del controllo..
in questo modo sei molto più sicuro nelle autenticazioni e con piccolissime modifiche al file che controlla puoi proteggere le pagine di qualsiasi progetto

edit:
Se devo visualizzare i dati di una query non mi conviene utilizzare la include? Spiego meglio. Ho una pagina query.php che legge da un db e mi stampa i record selezionati. Senza passare il controllo ad un'altra pagina, non mi conviene includere query.tpl per visualizzare i risultati?
assolutamente si :cool:
più rendi il tuo lavoro modulare sfruttando le inclusioni più fatica risparmi e più elegante rimane il codice (se devi fare la stessa tabella in un'altra pagina ti basta includere quel file e non riscrivere il codice ;) )
questo potentissimo strumento è ciò che finalmente ha sconfitto definitivamente i maledettissimi frames :cool: :cool:

DigitalKiller
24-08-2006, 14:38
proprio così :D
il tuo script check.php dovrà controllare i dati utente (se arrivano dal form da quello, altrimenti dalle variabili di sessione) e reindirizzare con gli header o alla pagina di login o non fare nulla (infatti se lo script viene incluso all'inizio della pagina e non fa niente perché l'utente è loggato, non ci si accorge di nulla)

p.s. se non è molto chiaro più tardi (perché ce l'ho in un'altra macchina) ti posto lo script responsabile del controllo..
in questo modo sei molto più sicuro nelle autenticazioni e con piccolissime modifiche al file che controlla puoi proteggere le pagine di qualsiasi progetto


E' tutto chiaro, ma se mi posti il codice mi fai un grande favore. :D A volte è meglio vederle scritte le cose :)


assolutamente si :cool:
più rendi il tuo lavoro modulare sfruttando le inclusioni più fatica risparmi e più elegante rimane il codice (se devi fare la stessa tabella in un'altra pagina ti basta includere quel file e non riscrivere il codice ;) )
questo potentissimo strumento è ciò che finalmente ha sconfitto definitivamente i maledettissimi frames :cool: :cool:

Quindi, in linea di massima devo utilizzare header quando devo passare il controllo ad un'altra pagina (ad esempio nel caso dell'autenticazione), mentre include o require quando devo solo includere del codice particolare (sia php che html necessari per impaginare i risultati di una query, ad esempio).
Confermi tutto? :D

loris_p
24-08-2006, 14:48
E' tutto chiaro, ma se mi posti il codice mi fai un grande favore. A volte è meglio vederle scritte le cose
ok tra un po' te lo faccio avere ;)
Quindi, in linea di massima devo utilizzare header quando devo passare il controllo ad un'altra pagina (ad esempio nel caso dell'autenticazione), mentre include o require quando devo solo includere del codice particolare (sia php che html necessari per impaginare i risultati di una query, ad esempio).
confermo..almeno come utilizzo di base..
va però aggiunto che include e require possono essere usati per includere qualsiasi porzione di codice che pensi potresti dover ripetere, ed header è una funzione che non serve solo al redirect..usata come ti ho detto fa quello, ma ciò che fa in generale è molto più vasto: invia headers http al browser :cool:
se vuoi approfondire l'argomento visita questo link (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html) e vedrai che enorme quantità di headers che puoi inviare (sempre nella forma header("<testo dell'header>");

p.s. per le pagine da proteggere ti consiglio di includere la pagina di controllo con require, non include, poiché è assolutamente indispensabile che ci sia (se non venisse inclusa la pagina protetta risulterebbe visibile :ciapet: )

loris_p
24-08-2006, 15:11
eccomi qui..
allora, questo file è quello che dovrai includere in tutte le pagine che vorrai proteggere con autenticazione :)

<?
session_start();

//caso non loggato
if (!isset($_SESSION['username']) || !isset($_SESSION['password']))
{
//caso tentativo di login effettuato
if (isset($_POST['username']) && isset($_POST['password']))
{
$_SESSION['username']=$_POST['username'];
$_SESSION['password']=$_POST['password'];
}
else
{
session_unset();
session_destroy();
header("Location:http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/login.php");
die();
}
}

//apre connessione al db
$dbsession=mysql_connect("host","user","password")
or die("Connessione al database server non riuscita.<br>");
mysql_select_db("database_name")
or die("Connessione al database non riuscita.<br>");
$query="SELECT realname
FROM amministratori
WHERE username='".$_SESSION['username']."'
AND password='".md5($_SESSION['password'])."';";
$result=mysql_query($query);
mysql_close($dbsession);

if (!($riga=mysql_fetch_array($result)))
{
//caso login errato
session_unset();
session_destroy();
header("Location: http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/login.php?err=1");
die();
}
//caso login corretto
else
{
$_SESSION['realname']=$riga['realname'];
}?>

come vedi la pagina dove ho il form si chiama login.php, la query naturalmente puoi rimpiazzarla con la tua e nota bene: nel controllo post query se l'utente c'è non fa altro che settare anche il nome vero in sessione (se la tua tabella non ce l'ha semplicemente non mettere l'else..io lo uso per fare cose del tipo "buongiorno signor mario rossi"); se invece la query non da risultati distrugge la sessione e reinvia al form, cosa che fa anche se la sessione non è ancora settata.. :cool:

DigitalKiller
24-08-2006, 15:31
eccomi qui..
allora, questo file è quello che dovrai includere in tutte le pagine che vorrai proteggere con autenticazione :)

<?
session_start();

//caso non loggato
if (!isset($_SESSION['username']) || !isset($_SESSION['password']))
{
//caso tentativo di login effettuato
if (isset($_POST['username']) && isset($_POST['password']))
{
$_SESSION['username']=$_POST['username'];
$_SESSION['password']=$_POST['password'];
}
else
{
session_unset();
session_destroy();
header("Location:http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/login.php");
die();
}
}

//apre connessione al db
$dbsession=mysql_connect("host","user","password")
or die("Connessione al database server non riuscita.<br>");
mysql_select_db("database_name")
or die("Connessione al database non riuscita.<br>");
$query="SELECT realname
FROM amministratori
WHERE username='".$_SESSION['username']."'
AND password='".md5($_SESSION['password'])."';";
$result=mysql_query($query);
mysql_close($dbsession);

if (!($riga=mysql_fetch_array($result)))
{
//caso login errato
session_unset();
session_destroy();
header("Location: http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/login.php?err=1");
die();
}
//caso login corretto
else
{
$_SESSION['realname']=$riga['realname'];
}?>

come vedi la pagina dove ho il form si chiama login.php, la query naturalmente puoi rimpiazzarla con la tua e nota bene: nel controllo post query se l'utente c'è non fa altro che settare anche il nome vero in sessione (se la tua tabella non ce l'ha semplicemente non mettere l'else..io lo uso per fare cose del tipo "buongiorno signor mario rossi"); se invece la query non da risultati distrugge la sessione e reinvia al form, cosa che fa anche se la sessione non è ancora settata.. :cool:


Grazie per l'aiuto, sei stato gentilissimo! :)
Solo una domanda. Prima hai scritto che grazie agli include è possibile "eliminare" i frames.
Sai dove posso trovare un esempio a riguardo? Per ora non sono riuscito a trovare nulla :(

loris_p
24-08-2006, 15:39
figurati :)
per quanto riguarda i frames non so indicarti alcun esempio perché non li ho mai usati per principio, ma te ne faccio uno velocissimo:
un classico nell'uso dei frames è la barra laterale con i links..
bene il frame può essere evitato creando una pagina con i soli links, ad esempio una semplice lista

<ul>
<li><a>link1</a></li>
<li><a>link2</a></li>
<li><a>link3</a></li>
</ul>

chiamata links.html ed includerla in ogni pagina, poi con i CSS si sistema il layout :cool:
attenzione: è buona regola dare una controllata al codice prodotto perché se includi pagine che magari hanno già i tag <html> o cose simili la pagina non è validata..per questo io di solito le minipaginette le creo in una cartella include in modo da sapere che ciò che c'è li dentro se incluso non da problemi di validazione ma se usato da solo si (links.html da sola non è una pagina html valida)

DigitalKiller
24-08-2006, 15:45
figurati :)
per quanto riguarda i frames non so indicarti alcun esempio perché non li ho mai usati per principio, ma te ne faccio uno velocissimo:
un classico nell'uso dei frames è la barra laterale con i links..
bene il frame può essere evitato creando una pagina con i soli links, ad esempio una semplice lista

<ul>
<li><a>link1</a></li>
<li><a>link2</a></li>
<li><a>link3</a></li>
</ul>

chiamata links.html ed includerla in ogni pagina, poi con i CSS si sistema il layout :cool:
attenzione: è buona regola dare una controllata al codice prodotto perché se includi pagine che magari hanno già i tag <html> o cose simili la pagina non è validata..per questo io di solito le minipaginette le creo in una cartella include in modo da sapere che ciò che c'è li dentro se incluso non da problemi di validazione ma se usato da solo si (links.html da sola non è una pagina html valida)

Ti ringrazio ugualmente! Farò una ricerca approfondita su google :)
Ciao