Loin simppelin .html tiedoston, jossa pyydetään syöttämään opiskelijanumero, jonka jälkeen tulostaa kyseisen opiskelijan tiedot .txt tiedostosta.
.txt tiedosto sisältää tiedot seuraavasti:
1234|Olli Oppilas|1 4321|Outi Opiskelija|0 7364|Antti Ahkera|1
php koodissa on kuitenkin itselläni ongelma tullut vastaan. Olen saanut sen siihen vaiheeseen että se onnistuneesti tulostaa kyseisen oppilaan tiedot, mutta ei osaa tulostaa virheilmoitusta mikäli syöttää väärän opiskelijanumeron. Virheilmoituksessa pitäisi lukea "Opiskelijanumerolla ei löytynyt ketään!". Olen poistanut virheilmoituksen php koodista toistaiseksi.
Mitä olen tehnyt väärin ja miten sen korjaan? Jos ei ole liikaa pyydetty, niin olisiko mahdollista saada ratkaistu osio kokonaisuutenaan eli tulostus tai funktio osio?
php koodi on seuraavanlainen:
<?php $tiedosto = 'opiskelijat.txt'; if (!file_exists($tiedosto)) die('Opiskelijaluetteloa ei löydy!'); $OPPILAAT = lue_oppilaat($tiedosto); $opiskelija = $_GET['opiskelija']; $a = 0; // TULOSTUS foreach ($OPPILAAT as $nro => $oppilas) { while ($opiskelija == $nro and $a<1) { $a = $a + 1; echo "$oppilas[nimi]"; echo "($nro): "; echo "$oppilas[paikalla]"; } } // FUNKTIO function lue_oppilaat($tied) { $oppilaat = array(); // avataan tiedosto lukemista varten $viite = fopen($tied, 'r'); // fgets palauttaa arvon FALSE, jos tiedosto on lopussa while ($rivi = fgets($viite, 1024)) { $rivi = trim($rivi); if ($rivi == '') continue; // jaetaan rivi taulukoksi $rivi = explode('|', trim($rivi)); $opiskelijanumero = $rivi[0]; $nimi = $rivi[1]; $lasna = "ilmoittautunut"; $poissa = "ei ole ilmoittautunut"; $paikalla = $rivi[2]; if($paikalla == 1) { $paikalla = $lasna; } else { $paikalla = $poissa; } // siirretään tiedot tuotetaulukkoon $oppilaat[$opiskelijanumero] = array('nimi' => $nimi, 'paikalla' => $paikalla); } fclose($viite); return $oppilaat; } ?>
Mod. lisäsi kooditagit.
Tuossa koodissa näyttää olevan aika paljon vikoja sekä ihmeellisiä ratkaisuja. Se olisi kuitenkin kannattanut laittaa kooditagien sisään, että sitä olisi helpompi lukea. En ala kommentoimaan sitä sen enempää, mutta tämän koodin pitäisi toimia:
<?php $filu = fopen ("opiskelijat.txt", "r"); $opiskelija = 1234; $loytyy = false; while ($rivi = fgets ($filu)) { list ($nro, $nimi, $paikalla) = explode ("|", trim ($rivi)); if ($nro == $opiskelija) { echo "$nimi ($nro) " . ($paikalla ? "ilmoittautunut" : "ei ole ilmoittautunut"); $loytyy = true; break; } } fclose ($filu); if (!$loytyy) echo "Opiskelijanumerolla ei löytynyt ketään!"; ?>
Näyttää muuten ihan semmoiselta projektilta, jossa tietokanta olisi pop.
joo pahoittelut... olen viellä aika amatööri näissä asioissa. Tuo antamasi koodi ei itselläni ainakaan tulosta mitään virhettä, mikäli syöttää väärän opiskelijanumeron. Muuten hyvä!
JML kirjoitti:
Tuo antamasi koodi ei itselläni ainakaan tulosta mitään virhettä, mikäli syöttää väärän opiskelijanumeron. Muuten hyvä!
Kyllä se minulla antaa virheilmoituksen, jos annan sille väärän opiskelijanumeron. Muokkasitko koodista jotain muuta kuin $opiskelija-muuttujan arvoa?
Joo kyllä se itsellänikin antaa virheen kun vaihdan arvoa php koodissa, mutta se on vääränlainen ratkaisu ongelmaani.
Tarkoituksena oli siis että kun opiskelijat.html sivun kautta syötän opiskelijanumeron tekstikenttään, niin se hakisi sen mukaan opiskelijan tiedot .txt tiedostosta. Huomasin että koodisi on siinä mielessä väärin että olit syöttänyt $opiskelija-muuttujan arvon valmiiksi php koodiin, mikä tarkoitttaa sitä että minun pitäisi manuaalisesti joka kerta vaihtaa arvoa php koodissa nähdäkseni toisen oppilaan tiedot.
Oletko ajatellut, että sen numeron tilalle voi laittaa vaikka $_GET ['opiskelija']
?
-tossu-, huomasitko kenties, että JML:llä on alunperinkin ollut $_GET['opiskelija'] eikä kovakoodattu arvo, kuten sinulla...
no niinpä tietysti :D Tuhannet kiitokset avustasi! Olin taistellut tämän ongelman kanssa jo tovin ja onneksi satuin löytämään tämän sivuston.
Lebe80 kirjoitti:
-tossu-, huomasitko kenties, että JML:llä on alunperinkin ollut $_GET['opiskelija'] eikä kovakoodattu arvo, kuten sinulla...
Siksi en heti tajunnutkaan, miksi koodi ei toimi JML:llä. Oletin, että JML katsoisi koodia edes vähäsen ja tajuaisi vaihtaa numeron tilalle jotain järkevämpää. Numero oli testausta varten, koska en jaksanut siirtää koodia palvelimelle, jossa olisi ollut mahdollista välittää GET-parametrejä, vaan testasin koodia komentorivillä.
-tossu- on oikeassa. Minun olisi pitänyt tarkastella koodia tarkemmin, ja olen pahoillani siitä. Onneksi kuitenkin ongelma ratkesi. Kiitos!
Lebe80 kirjoitti:
Näyttää muuten ihan semmoiselta projektilta, jossa tietokanta olisi pop.
Aloittelijalle tekstitiedosto kelpaa hyvin. Tekstitiedostoillakin saa suht monipuolisia aikaan.
Miksi aloittelijalle tekstitiedoston käyttö olisi yhtään helpompaa kuin tietokannan käyttö?
-tossu- kirjoitti:
Numero oli testausta varten, koska en jaksanut siirtää koodia palvelimelle, jossa olisi ollut mahdollista välittää GET-parametrejä, vaan testasin koodia komentorivillä.
$_GET-taulukko on ihan normaali PHP-muuttuja. Voit siis sijoittaa siihen arvoja ennen varsinaista koodia, jolloin se ajaa saman asian.
Lebe80 kirjoitti:
Miksi aloittelijalle tekstitiedoston käyttö olisi yhtään helpompaa kuin tietokannan käyttö?
Ainakin omasta mielestä tekstitiedosto funktioiden käsittäminen on paljon helpompaa kuin opetella erikseen SQL-syntaksi.
SQL-kyselyiden opettelussa ei ole mitään vaivalloista. Tarvitse kuin osata tavallinen insertti ja select.
INSERT INTO myTable ("tieto1", "tieto2", 3);
SELECT yksi, kaksi, kolme FROM myTable;
Olipas vaikeaa... Montakohan riviä vaatisi samat operaatiot tekstitiedostotietokannalle?
Oon The Alchemistin kanssa samaa mieltä, vaikka nuo pari kyselyä varmaan pelottaa vähääkään kokemattomamman "koodarin" pois aiheesta.
Vaikka tietokantojen käpistely voisi tietämättömästä tuntua täysin oudolta, on niiden käyttö oikeastaan täysin yhtä outoa kuin tiedostojen käpistely (jotka vaatii yleensä vielä lisäksi parsimista). Kun jaksaa käyttää muutaman tunnin tietokantojen sisäistämiseen, niin se kyllä maksaa nopeasti itsensä takaisin webiohjelmoinnissa.
Se, että tietokannoilla pystyy tekemään myös monimutkaisiakin asioita, ei pois sulje sitä, että peruskyselyihin yms. pääsee nopeasti sisälle.
Tietokantojen muokkaamiseen on olemassa myös hyviä työkaluja, joten kaikkia sql-syntakseja ei tarvitse naputella käsin (esim. taulujen luonti/poisto/muokkaus, rivien lisäily/poisto/muokkaus).
Tietokannoissa on kuitenkin paljon enemmän sisäänrakennettuja hyviä puolia, kuin "tyhmässä" tekstitiedostossa.
Tietokannoissa on sekin etu, että ne tavallaan skaalautuvat osaamisen mukaan. Aloittelija voi tehdä hommat vähemmän tehokkaalla tavalla ja silti saada samat tulokset kuin enemmän asioista ymmärtävä harrastelija. Pienissä projekteissa suorituskyvylliset erot eivät vielä ole merkittävät.
Täytyy silti myöntää, että aika epätoivoisiakin viritelmiä on tullut nähtyä myös tietokantojen kanssa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.