messaggio di errore header

benfy85

Nuovo Utente
15 Feb 2009
14
0
0
Ciao,
torno a rompere le scatole, ma vorrei finirla con sto php al + presto...
stavo creando dei cookie che contengono dei prodotti e uno che contiene il numero dei prodotti...
PHP:
<?php

session_start();
      
//prendo i valori del form della pagina database.php per creare il cookie
$vino = $_POST["idvino"];
$quant = $_POST["quantita"];
$partita = $_POST["partita"];


//creo una stringa per il cookie 
$a_cookie = $vino."-".$quant."-".$partita; 
$expire = time()+ 86400; //varibile che definisce la scadenza ad un giorno del cookie

?>
<html>
        <head>
          <title>Online Wine Shop</title>
          <link href="default.css" rel="stylesheet" type="text/css" />
        </head>
        <body>
          <div id="header">
            <div id="logo"><a href="index.php"><img src="images/ows.gif" alt="Wine Shop Online"/></a>
            </div>
          <div id="menu">
             <a href="index.php">Home</a>
             <a href="carrello.php">Carrello</a>
             <a href="registra.php">Registrati</a>
             <a href="login.php">Login</a>
             <a href="logout.php">Logout</a>

<?php        if(IsSet($_SESSION['utente'])) 
        {
            echo "<a href=\"logout.php\">Logout</a>
                  <h3>Benvenuto $utente </h3>";
        }      
?>        
          </div>
              </div>
              <div id=\"page\">
              <div id=\"content\">  

<?php
if(isset($_COOKIE["cont"]))     //se esiste il cookie cont
{             
  foreach($_COOKIE as $key => $value)     //scorro i cookie per ottenere quello con chiave + alta
  {
    if(is_numeric($key))      //guardo solo quelli con chiave numerica
    {
      $q = array();   //
      $cok = $value;  //stringa del cookie
      for($j=0; $j<=2; $j++)
      {         
         $pos = strpos($cok, "-");                       //trova la posizione del carattere speciale
         $q[] = substr($cok, 0, $pos);                   //prende la stringa da 0 al carattere speciale e lo mette nell'array
         $cok = substr($cok, $pos+1, strlen($cok));   
      } 
            
      if($q[0]!= $vino)
      {
        $iadd = $_COOKIE["cont"];
        $iadd++;
        setcookie($iadd, $a_cookie, $expire);
        setcookie("cont", $iadd, $expire);    
        echo "<p> Il prodotto e' stato aggiunto correttamente nel carrello. </p>";
      }
      else 
      {
        echo "<p>Il prodotto e' gia' presente nel carrello.</p>";
      }
    }
  } 
}
else 
{
  $iadd = 1;
  setcookie($iadd, $a_cookie, $expire);	
  setcookie("cont", $iadd, $expire);
  echo "<p> Il prodotto e' stato aggiunto correttamente nel carrello. </p>";
}
       
?>
      <p>Se desideri effettuare un'altra ricerca, clicca su: <a href="ricerca.php"><button>Ricerca</button></a></p>
      <p>Altrimenti, se vuoi completare l'ordine, clicca su: <a href="carrello.php"><button>Carrello</button></a></p>
     </div>
     </div>
  </body>
</html>
e questo è il messaggio di errore sulle righe 77 e 78
PHP:
Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\add_prod.php:27) in C:\xampp\htdocs\add_prod.php on line 77
 

Trogo

Utente Attivo
11 Gen 2008
370
0
0
40
Sanremo
L'errore che ti ritorna è abbastanza esplicativo: non è possibile modificare gli HTTP headers dopo aver già iniziato l'output della pagina. La descrizione della funzione setcookie è molto chiara.

In pratica le funzioni riguardanti gli headers (setcookie, header) devono essere richiamate prima di qualunque output, che sia un print, un echo o del codice HTML diretto (come nel tuo caso).

Quindi o sposti la parte dei cookie prima dell'inizio del codice HTML, oppure utilizzi le funzioni per il controllo dell'output.

La prima soluzione è di sicuro la più immediata, ma dare un'occhiata alla seconda possibilità e scoprire una cosa in più non fa certo male.
 

benfy85

Nuovo Utente
15 Feb 2009
14
0
0
ho provato ad usare ob_get_contents come negli esempi, però mi replica l'html 4 volte... come mai?
PHP:
ob_start();
echo "<html>
      <head>
        <meta http-equiv=\"content-type\" content=\"text/html\"; charset=\"utf-8\" />
        <title>Online Wine Shop</title>
        <link href=\"default.css\" rel=\"stylesheet\" type=\"text/css\" />
      </head>

    <body>

 <div id=\"header\">
  	<div id=\"logo\"><a href=\"index.php\"><img src=\"images/ows.gif\" alt=\"Wine Shop Online\"/></a>
    </div>
   		<div id=\"menu\">
       	<a href=\"index.php\">Home</a>
       	<a href=\"carrello.php\">Carrello</a>
        <a href=\"registra.php\">Registrati</a>
        <a href=\"login.php\">Login</a>";

$out1 = ob_get_contents();
 
              if(IsSet($_SESSION['utente'])) 
              {
                  echo "<a href=\"logout.php\">Logout</a>
                        <h3>Benvenuto $utente </h3>";
              }
$out2 = ob_get_contents();  

echo "</div>
 </div>
  <div id=\"page\">
        <div id=\"content\">";
        
$out3 = ob_get_contents(); 

var_dump($out1, $out2, $out3);
tutto questa parte è al posto della parte solo in html.
Gli errori di prima non ci sono +, ma mi replica la pagina 4 volte, con delle scritte "string(560)"..
e oltretutto non so se nell'oggetto posso mettere anche del codice in php come quel controllo dell'utente in sessione..
 

Eliox

Utente Attivo
25 Feb 2005
4.390
3
0
Dopo che utilizzi ob_start() ricordati di richiamare dopo l'output ob_end_clean() in modo da ripulire il flusso dei dati, diversamente questi continuano a risiedere in memoria.

PHP:
<?php
ob_start();
echo 'blah blah blah';
ob_end_clean();
?>