Hei,
sain yllättäen tällaisen virhe ilmoituksen?
Warning: Cannot modify header information - headers already sent by (output started at /home/X/domains/X.fi/public_html/wp-content/themes/twentyeleven/varattu.php:7) in /home/X/domains/X.fi/public_html/wp-content/themes/twentyeleven/varattu.php on line 117
---------------------------------------------------------------------------
Eli työvuoron varaaminen onnistuu, mutta käyttäjää ei ohjata jostain syystä Työvuoro varattu ok -sivulle? Ennen homma on toiminut, osaatteko sanoa mitä tuo virheilmoitus tarkoittaa. Harmittaa koska ohjelma livenä ja nyt yht'äkkiä tuli tällaista... kiitos kaikille jotka jaksavat auttaa.
Jos sivulla tulostaa mitään tekstiä niin headeria ei voi käyttää sen jälkeen enään. Eli voit muuttaa uudelleen ohjauksen javascriptillä tehdyksi tai sitten pitää poistaa se aiempi teksin tulostus, mikä tulee ennen sitä redirect-headeria.
Nyt koodi tällainen:
Ehkäpä sinula on jotain (välilyönti, rivinvaihto, BOM-merkki, mitä tahansa) ennen ensimmäistä <? -tagia
Lisäksi näyttää hassulta tuo tyhjä else, mutta se ei toki vaikuta mihinkään.
Joo harmittaa, missä tiedostossa pitää tutkia välilyönnit (varattu.php) vai joku confiq-tiedosto??
Kaikki skriptit, jotka suorituksen tuossa vaiheessa on ladattu. Missään ei saa tulostaa mitään PHP-tagien ulkopuolella eikä myöskään PHP-koodissa.
Yritän keksiä ratkaisua.. miten olla tulostamatta.
<?php /* Template Name: Varattu */ ?> <?php get_header(); ?> <div id="primary"> <div id="content" role="main"> <?php if($_POST['submit'] && isset($_POST['submit'])) { function check_input($value) { // Stripslashes if (get_magic_quotes_gpc()) { $value = stripslashes($value); } // Quote if not a number if (!is_numeric($value)) { $value = "'" . mysql_real_escape_string($value) . "'"; } return $value; } $con = mysql_connect("localhost","x","x"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("x", $con); // Make a safe SQL $tNimi = $_POST['tNimi']; $tPaiva = $_POST['tPaiva']; $tKuukausi = $_POST['tKuukausi']; $tVuosi = $_POST['tVuosi']; $tViikonpaiva = $_POST['tViikonpaiva']; $tAlkaa = $_POST['tAlkaa']; $tLoppuu = $_POST['tLoppuu']; $tSijainti = $_POST['tSijainti']; $tStatus = $_POST['tStatus']; $tTarve = $_POST['tTarve']; $tLisatietoa = $_POST['tLisatietoa']; $tInfo1 = $_POST['tInfo1']; $tInfo2 = $_POST['tInfo2']; $tKartta = $_POST['tKartta']; $tKuva = $_POST['tKuva']; $tyontekijanumero = $_POST['A_Id']; $Tapahtuma_Id = $_POST['T_Id']; $sql_asiakas = "SELECT Sukunimi, Etunimi, Kortinnumero FROM Tyontekija WHERE A_Id = '$_POST[A_Id]'"; if(!$haku = mysql_query($sql_asiakas)) { die('kohta 2 - Could not connect: ' . mysql_error()); } $animi = mysql_fetch_row($haku); $sql_lauseke1 = "SELECT * FROM Tyontekija WHERE A_Id = '$tyontekijanumero'"; $result = mysql_query($sql_lauseke1); $count = mysql_num_rows($result); if(!$count == 1) { die('Tarkista työntekijänumerosi oikeinkirjoitus!' . mysql_error()); } else { $sql_haetietoja = "SELECT tTarve FROM Tapahtuma WHERE T_Id = " . $Tapahtuma_Id . " "; if(!$hae = mysql_query($sql_haetietoja)) { die('kohta 5 - Could not connect: ' . mysql_error()); } else { $tulos = mysql_fetch_row($hae); $sql_haetietoja2 = "SELECT COUNT(Tapahtuma_Id) FROM Varaus WHERE Tapahtuma_Id = " . $Tapahtuma_Id . " "; if(!$hae2 = mysql_query($sql_haetietoja2)) { die('kohta XY - Could not connect: ' . mysql_error()); } else { $tulos2 = mysql_fetch_row($hae2); } if((int) $tulos[0] == $tulos2[0]) { die('TAPAHTUMA ON VARATTU LOPPUUN'); } } } $sql_lauseke2 = "INSERT INTO Varaus (Tapahtuma_Id, Asiakas_Id, varno, date) values('$_POST[T_Id]', '$_POST[A_Id]', '$_POST[varno]', '$_POST[date]')"; if (!mysql_query($sql_lauseke2,$con)) { die('Olet jo varannut työvuoron kyseiseen tapahtumaan!'); } else { } header('Location:http://x.fi/?page_id=46'); die; } mysql_close($con); ?> </div><!-- #content --> </div><!-- #primary --> <?php get_footer(); ?>
Helpoin ratkaisu on kutsua koodin alussa ob_start-funktiota ja koodin lopussa ob_end_flush-funktiota.
Älä myöskään käytä die-funktiota, sillä se lopettaa koodin suorituksen välittömästi, jolloin alaosa jää tulostumatta. Mikäli et jaksa muuttaa koodin rakennetta paljoa, voit laittaa tarkitukset funktioon ja korvata dien returnilla.
kiitos tossu, mutta olen php:ssä vielä aika aloittelija. Eli voitko laittaa hieman koodin alkua.. siis mistä kohtaa aloitan, harmittaa koska koodi toimii muuten ihan oikein ja toimi aikaisemmin kunnes lakkasia toimimasta.
ob_start(); ennen get_header() ja ob_end_flush(); get_footer() jälkeen.
kiitos Macro, mutta ei auttanaut.. pahimmassa tapauksessa kyse on wordpressistä.. se jotenkin haittaa.. tai en tiedä
<?php ob_start(); /* Template Name: Varattu */ ?> <?php get_header(); ?> <div id="primary">
Ei se toimikkaan, jos olet tulostanut jo ennen funktion kutsua. 6. rivi lasketaan tulostukseksi.
JavaScriptillähän tuon saa toimiin jos laitat ton header('Location:http://x.fi/?page_id=46'); tilalle
echo '<script type="text/javascript">window.location.href="http://x.fi/?page_id=46";</script>';
Olisi muuten varmaan hyvä käyttääkkin tuota check_input funktiota. Tällä hetkellähän koodissasi menee suoraan SQL-Injektiot läpi. Tuo check_input funktio tosin näyttää vähän erikoiselta myös. Riittää että käyttäisi pelkästään sitä mysql_real_escape_stringiä. Tuo check_input taitaa rikkoa nuo sql lauseet.
Purkkaviritelmänä nopein taps olisi vain puskuroida tulosteet:
kiitoksia, kiitoksia.. eli jos nyt uskallan sitten kokeilla tuota Synomin ratkaisua, sillä se tuntuu nopeimmalta, kun ohjelma livenä jo..
Jos JS-purkka kiinnostaa, siihen kannattaisi ehkä kirjoittaa kuitenkin location.replace("osoite").
noniin Metabolix, voitko sitten myös suomentaa..
eli millainen koodi ja miksi? Tällä hetkellä tuo Synomin antama koodi sai systeemin toimimaan oikein (kiitos paljon Synomi). Eli ainoa huolenaiheeni on mitä tapahtuu jos ottaa javascriptin pois käytöstä, voiko silloin varata työvuoroa lainkaan.
niin ja jos nyt sitten taas muutan kun toimii, niin pelottaa että taas tuhoan järjestelmän. Mutta Metabolix mielestäni olet aina oikeassa niin siksi kuulisin mielelläni miksi javascript purkkaa kannattaa/ ei kannata käyttää ja miksi sitä pitää nyt muuttaa noin kuin ehdotat. Kiitän taas.. nopeista vastauksista,
..minulle tuollaiset VIRHE-ilmoitukset ovat täyttä myrkkyä eikä googlen kautta hakemani tieto ole lainkaan riittävää eli googlen avulla en löytänyt apua, sen sijaan ohjelmointiputkan koodarit tiesivät taas. kiitos jäbät!!
Javascript on purkkaratkaisu tässä tilanteessa siksi, että se voitaisiin estää tekemällä muu järjestelmä oikein. Nyt kun olet sijoitellut virheilmoituksia ja muita tulosteita ympäri koodia, on ihan mahdoton järjestää asioita toimiviksi ilman tuollaisia purkkaratkaisuja. Käyttöliittymä ja itse järjestelmä kuuluu pitää toisistaan erillään, jottei tälläisiä virheitä sattuisi.
Ilmeisesti käsitit oudosti, että Synovin koodi olisi hyvä ja että minun ehdotukseni olisi purkkaa. Näin ei tietenkään ole, vaan molemmat ovat aivan samanlaista purkkaa. Minun ehdotukseni vain on vähän hienompi purkka.
JS-purkkaa ei koskaan kannata käyttää, kun oikeitakin tapoja on olemassa. Kannattaa opetella koodaamaan ja tehdä koko homma oikein eli poistaa ne tulostukset väärästä paikasta ja käyttää PHP:n header-funktiota, kuten aluksi oli tarkoitus. Hyvässä koodissa pitäisi tehdä aivan kaikki syötteiden käsittely (POST-jutut ja header-jutut) ennen yhtäkään tulostusta eli ennen riviä get_header().
Jos nyt kuitenkin haluat osaamattomuuden takia käyttää JS-purkkaa, kannattaisi käyttää replace-funktiota pelkän href-arvon asettamisen sijaan, jottei tuo hetkellisesti vierailtu sivu turhaan jäisi sivuhistoriaan, johon sen ei ole tarkoitus jäädä. Annoin mielestäni siinä määrin selvän esimerkin, että jos et saa sitä edes googletuksen jälkeen yhdistettyä Synomin aiempaan koodiriviin, unohda koko juttu ja käytä ihan sitä purkkaa, mitä vain itse jotenkuten kykenet. Minusta on ihan turha nähdä minkäänlaista vaivaa noin surkean koodin korjailemiseksi, jos nykyinenkin mielestäsi "toimii".
Hmm.. ymmärrän.
No nyt ja tulevaisuudessa käyn tosiaan ohjelmointiputkan oppaita läpi ja yritän oppia PHP:tä. Saa nähdä tuleeko siitä mitään. Tuo virhe-ilmoitus tuli yllätyksenä, mutta toisaalta on ehkä niin etää jossain vaiheessa koko työnvaraus ohjelma leviää käsiin..
huoh.. yritän parhaani, mutta luultavasti tasolleni liian vaikeita juttuja..
Lisäys:
--------------------------------
...jaa nyt tajusin senkin mistä tuo purkka nimitys tulee, nerokasta
Ihan mielenkiinnosta, miks käytät jotai omia purkka database viritelmiä ja virheiden käsittelyä, kun ilmeisesti teet wordpressin päälle tota?
En oo itte wordpressiä käyttäny vuosiin, mutta nopeella googletuksella:
http://codex.wordpress.org/Class_Reference/wpdb - tietokanta
http://codex.wordpress.org/Class_Reference/
Googlella "wordpress form validation" löytyy kanssa aika paljo juttuu asiasta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.