Tein PHP -oppaan 6 jakson mukaisen vieraskirjan omaan pohjaani, jossa käytän includeilla sivupohjia.
Kaikki toimii paitsi kirjoitus sivu koodin lopussa oleva header -funktio, jonka pitäis siirtää lukemaan viestei heti kun on oman viesti kirjoittanut. Minulla ei näin kuitenkaan tapahdu vaan tulee seuraavanlainen virheilmoitus:
Warning: Cannot modify header information - headers already sent by (output started at d:\mokkigames\juhan_tekema_yla.php:6) in d:\mokkigames\vieraskirja_kirjoita.php on line 50
eli siis tuo juhan_tekma_yla.php on tuolla vieraskirja_kirjota.php sivun ylhäällä liitettynä include komennolla. Voiko olla mahdollista että include komento sotkee header komennon toimintaa?! Mikä avuksi?
Kiitos Blazelle, minun ei tarvitse kirjoittaa kaikkea uudestaan. http://pp.kpnet.fi/blaze/codefaq/#headerssent. Haku olisi löytänyt näytä Putkasta vaikka kuinka...
Menee kyllä hieman aiheen vierestä, mutta kirjoitanpa silti. Googlesta löytyy vastaus aika moneen kysymykseen. Itsekin olen sen avulla löytänyt vastauksen yhteen jos toiseenkin virheilmoitukseen, ja löytänyt usein jopa erittäinkin tarkkoja vastauksia. Itse ihmettelen, miten niin moni ei heti ensimmäisenä ajattele Googlea vaikkapa Ohjelmointiputkan sijaan. Toki englanti saattaa olla esteenä, mutta sen edes jonkinasteinen osaaminen auttaa jo monessakin ongelmassa. Myös virheilmoitukset ovat usein erittäin selviä, jos niitä hetken miettii. Esim. "parse error" tai vastaava viittaa heti virheeseen koodin syntaksissa, mikä tarkoittaa periaatteessa "kielioppivirhettä".
Vaikeiden sanojen tarkoituksen saa Googlella helposti selville, jos englantia taitaa. Esim. haku 'define: semantic' antaa sanalle "semantic" useamman määritelmän.
Jeps..eli olen ottanut aika paljon selvää tuosta. Jokapuolella vain kielletään tulostamasta mtn ennen headeria, mut nyt niinku käytännössä en ole tätä viel oikein sisäistänyt. Siis niinku pitääkö headeri olla vain ja ainoastaan sivun alussa? vai mitä oikein?
tässä on nyt se sivuni missä on headeri tulostus lopussa...olisi se ihan kiva saada sillein, että kun käyttäjä painaa nappia niin tulee sivulle ilmoitus tyyliin: "Kiitos viestistäsi. Viesti lisätty vieraskirjaan."
<?php include("juhan_tekema_yla.php"); ?> <?php include("menu.php"); ?> <?php //jos nimeä ei ole annettu, näytetään lomake... if (!isset($_POST['nimi'])) { ?> <h1>Viestin lähetys</h1> <form action="vieraskirja_kirjoita.php" method="post"> Nimi: <br> <input type="text" name="nimi"> <br> Sähköposti: <br> <input type="text" name="email"> <br> Viesti: <br> <textarea name="viesti"></textarea> <br> <br> <input type="submit" value="Lähetä"> </form> <?php //...muussa tapauksessa kirjoitetaan viesti tiedostoon } else { //avataan tiedosto append-tilassa: kirjoitetaan tiedoston loppuun $tiedosto = fopen("viestit.txt", "a"); //haetaan lomakkeen kautta tulleet muuttujat $nimi = $_POST['nimi']; $email = $_POST['email']; $viesti = $_POST['viesti']; //poistetaan ylimääräiset kenoviivat (\) $viesti = stripslashes($viesti); //muutetaan rivinvaihdot HTML-muotoon $viesti = str_replace("\n", "<br>", $viesti); //otetaan talteen aika, jolloin viesti lähetettiin $aika = time(); //muodostetaan tiedostoon tallennettava rivi $rivi = "$nimi|$email|$aika|$viesti\n"; //kirjoitetaan rivi tiedostoon fwrite($tiedosto, $rivi); //suljetaan tiedosto fclose($tiedosto); //ohjataan käyttäjä vieraskirjasivulle header("Location: kiitos.php"); } ?> <?php include("juhan_tekema_ala.php"); ?>
Taas pientä toistoa, mutta Metabolix jo antoi sinulle vastauksen: http://pp.kpnet.fi/blaze/codefaq/#headerssent
"Jos edellämainitun neuvon noudattaminen kuitenkin jostain syytä tuntuu kohtuuttoman hankalalta, voi ongelman kiertää puskuroimalla tulostuksen⇒."
Ja tuossa lopussahan on tietysti linkki PHP.netin ohjeisiin: https://www.php.net/manual/fi/function.ob-start.php
Käyttämällä tuota funktiota kaikki teksti menee muistiin ja headerit lähetetään ennen sitä, jolloin niitä voi yrittää lähetellä missä välissä tahansa.
Ennen tuota Header komentoa ei saa tulostaa mitään.
jaa..no jopas on outoa sitten...ku tuo vieraskirja juttu on melkein suoraan kopioitu Ohjelmointiputkan PHP-oppaasta, eli sielläkin sitten tulostetaan jo ennen headeria...
Joten osaisiko joku nyt ystävällisesti sanoa, että mitä teen, jotta saan kiitos viestin tulemaan napin painalluksella?
PS: noista OB-START -jutuista en tajunnut yhtään mtn...mihin pitäis laittaa...mikä teksti pitäis puskuroida jne... :S
https://www.ohjelmointiputka.net/oppaat/opas.
Jos tuosta olet mallia kattonu, niin käväseppä kattomassa uusiksi sitä.
Siellähän se on tehty niin että tuo form-homma mihin syötetään palaute on palaute.php ja taas se missä se palaute käsitellään ja lähetetään on laheta_palaute.php.
Ne headerit on tuossa laheta_palaute.php sivulla ja siinä ei kyllä tulosteta mitään ennen header-komentoa.
belthaxor kirjoitti:
Tein PHP -oppaan 6 jakson mukaisen vieraskirjan omaan pohjaani, jossa käytän includeilla sivupohjia.
Niin kuin tuossa lukee niin en ole katsonut 4 jaksosta. 4 jaksossa käsitellään palaute lomaketta, 6 jaksossa vieraskirjaa.
Katos, ei osaa lukea :) . Jos nyt sitten tarkastellaan sitä oppaan 6 jaksoa niin ei siinäkään mitään tulosteta ennen headeria kun nappia on painettu.
Eli laitat nuo ylä includet tuonne if:n sisään. Samaan malliin ku tuo formi tuossa joo on. ja headerin jälkeen laita exit;
Niin turhalta kun se tuntuukin, en vieläkään laita valmista koodia.
Tai sit laitat ob_start(); komennon heti ekalle riville <?php:n jälkeen ja <?php ob_end_flush(); ?> ihan vikalle riville, niin ongelma korjaantuu...
Vaihtoehtoisesti voisit muuttaa koodia seuraavan laiseksi:
<?php if(isset($_POST['nimi'])){ { //avataan tiedosto append-tilassa: kirjoitetaan tiedoston loppuun $tiedosto = fopen("viestit.txt", "a"); //haetaan lomakkeen kautta tulleet muuttujat $nimi = $_POST['nimi']; $email = $_POST['email']; $viesti = $_POST['viesti']; //poistetaan ylimääräiset kenoviivat (\) $viesti = stripslashes($viesti); //muutetaan rivinvaihdot HTML-muotoon $viesti = str_replace("\n", "<br>", $viesti); //otetaan talteen aika, jolloin viesti lähetettiin $aika = time(); //muodostetaan tiedostoon tallennettava rivi $rivi = "$nimi|$email|$aika|$viesti\n"; //kirjoitetaan rivi tiedostoon fwrite($tiedosto, $rivi); //suljetaan tiedosto fclose($tiedosto); //ohjataan käyttäjä vieraskirjasivulle header("Location: kiitos.php"); } if (!isset($_POST['nimi'])) { include("juhan_tekema_yla.php"); include("menu.php"); ?> <h1>Viestin lähetys</h1> <form action="vieraskirja_kirjoita.php" method="post"> Nimi: <br> <input type="text" name="nimi"> <br> Sähköposti: <br> <input type="text" name="email"> <br> Viesti: <br> <textarea name="viesti"></textarea> <br> <br> <input type="submit" value="Lähetä"> </form> <?php include("juhan_tekema_ala.php"); } ?>
heh...meni mielenkiintoiseksi tämä homma...mutta toimiin saatiin...kiitoksia tuhannesti kaikille vastanneille ja myös niille jotka turhautuivat tällaiseen NOOBIIN! :D
Aihe on jo aika vanha, joten et voi enää vastata siihen.