Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Lomakkeen tiedot taulukkoon ja taulukon tulostaminen

Sivun loppuun

Mestar [07.12.2011 22:23:08]

#

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

tsuriga [07.12.2011 22:38:21]

#

Katso syntyvää lähdekoodia, niin huomaat varmaan, mikä tagi tulostuu liian monta kertaa.

Mestar [07.12.2011 22:45:25]

#

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ä...

makumaku [07.12.2011 22:49:18]

#

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ä?

Mestar [07.12.2011 22:54:40]

#

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.

makumaku [07.12.2011 23:01:45]

#

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?

Mestar [07.12.2011 23:07:22]

#

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>

makumaku [07.12.2011 23:13:13]

#

Eli siis tuo uusi lomake on syntynyt korjatulla php-koodilla. Laitappa sitten se uusi php-koodi näkyviin myös.

Mestar [07.12.2011 23:14:25]

#

makumaku kirjoitti:

Eli siis tuo uusi lomake on syntynyt korjatulla php-koodilla. Laitappa sitten se uusi php-koodi näkyviin myös.

<?php
$kentat = $_GET["kentat"];
for($j = 0; $j < $kentat; $j++)
{
echo "<form name='kaverit' method='get' action='labra4-5vastaa.php'>
         <input type='text' name='kaveri' value='' /><br>";
}
echo "<input type='submit' value='Lähetä' /></form>";
?>

makumaku [07.12.2011 23:22:25]

#

Eihän tuo php-koodi muuttunut yhtään? Miten se voi nyt tehdä erilaisen html-koodin? Vai mistä tuo html-koodi on otettu?

Mestar [07.12.2011 23:24:36]

#

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.

makumaku [07.12.2011 23:40:19]

#

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ä.

Mestar [07.12.2011 23:42:43]

#

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ää...

makumaku [07.12.2011 23:48:34]

#

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.

tsuriga [07.12.2011 23:57:36]

#

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.

Mestar [08.12.2011 10:28:22]

#

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!

Mestar [09.12.2011 00:36:31]

#

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

<?php
$kaverit = $_GET[kaveri];
for ($i = 0; $i < count($kaverit); $i++) {
echo $kaverit[$i] . "<br>";
}
?>

makumaku [09.12.2011 06:46:23]

#

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ä.

tsuriga [09.12.2011 14:43:52]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta