Eli tiedostoon kirjoittaminen inputilla omalla serverillä ei toimi, mutta esim. mbnetin kotisivutilalla toimii.
Tässä on koodi:
Sivu, jolla kirjoitetaan, jossa on input, jonka nimi on T
<html> <body> <form method="POST" action="funktio.php"> <textarea rows="16" name="T" cols="47"></textarea><p></p> <p><input type="submit" value="Submit" name="B1"><input type="reset" value="Reset" name="B2"></p> </form> </body> </html>
Ja tässä sivun (funktio.php), jossa tapahtuu itse tiedostoon kirjoittaminen:
<?php $tt = fopen("base.txt", "w"); fwrite($tt, $T); fclose($tt); ?>
Kun suoritin pelkän kirjoitussivun, johon oli määritetty kirjoitettu itseensä sisältö mitä tiedostoon kirjoitetaan, koko homma toimi, eli ongelma on siinä ettei $T näy enää seuraavalla sivulla. Kokeilin sitä vielä sillä, että funktio.php printtaisi $T:n.
Mistä johtuu ettei tuo omalla serverillä (XAMPP) toimi?
Miten tuo ongelma mahdollisesti voitaisiin korjata / kiertää vastaavanlaisella skriptillä?
Kiitos.
$_POST['T']
Thomas Taussi kirjoitti:
ongelma on siinä ettei $T näy enää seuraavalla sivulla.
[...]
Mistä johtuu ettei tuo omalla serverillä (XAMPP) toimi?
Tuohan johtuu siitä, että PHP:n register_globals-asetus on pois päältä, mitä se oletuksena on, koska se on tietoturvariski.
Oikea tapa menee kuten T.M. sanoi.
Olipas pienestä kiinni :D
Kiitokseni :) Toimii hyvin.
PS. onko php:ssä joku goto-tyylinen uudelleenohjausfunktio?
PHP:ssä ei oo gotoa (jotain muuten kertonee se, että piti tarkistaa :)
Miten muilla nettisivuilla on onnistuttu toteuttamaan uudelleenohjaus? Monimutkaisempi prosessi?
header("Location: keke.php");
Tarkoitatko nyt goto-funktiolla funktiota, jolla voit hypätä koodissa toiselle riville vai siirtyä toiselle www-sivulle?
Mikäli tarkoitat jälkimmäistä, niin käytä funktiota header, esim. header("Location: https://www.ohjelmointiputka.net/");
Header-funktiota kutsuttaessa pitää kuitenkin muistaa, että se pitää suorittaa ennen kuin kutsutaan mitään muuta tulostetta antavaa funktiota.
...tai laitetaan sivun alkuun ob_start(); ja lisätään tuo siirtyminen toiseen kohtaan sivulle.
Short Php kirjoitti:
...tai laitetaan sivun alkuun ob_start()
Ei, vaan suoritetaan ne toiminnot ensin ja tulostetaan vasta sitten. Ob syö ihan turhaa resursseja kun homman voi hoitaa pistämällä järjestelmän uusiksi. Kerralla kuntoon.
tsuriga, koodista vain tulee kaksin kerroin sekavampaa, ja muokattavuus kärsii. En suosittele, vaikka se niin hienolta kuulostaisikin.
T.M. kirjoitti:
tsuriga, koodista vain tulee kaksin kerroin sekavampaa, ja muokattavuus kärsii. En suosittele, vaikka se niin hienolta kuulostaisikin.
Jaa, millähän tavalla muokattavuus kärsii? Päin vastoin se minusta paranee huomattavasti.
Esim includeja käytettäessä täytyy siirtää lomakkeiden virheentarkistukset sille ensimmäiselle includelle (jos aikoo tulostaa virheitä lomakkeen alapuolelle), ja puhumattakaan siitä että pitää tarkistaa miltä sivulta se lomake lähettettiin, jos on monta eri lomaketta eri sivuilla...
Tuossakin on jo tarpeeksi paljon ylimääräistä työtä minulle, jonka takia en moista tekniikkaa ala käyttämään.
Tai sitten kirjottelee koodin esim. luokan sisälle, joka myös selventää varmasti huomattavasti sekä muokattavuutta että luettavuutta yleensä. Varsinaisen tulostuksen voi sitten tehdä vasta lopuksi helposti.
sooda kirjoitti:
Varsinaisen tulostuksen voi sitten tehdä vasta lopuksi helposti.
Eikö tuo toimi kuitenkin samalla periaattella kuin se mitä output buffering tekee? Eli tulostamisen tunkemista muistiin, ja lopuksi vasta tulostaa sen kaiken kerralla? Tätähän tässä juuri haluttiin välttää o_O
Uskoakseni sooda tarkoitti tuossa tulostettavien asioiden tallentamista muuttujiin, jotka sitten vasta lopuksi tulostetaan html:n sekaan, noin suurpiirteisesti muotoiltuna. Näinhän sen suunnilleen pitäisi tapahtua. Eli malli (model) ja näkymä (view) ja näiden välisen kommunikaation hoitaa controller (mikähän lienee tuon virallinen suomennos?). Eli ulkoasu ja logiikka erotetaan selkeästi toisistaan ja tietovarastojen kanssa kommunikointi tapahtuu myös omassa kikkareessaan.
No sama asiahan se sitten on, tallennetaan muuttujiin kaikki tulostettava... output buffering hoitaa saman homman helpommin.
Pointtihan oli tässä nyt lähinnä se toiminnan ja ulkoasun erottelu. Melko loogiselta kuulostaa, että on helpompi löytää etsimäsi pätkä koodia yhdestä osasta tiedostoa, kun mitä jos joutuisit selaamaan koko tiedoston läpi, varsinkin jos projektilla on useita kehittäjiä. Kun puhuin ob:n syövän turhaan resursseja, tarkoitin, että sitä ei tulisi alunperinkään tarvita, jos on käytetty MVC:tä. Oikeasta muistinkulutuksesta vertailussa minulla ei ole tietoa.
Vaan kun ei noita pikkuscriptejä tuollaisiksi kannata alkaa tekemään, tämän aiheen kysyjä ei edes tiennyt miten lomakkeen tiedot haetaan oikein, miten luulisit hänen osaavan rakentaa jotain MVC tyylistä ratkaisua >_<
Jos kyse on oikeasti jostain suuresta projektista, niin sittenhän tuo voisi olla ihan hyvä ratkaisu, mutta mielestäni nuo pikkuscriptit saa kyllä jäädä ihan sille kivikautiselle tasolle mitä ne nyt on, turhaan tehdä asoita yhtään monimutkaisemmin jos siitä ei hyödytä yhtään mitään.
Koodi alkuun, tulostus loppuun, ei oo turhan vaikee. Liian usein näkee niitä poppakonsteja sitten sovellettavan isommissakin projekteissa - jopa sellaisissa, joita myydään sitten tietämättömille asiakkaille. Ja sen verran offtopickia, että jos joku mode jaksas vetästä tälle vaikka uuden aiheen ja siirtää ~10 edellistä viestiä sinne :).
T.M. kirjoitti:
Vaan kun ei noita pikkuscriptejä tuollaisiksi kannata alkaa tekemään, tämän aiheen kysyjä ei edes tiennyt miten lomakkeen tiedot haetaan oikein, miten luulisit hänen osaavan rakentaa jotain MVC tyylistä ratkaisua >_<
Niin MVC-suunnittelumalleja käyttäviä juttuja on monenmoisia valmiina joten niitä ei tarvitse tehdä itse. Vaikkapa http://framework.zend.com/ joka sisältää paljon muutakin, jonkinmoista listaa muista http://www.phpwact.org/php/mvc_frameworks ja noita on todella helppo käyttää.
T.M. kirjoitti:
mutta mielestäni nuo pikkuscriptit saa kyllä jäädä ihan sille kivikautiselle tasolle mitä ne nyt on, turhaan tehdä asoita yhtään monimutkaisemmin jos siitä ei hyödytä yhtään mitään.
Eipä tuo ole monimutkasta kun asiaan paremmin tutustuu. Ja kun pikku scriptit tehdään oliomallin mukaisesti, niin käytännössä on helpompa käyttää jonkinmoista MVC kuin tehdä jollakin kivikautisella tavalla ohjain luokille.
tsuriga kirjoitti:
että sitä ei tulisi alunperinkään tarvita, jos on käytetty MVC:tä.
Asia ei olekkaan ihan noin yksinkertainen. Nimittäin monet valmiit kuten tuo Zendin MVC käyttää juurikin ob_x-functioita.
Opiskelija kirjoitti:
tsuriga kirjoitti:
että sitä ei tulisi alunperinkään tarvita, jos on käytetty MVC:tä.
Asia ei olekkaan ihan noin yksinkertainen. Nimittäin monet valmiit kuten tuo Zendin MVC käyttää juurikin ob_x-functioita.
Voi itku, ja kaikki tämä keskustelu alkoi juuri siitä että ob-funktiota pitäisi välttää kun ne ovat niin resurssisyöppöjä.
Mentiin siis taas ojasta allikkoon, ehdoteltiin erilaisia kehittyneitä järjestelmiä ob-funktioiden kiertämiseksi, mutta kuitenkin ollaan taas samassa tilanteessa :P
tsuriga kirjoitti:
Ob syö ihan turhaa resursseja kun homman voi hoitaa pistämällä järjestelmän uusiksi. Kerralla kuntoon.
Pwnt.
T.M. kirjoitti:
Voi itku, ja kaikki tämä keskustelu alkoi juuri siitä että ob-funktiota pitäisi välttää kun ne ovat niin resurssisyöppöjä.
Niin ob-functioita ei kannata käyttää paikatakseen huonoa suunittelua, eikä muutenkaan turhaan.
T.M. kirjoitti:
Mentiin siis taas ojasta allikkoon, ehdoteltiin erilaisia kehittyneitä järjestelmiä ob-funktioiden kiertämiseksi, mutta kuitenkin ollaan taas samassa tilanteessa :P
Eipäs ollakkaan samassa tilanteessa, vaikka MVC(Malli Näkymä Ohjain) toteutuksessa voidaan käyttää ob-functioita niin ne ovat vasta luokassa joka hallinnoi näkymää, metodissa joka hoitaa tulostuksen ja tuo uudelleen ohjaus hoidetaan ohjaimessa jotenka ob-functioita ei käytetä silloin ollenkaan.
T.M. kirjoitti:
Eikö tuo toimi kuitenkin samalla periaattella kuin se mitä output buffering tekee? Eli tulostamisen tunkemista muistiin, ja lopuksi vasta tulostaa sen kaiken kerralla? Tätähän tässä juuri haluttiin välttää o_O
Sinä tunget ob:hen scriptin suorituksen edetessä HTML/XHTML älämölöä... viet siis turhaa muistia jne.... MVC:tä käytettäessä vastaavasti muistissa on vain tarpeellinen tieto muuttujissa, ei siis mitään XHTML jne... XHTML tulee mukaan vasta tulostus vaiheessa. Ja jos error tulee niin olet laittanut ob:hen turhaa ja joudut tuhoamaan ne error sivun tulostamista varten.
Ja MVC:n pystyy helposti tekemään ilman ob-functioita. Omassani käytän ob-functioita koska niiden avulla saan tulosteen napattua talteen cachetusta varten, sekä templatessa oleva include aiheuttaa hallitun errorin eikä puutteellista sivua.
Toki tuon includetuksen olisi voinut tehdä ohjaimesta käsin jolloin ob-functioita olisi tarvinnut käyttää vain silloin kun cachetusta tarttee. Mutta mielestäni templatessa oleva include on helpompa sekä eikä ohjaimeen tarvitse koskea jos haluaa lisätä jotain includetettavaa.
Hei oikeesti, kyseessä kuitenkin on aloittelija joka juuri ja juuri osaa lomakkeita käyttää oikein. Miettikää vähän.
Tää on niin turhaa pätemistä, kun ruvetaan neuvomaan jotain MVC systeemeitä niille ihmisille joille siitä ei ole mitään hyötyä, saatikka taitoa käyttää niitä oikein.
Kerroin jo yllä, mitä tarkoitin sillä resurssien menemisellä hukkaan - osaat ehkä sen juuri ja juuri itsekin etsiä. Niitä valmiita, helppokäyttöisiä frameworkkeja tosiaan on olemassa. Mieluummin opetan miehen kalastamaan kuin annan hänelle yhen kalan, tiedät varmaan sanonnan.
tsuriga kirjoitti:
Mieluummin opetan miehen kalastamaan kuin annan hänelle yhen kalan, tiedät varmaan sanonnan.
Tässä tapauksessa et tosin opettanut yhtään mitään, vaan heitit vain idean, joka ei sinällään auta ketään. Oisit vaikka kirjoittanut yleispätevän esimerkkikoodin miten hommat pitää oikeasti hoitaa, niin siitä olisi varmasti ollut apua enemmän.
Noita frameworkkeja on sen verran monta, notta parempi kun itse lukee niistä ja päättää sitten, mikä sopii tilanteeseen / itselle. Valmiita esimerkkejä frameworkkeihin löytynee niiden sivuilta. Muistaakseni symfonylla oli ainakin ostoskärrydemo yms. yms. Mainittakoon nyt samaan syssyyn, että allekirjoittanutkin voisi sekä frameworkkeihin, että tuohon ob:hen paremmin, jäänyt viimeaikoina PHP taka-alalle.
Aihe on jo aika vanha, joten et voi enää vastata siihen.