Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2008
    residenza
    Rimini
    Messaggi
    203

    Problema con setcookie > Warning: Cannot modify header information . .

    Ciao a tutti,
    premetto che non so quasi niente di PHP poichè
    me lo sto guardando solo da 3 giorni quindi potrei
    fare domande banalissime o addirittura stupide,
    chiedo scusa in anticipo.

    Ecco il mio problema:
    Ho creato una pagina di nome crea_cookies.php
    contenente solo il seguente codice:
    Codice PHP:
    <html>
        <head>
            <title>Cookies</title>
        </head>
        <body>
            <?php setcookie('test'45time()+(60*60*24*7)); ?>        
        </body>
    </html>
    Il problema è che se richiamo tale pagina il server
    mi restituisce un errore:
    Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\prove\crea_cookies.php:6).
    Mi sono letto un po di articoli qui su HTML.it e in giro
    su Internet ed ho trovato questo codice:
    Codice PHP:
    <?php 
        ob_start
    (); 
    ?>
    che, se piazzato ad inizio pagina prima del TAG <html>,
    permette alla pagina stessa di creare il cookies.
    La mia domanda è questa: perchè a me tocca inserire
    quel codice ad inizio pagina mentre nel video che sto
    guardando l'esempio funziona correttamente anche senza
    quel codice ???
    Forse dipende da qualche settaggio particolare ???
    Nel video usano Mac e WAMP mentre io uso Windows XP e XAMPP.

    Grazie a tutti,

    Ciccio.

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    72
    Prova così e fammi sapere

    <?php setcookie("test", 45, time()+604800); ?>

  3. #3
    Il cookie viene trasmesso dal server al client come header.
    Gli header devono essere inviati prima che qualsiasi contenuto della pagina sia restituito al client, quindi l'esecuzione setcookie va messa prima di qualsiasi output html.

    Questo funziona.

    Codice PHP:
    <?php setcookie('test'45time()+(60*60*24*7)); ?>     
    <html>
        <head>
            <title>Cookies</title>
        </head>
        <body>
        </body>
    </html>
    Questo non funziona.


    Codice PHP:
    <html>
        <head>
            <title>Cookies</title>
        </head>
        <body>
            <?php setcookie('test'45time()+(60*60*24*7)); ?>        
        </body>
    </html>

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2008
    residenza
    Rimini
    Messaggi
    203
    Ciao a tutti,

    @elpepe
    Ho provato il tuo consiglio
    <?php setcookie("test", 45, time()+604800); ?>
    ma non funziona
    Comunque grazie lo stesso;

    @weppos
    Gironzolando in Internet ho trovato esattamente
    quanto da te detto ma non mi rispondeva alla domanda:
    "Perchè a lui nel video funziona senza
    "<?php ob_start(); ?> ???

    Ho trovato che, nell'esempio proposto, il file php.ini
    (a me sconosciuto fino a poche ore fa) aveva questo settaggio:
    output_buffering=4096
    mentre io
    output_buffering = Off

    Potevo risolvere il problema cambiando anche io il
    settaggio nel php.ini ma ho preferito utilizzare
    questo codice:

    Codice PHP:
    <?php 
        ob_start
    ();
    ?>
    <html>
        <head>
            <title>Cookies</title>
        </head>
        <body>
            <?php setcookie('test'45time()+(60*60*24*7)); ?>        
        </body>
    </html>
    <?php 
        ob_end_flush
    ();
    ?>
    Anche se c'è il "lato oscuro della forza" ovvero:

    "This will turn output buffering on. With output buffering the entire PHP script
    will be processed before any output is sent to the client. Thus all the PHP script
    will be aware of all the header changes and it will not send any headers until
    every line has been processed.ob_start() may appear to slow down the loading
    time on server intensive pages, because the client will not be presented with
    any fragment of the page until the page is fully processed
    "

    Per ora mi basta, procedo con lo studio di PHP e vediamo cosa salterà fuori.

    Grazie a tutti per i consigli.

    Ciccio.

  5. #5
    ob_start() è una cache, un buffer. Invece di sputare fuori l'output direttamente al client lo tiene in memoria e lo restituisce a blocchi di N byte dove N è il valore che tu hai specificato nel PHP ini.

    Due considerazioni in merito all'approccio che stai seguendo:

    1. meno mischi logica applicativa e vista meglio è. In altre parole, inserire il setcookie lì nel body è sintatticamente corretto ma tecnicamente errato. E' difficile da seguire (pensa ad un codice compleso), inutile poiché ti porta ad utilizzare decine di workaroud (vedi il buffer) per arrivare ad ottenere un risultato.
    In genere, quando una cosa semplice mostra così tanti problemi... forse è perché stai scegliendo la strada sbagliata.

    2. Limita l'uso del buffer solo se e quando necessario. In questo caso non lo è, rallenti solo l'elaborazione.

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2008
    residenza
    Rimini
    Messaggi
    203
    Ciao a tutti

    Grazie mille della spiegazione weppos. Per il momento
    credo di aver capito poco del tuo ragionamento, non certo poichè
    tu non sia stato chiaro anzi, solo che 4 gg di PHP sono un po pochi
    per poter avere le idee chiare comunque è anche grazie a te e ad
    altri che danno buoni consigli che la strada sembra meno dura.

    Grazie ancora.

    Ciccio.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.