Minulla on siis yksinkertainen ongelma yksinkertaisessa ohjelmointitehtävässä.
Tässä tiedostossa haen toisesta tiedostosta annetun luvun, ja näytölle tulostetaan sen verran tekstikenttiä.
Näiden tekstikenttien sisältö pitäisi sijoittaa toisen tiedoston taulukkoon, ja taulukko pitäisi tulostaa näytölle. Onnistuin tässä jo kerran, mutta ikävä kyllä tallensin peruuttamattomasti toimivan koodin päälle, enkä ole parin tunnin taistelusta huolimatta saanut sitä toimimaan uudestaan.
<?php $kentat = $_GET["kentat"]; for($j = 0; $j < $kentat; $j++) { echo "<form name='kaverit' method='get' action='labra4-5vastaa.php'><p> <input type='text' name='kaveri' value='' /></p><p>"; } echo "<input type='submit' value='Lähetä' /></p></form>"; ?>
Yllä olevan sivun tekstikenttien tiedot pitäisi siis vastaanottaa "labra4-5vastaa.php" -tiedoston taulukossa ja ko. taulukko pitäisi tulostaa näytölle.
Tässä "labra4-5vastaa.php" tällä hetkellä. Saan sen tulostamaan ainoastaan viimeisen lomakkeen tekstin.
<?php $kaverit = $_GET["kaveri"]; for ($i = 0; $i < count($kaverit); $i++) { echo $kaverit . "<br>"; } ?>
E: toinen koodipätkä lisätty
Katso syntyvää lähdekoodia, niin huomaat varmaan, mikä tagi tulostuu liian monta kertaa.
tsuriga kirjoitti:
Katso syntyvää lähdekoodia, niin huomaat varmaan, mikä tagi tulostuu liian monta kertaa.
Nyt meni kyllä ohi..? En osaa siis itse sanoa, onko koodissa paljonkin jotain pielessä kun en ole tuon pidemmälle päässyt. Ajattelinkin, että osaisiko/voisiko joku korjata tuon "labra4-5vastaa.php" -tiedoston sellaiseen muotoon, että ymmärtäisin miten se tapahtuu. Juuri nyt en ymmärrä...
Mieti ajatuksella tuota lomaketta. Katso selaimesta millaista html-koodia tuo php tekee.
Ja oletko ihan varma että sait aikaisemmin tämän jo onnistuneesti tehtyä?
makumaku kirjoitti:
Mieti ajatuksella tuota lomaketta. Katso selaimesta millaista html-koodia tuo php tekee.
Ja oletko ihan varma että sait aikaisemmin tämän jo onnistuneesti tehtyä?
Olen kyllä käynyt molemmat tiedostot läpi moneen kertaan, eikä tällä tietotaidolla silmiini osu mitään erikoista. Jotain todella yksinkertaista se onkin varmasti.
Kyllä sain, mutta tiedostojen koodi oli silloin kyllä kummassakin erilainen. Tallensin vahingossa päälle niin, etten saanut kumottua, enkä enää tiedä mitä menin säheltämään.
E: sain sen siis vain yhden kerran tulostamaan jokaisen kentän (3 kpl) allekkain. Kun kokeilin neljällä kentällä niin sain taas vain viimeisen kentän tiedot.
Katsoit siis selaimesta html-koodin joka näytti tältä:
<form name='kaverit' method='get' action='labra4-5vastaa.php'><p> <input type='text' name='kaveri' value='' /></p><p><form name='kaverit' method='get' action='labra4-5vastaa.php'><p> <input type='text' name='kaveri' value='' /></p><p><form name='kaverit' method='get' action='labra4-5vastaa.php'><p> <input type='text' name='kaveri' value='' /></p><p><form name='kaverit' method='get' action='labra4-5vastaa.php'><p> <input type='text' name='kaveri' value='' /></p><p><input type='submit' value='Lähetä' /></p></form>
Onko tuossa kaikki tagit niinkuin olit suunnitellut?
makumaku kirjoitti:
Katsoit siis selaimesta html-koodin joka näytti tältä:
...
Kopioin tuon pätkän vastaavanlaisesta koodista jonka löysin netistä, ja yritin soveltaa sitä omaan tehtävääni. En siis tiedä, lähettääkö lomake tiedot oikein, tai miten lomake toimii for-silmukan kanssa ja miten koodi kuuluu "järjestää" silmukan ympärille. Veikkaukseni on, että tässä toistetaan jotain samaa liian monta kertaa, mutta en tiedä mitä.
Nyt koodi näyttää selaimessa tältä:
<html> <head/> <body> <form name="kaverit" method="get" action="labra4-5vastaa.php"> <input type="text" name="kaveri" value=""/> <br/> <input type="text" name="kaveri" value=""/> <br/> <input type="text" name="kaveri" value=""/> <br/> <input type="text" name="kaveri" value=""/> <br/> <input type="submit" value="Lähetä"/> </form> </body> </html>
Eli siis tuo uusi lomake on syntynyt korjatulla php-koodilla. Laitappa sitten se uusi php-koodi näkyviin myös.
makumaku kirjoitti:
Eli siis tuo uusi lomake on syntynyt korjatulla php-koodilla. Laitappa sitten se uusi php-koodi näkyviin myös.
Eihän tuo php-koodi muuttunut yhtään? Miten se voi nyt tehdä erilaisen html-koodin? Vai mistä tuo html-koodi on otettu?
makumaku kirjoitti:
Eihän tuo php-koodi muuttunut yhtään? Miten se voi nyt tehdä erilaisen html-koodin? Vai mistä tuo html-koodi on otettu?
Vaihdoin <p> tagien tilalle <br>, en muuta.
Hmmm. Eli lisäsit <br> -tagin, ja se näyttää tulostuvan html:ään <br/>.
Tässä vaiheessa tipahdin nyt kärryiltä, ja menen vetelemään sikeitä.
makumaku kirjoitti:
Hmmm. Eli lisäsit <br> -tagin, ja se näyttää tulostuvan html:ään <br/>.
Tässä vaiheessa tipahdin nyt kärryiltä, ja menen vetelemään sikeitä.
Niin siinä näytti käyvän. Ei voi ymmärtää...
Eli jos html:ään tulostuu jotakin muuta kuin mitä tulostat php:llä, niin silloin tietenkin kyseinen html-koodi ei ole syntynyt oletetulla php-koodilla, vaan olet katsonut väärää html-koodia, tai ajanut väärän php-koodit, tai sitten olet tehnyt jotakin muuta epäilyttävää. Kannattaa ensin tarkistaa nuo.
Form-tagihan siellä tulostuu viisi kertaa, mutta suljet sen vain kerran. Sitä ei pidä avatakaan kuin kerran. Lisäksi kentän nimeen pitää lisätä hakasulut, jotta palvelin osaa käsitellä tiedot taulukkona. Kannattaa tutustua johonkin HTML-perusoppaaseen. Tähän hätään en valitettavasti osaa suositella mitään erityistä sivustoa tai kirjaa, mutta ehkäpä Ohjelmointiputkan PHP-oppaasta on apua tulevissa labroissa.
Tuota ajattelin itsekin, mutta muutaman tunnin koodailujen jälkeen eilen illalla olin siinä pisteessä, ettei enää järki kulkenut tai innostusta riittänyt. Ehkäpä nyt saan tuon toimimaan, kiitos!
Tuskin tätä kukaan tarvitsee, mutta sain siis tuon toimimaan kun lisäsin sulut kentän nimeen.
Tekstikenttien lukumäärän pyytäminen:
<html> <form action="labra4-5kentat.php" method="get"> <p>Määrä: <input type="text" name="kentat"></p> <p><input type="submit" value="Tekstikenttiä tästä"></p></form> </html>
Kenttien tulostaminen ja lomake:
<?php $kentat = $_GET["kentat"]; echo "<form name='kaverit[]' method='get' action='labra4-5vastaa.php'>"; for($j = 0; $j < $kentat; $j++) { echo "<input type='text' name='kaveri[]' value='' /><br>"; } echo "<input type='submit' value='Lähetä' /></form>"; ?>
Taulun tulostaminen
Noniin, hyvä.
Kannattaa miettiä että miksi nämä hakasulut ovat jonkin muuttujan (nimen) perässä. Ne on siellä sen vuoksi että kyseinen muuttuja on taulukko, eli muuttuja voi sisältää monta samantyyppistä arvoa. Nyt tälläinen tarvitaan jotta esim 5 eri kaveri-nimeä voidaan välittää eteenpäin, koska on 5 eri input-kenttää tätä varten.
Mutta sinulla on siltikin vain yksi form, ja sen vuoksi formin nimessä (kaverit[]) ei tarvita hakasulkuja. Eli ota nuo hakasulut pois tuosta formin nimestä, muuten tehtävän vastaanottaja voi epäillä ettet tiedä miksi näitä hakasulkuja oikeasti käytetään. Myöskään tuo formin nimen määrittely ei ole johdonmukaista siksi että tekstikenttien pyytämislomakkeelta se puuttuu, mutta nimienkyselylomakkeella se on.
Toinen vaihtoehto olisi ollut antaa jokaiselle input-kentälle eri nimi, esim name='kaveri1', name='kaveri2', jne... Tällöin ei olisi tarvittu hakasulkuja koska input-kenttien nimet olisivat olleet yksilöllisiä.
makumaku kirjoitti:
Toinen vaihtoehto olisi ollut antaa jokaiselle input-kentälle eri nimi, esim name='kaveri1', name='kaveri2', jne...
Olisi voitu jättää ehkä mainitsematta, sillä tämä on paljon huonompi vaihtoehto. Aina kun kyse on tietoryhmästä, on helpompaa ottaa se vastaan suoraan taulukkona.
Mestar, tulostuskoodissasi on pieni fiba: käytät taulukon avaimena vakiota kun tarkoituksesi on käyttää merkkijonoa (vrt. kaveri
vs. 'kaveri'
). PHP kyllä osaa huomauttaa tästä kunhan asetat kehitysympäristösi php.inistä error_reporting
-asetuksen arvoksi E_ALL | E_STRICT
. Lisäksi kiinnittäisin erityistä huomiota koodin sisentämiseen järjestelmällisesti. Tämä auttaa debuggauksessa huomattavasti. Viimeinen huomio liittyy tulostuksiin: kaikkea ei tarvitse tulostaa PHP:n läpi.
Kenttien tulostaminen voisi näyttää esimerkiksi tältä:
<?php $kenttia = isset($_GET['kenttia']) ? (int)$_GET['kenttia']: 0; $i = 0; /** * Lopetustagi tähän ihan vaan erottamaan käsittelykoodi tiedon esittämiseen liittyvästä koodista. * Tähän väliinhän tulee useimmiten sivun aloitustagit ymv. */ ?> <?php if ($kenttia > 0): ?> <form action="labra4-5vastaa.php"> <?php while ($i++ < $kenttia): ?> <input type="text" name="kaveri[]"><br> <?php endwhile; ?> <input type='submit' value='Lähetä'> </form> <?php endif; ?>
HTML:n sisennykseen voi käyttää tinya jos oikeasti näkee sen tarpeelliseksi, nättiä lähdekoodia ei saa muuten tekemälläkään.
Aihe on jo aika vanha, joten et voi enää vastata siihen.