form e db

Scusate ho un problema con queste righe 65-66 di codice della lezione PHP-MYSQL relativa ai form. Ho letto ke sono necessarie per nn reinviare i dati se si fa un refresh..

    $messaggio = urlencode("Inserimento effettuato con successo (ID=$id_inserito)"); 

     header('location: '.$_SERVER['PHP_SELF'].'?msg='.$messaggio); 

...ma qnd invio i dati mi dice:

Warning: Cannot modify header information - headers already sent by (output started at C:\Programmi\Apache Software Foundation\Apache2.2\htdocs\formdb.php:1) in C:\Programmi\Apache Software Foundation\Apache2.2\htdocs\formdb.php on line 66

inviato 9 anni fa
mikkele
X 0 X

probabilmente hai uno spazio o un "a capo" all'inizio dello script PHP. Fa in modo che i primi caratteri del file siano "<?php" e dovresti risolvere il problema.

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Salve ragazzi, anche io mi ritrovo lo stesso problema.... mi dice che alla linea tot l'header e' gia' stato inviato...

Vi posto qualche riga di codice per farvi capire meglio...

<html>
<head><title>Inserimento dati utente</title></head>
<body>
<?php
   if($_POST) {
      inserisci_record();
   }
   else
   {
      mostra_form();
   }
   function inserisci_record() {
      //richiamo il file di configurazione
      require('config.php');   
      //richiamo lo script per la connessione al database
      require('connect.php');
      //recupero i campi di tipo stringa
      $nome = trim($_POST['nome']);
      $email = trim($_POST['email']);
      $messaggio = trim($_POST['messaggio']);
      //verifico se devo eliminare gli slash messi in auto da php 
      if( get_magic_quotes_gpc())
      {
         $nome = stripslashes($nome);
         $email = stripslashes($email);
         $messaggio = stripslashes($messaggio);
      }
      $nome = mysql_real_escape_string($nome);
      $email = mysql_real_escape_string($email);
      $messaggio = mysql_real_escape_string($messaggio);
      //recupero gli altri campi del form
      $sesso = isset($_POST['sesso']) ? intval($_POST['sesso']) : 0;
      $newsletter = isset($_POST['newsletter']) ? 1 : 0;
      $attivita = intval($_POST['attivita']);
      //Verifico la presenza dei campi obbligatori
      if (!$nome)
      {
         $messaggio = urlencode("Non hai inserito il nome<br />\n");
         header('location: ' .$_SERVER['PHP_SELF'].'?msg=' . $messaggio);
         exit();
      }
      //preparo la query
      $query = "INSERT INTO utenti (nome,email,sesso,newsletter,attivita,messaggio) VALUES ('$nome','$email','$sesso','$newsletter','$attivita','$messaggio')";
      //invio la query
      $result = mysql_query($query);
      //controllo l'esito
      if (!$result)
      {
         die("Errore nella query $query: " . mysql_error());
      }
      //recupero l'id autoincrement da MySQL per il nuovo record inserito
      $id_inserito = mysql_insert_id();
      //Chiudo la connessione
      mysql_close();
      $messaggio = urlencode("Inserimento effettuato con successo (ID=$id_inserito)");
      header('location: ' .$_SERVER['PHP_SELF'].'?msg' . $messaggio);
   }

Questa e' tutta la prima parte relativa alla funzione inserisci_record(); ho provato a vedere se ci sono degli a capo di troppo o qualcosa di simile, ma come potrete vedere anche voi nn ci sono...

E questo e' l'errore che mi restituisce:

Connesso con successo!!!
Warning: Cannot modify header information - headers already sent by (output started at /Applications/MAMP/htdocs/ProvePHP/PHP:Mysql/inserimento.php:4) in /Applications/MAMP/htdocs/ProvePHP/PHP:Mysql/inserimento.php on line 56

Vi ringrazio anticipatamente speranzoso di un vostro aiuto!!!

risposto 9 anni fa
Pr0v4
X 0 X

il problema è piuttosto comune: quando si usano funzioni che inviano degli header al browser (come le funzioni header, cookie, ecc.) è importante che lo script non abbia già prodotto dell'output, come avviene con una echo o semplicemente facendo precedere lo script PHP (il tag <?php) da un "a capo" o uno spazio.

