Tästä jutusta tuli mieleeni, että olisi kiva tietää perussyy miksi
https://www.ohjelmointiputka.net/keskustelu/
Kyse on siitä, kun ajax-kutsulla käynnistetään palvelimella php-scripti, joka kaikessa monimutkaisuudessaan alla
<?php $muuttuja='Tämä on paluuteksti'; echo $muuttuja; ?>
Tätä kun tarkistelee palvelimen päässä vaikka tiedostoon kirjoittamalla, on se oikeassa muodossa eli
fwrite($fp, "*".$muuttuja."*".PHP_EOL);
Tulostuu tiedostoon *Tämä on paluuteksti* eli se mitä pitäisi.
Kun selaimen päässä tarkistaa vaikka alertilla saman asian, on Responsetext muodossa
*
Tämä on paluuteksti*
eli eteen on tullut ylimääräinen rivinvaihto.
Mistä tuo tuohon tulee ja miksi?
Onkohan tiedostossa rivinvaihto ennen <?php
-tagia? Jos on, ota se pois.
Tai onko tiedosto tallennettu utf-8 BOM -muodossa? Hyvät editorit osaavat tallentaa tiedoston myös ilman BOM:ia (kaksi ylimääräistä tavua tiedoston alussa).
Funktio:
Ei kyllä tiedoston ekat merkit on <?php ei ennen sitä mitään.
Chiman:
Mistähän tuon löytäisi, kun käytän linuxilla jediä tai millä tuon voisi helpoiten tarkistaa?
Edit: katsoin tiedostoa hexdumpilla ja alku näyttä olevan sen mitä pitää eli
0000000 3f3c 6870 0a70
Vika ei välttämättä ole niissä pätkissä koodia, jotka olet tähän ketjuun kirjoittanut. Ehkä voisit laittaa ne loputkin asiaan vaikuttavat koodit näkyville, niin voisi olla helpompi selvittää vikaa.
Noniin,
Grezin vinkkaamana ajoin virhettä nurkkaa ja tässä se mikä tuon lisärivin aiheuttaa. Vika ei toisaankaan ole tuossa vaan jossakin muualla.
Tämä yhdistelmä siis aiheuttaa eteen rivinvaihdon:
<?php // koodissa require kantayhteydelle require('../kantayhteys.inc'); $lista ='c'; echo $lista; $fp=fopen("/tmp/testi.txt", "a"); fwrite($fp,"**".$lista."**".PHP_EOL); fclose($fp); ?> <?php // kantayhteys.inc $db = pg_connect("dbname=tietokanta user=kayttaja password=xxxxxx"); if (!$db) { echo "Ei loytynyt tietokantaa!"; exit; } ?>
Jos nuo koodit liitetään samaan php-tiedostoon, ongelmaa ei ole eli:
<?php // kantayhteys.inc $db = pg_connect("dbname=tietokanta user=kayttaja password=xxxxxx"); if (!$db) { echo "Ei loytynyt tietokantaa!"; exit; } $lista ='c'; echo $lista; $fp=fopen("/tmp/testi.txt", "a"); fwrite($fp,"**".$lista."**".PHP_EOL); fclose($fp); ?>
ja vielä kun tämän ajamista testasin suoraan päätteen ikkunan php listaa.php, niin siinä toimii aivan samoin!
Ongelma on siis siinä, että requirella haettu osuus aiheuttaa rivinvaihdon - miksi?
Mod. korjasi kooditagit PHP:ksi
Koska includella liitetyn tiedoston lopussa on sulkutagin jälkeen ylimääräinen rivinvaihto, jonka PHP tulostaa sivulle. Ratkaisu: ota sulkutagi ?> pois.
Kiitos taas - on hienoa, että löytyy osaamista ja tietoa.
Ilmeisesti tarkoitat, että kantayhteys.inc olisi näin?
<?php // kantayhteys.inc $db = pg_connect("dbname=tietokanta user=kayttaja password=xxxxxx"); if (!$db) { echo "Ei loytynyt tietokantaa!"; exit; }
Onko tästä jokin haitta tai vaikutus muualle, kun tätä käytetään ehkä sadassa eri paikassa? Millainen on sitten tuon requiren/includen tiedoston oikea formaatti, kun kaikissa esimerkeissä näyttää alkavan <?php ja loppuvan ?>
Vielä tähän samaan:
Jos vaihdan tuon requiren toiseen
<?php require('../virhetaso.inc'); $lista ='c'; echo $lista; $fp=fopen("/tmp/testi.txt", "a"); fwrite($fp,"**".$lista."**".PHP_EOL); fclose($fp); ?> <? // virhetaso.inc error_reporting(8); ?>
Niin tuota rivinvaihtoa ei tule?!
?> kertoo PHP-tulkille, että tästä eteenpäin tiedosto on suoraan tulostettavaa (HTML:ää) seuraavaan <?php-tagiin asti. Tagin jättäminen pois ei siis haittaa mitään, koska tiedoston lopun ei kuulukaan sisältää mitään tulostettavaa. Muita vaikutuksia tällä ei ole.
Ehkä tuon toisen tiedostosi lopussa taas ei ole lainkaan ylimääräistä rivinvaihtoa. Voit tarkistaa asian taas hexdumpilla.
Hitto!
Kyllä käy kateeksi, kun joku tietää mitä etsitään.
Hexdumppihan sen kertoi. Tuon kantapalikan > perässä oli tabulaattori ja sen kun poisti, niin homma selvisi. Johan lakkasi extrarivinvaihdotkin häiritsemästä.
Kiitos taas!
Aihe on jo aika vanha, joten et voi enää vastata siihen.