Anche un messaggio di errore produce un output quindi causa lo stesso problema.

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Perdona la mia ignoranza... Ma nn ci ho capito molto, ma prima di tornare qua a rompere le scatole ho fatto qualche prova di rito :P

Allora quando mi hai parlato di echo sono andato allo script che ho incluso "connect.php" ed ho commentato la parte

echo "Connesso con successo!!!<br />";

Purtroppo l'errore nn si e' rilevato quello perche' continuava a presentarmi il warning...

Allora visto che mi parlavi di a capo e spazi prima del simbolo di apertura del PHP (<?php) ho tolto tutti i tag html che avevo inserito nella pagina.

A questo punto l'errore nn si e' piu' presentato, ma mi riporta direttamente alla stessa pagina del form, con l'unica differenza che l'URL e' stato modificato da:

http://localhost:8888/ProvePHP/PHP:Mysql/inserimento.php

a

http://localhost:8888/ProvePHP/PHP:Mysql/inserimento.php?msgInserimento+effettuato+con+successo+%28ID%3D8%29

Che a qquanto ho capito dallo script dovrebbe essere il comportamento giusto, no?

Adesso per capire meglio io, avrei bisogno di porvi un'altra domanda.

Quando utilizzo uno script che modifica un header, se voglio strutturare la pagina con un html piu' corretto dovrei operare cosi':

<html>
<head><title>Esperimenti con i DB</title></head>
<body>
<?php
         //incluldo lo script di configurazione
         require('config.php');
         //includo lo script di connessione al DB
         require('connect.php');
         //inserisco lo script del form
         require('inserimento.php');
?>
</body>
</html>

Se ho capito bene questa dovrebbe essere la procedura per far funzionare correttamente uno script che al suo interno ha una funzione header().

O mi sto sbagliando???

risposto 9 anni fa
Pr0v4
modificato 9 anni fa
X 0 X

no, se fai precedere dell'html ad uno script PHP che invia un header riceverai comunque quell'errore. Infatti qualsiasi cosa venga inviata al browser costituisce un output che impedisce il successivo invio di header.

Per essere più chiari forse è il caso di scendere nei dettagli: il server web (Apache) prima di inviare una pagina web al browser trasmette anche delle altre informazioni, dette appunto headers. Queste informazioni hanno diversi scopi, ad esempio in questi header ci sono i cookie. Terminato l'invio degli header il server web invia la pagina web vera e propria, composta normalmente da HTML.

Quand'è che Apache invia gli header? Apache li invia appena prima di inviare la pagina vera e propria, quindi appena prima che uno script PHP produca del contenuto da inviare, oppure appena prima della prima riga HTML presente nel file. Finché non viene prodotto il primo output Apache aspetta ad inviare gli header poiché sa che PHP potrebbe voler aggiungere altri header all'elenco di quelli da inviare. Ad esempio uno script PHP potrebbe voler inviare un header per effettuare il redirect.

Quindi, guardando la questione da un altro punto di vista, uno script PHP può inviare un header fintanto che nessun output sia stato prodotto, poiché in quel caso Apache invia i suoi header e non permette che se ne aggiungano altri.

Come strutturare quindi uno script per aggirare il problema? Due soluzioni:

1) non produrre output prima di aver eseguito tutte le funzioni che generano headers

2) produrre output ma non inviarlo ad Apache. L'output prodotto deve essere "catturato" in un buffer di memoria (attraverso la funzione ob_start()) ed inviato ad Apache solo quando sono stati generati tutti gli headers (con la funzionie ob_end_flush()). Ecco un esempio:

<?php
ob_start(); // <- cattura tutto l'output che verrà prodotto
echo 'output di prova';
?>
<b>HTML di prova</b>
<?php
setcookie("TestCookie", 123); // <- posso inviare un header poiche' nessun output e' stato ancora inviato ad Apache
?>
<u>HTML di prova</u>
<?php
ob_end_flush(); // <- invio ad Apache tutto l'output catturato
?>

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda