Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP yhden rivin lukeminen .txt tiedostosta html:n kautta

Sivun loppuun

JML [13.06.2011 13:25:18]

#

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.

-tossu- [13.06.2011 13:43:18]

#

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!";
?>

Lebe80 [13.06.2011 14:20:28]

#

Näyttää muuten ihan semmoiselta projektilta, jossa tietokanta olisi pop.

JML [13.06.2011 14:40:09]

#

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

-tossu- [13.06.2011 14:57:00]

#

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?

JML [13.06.2011 15:19:24]

#

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.

-tossu- [13.06.2011 15:23:34]

#

Oletko ajatellut, että sen numeron tilalle voi laittaa vaikka $_GET ['opiskelija'] ?

Lebe80 [13.06.2011 15:33:45]

#

-tossu-, huomasitko kenties, että JML:llä on alunperinkin ollut $_GET['opiskelija'] eikä kovakoodattu arvo, kuten sinulla...

JML [13.06.2011 15:36:12]

#

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.

-tossu- [13.06.2011 15:43:25]

#

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

JML [13.06.2011 15:57:02]

#

-tossu- on oikeassa. Minun olisi pitänyt tarkastella koodia tarkemmin, ja olen pahoillani siitä. Onneksi kuitenkin ongelma ratkesi. Kiitos!

Olli [13.06.2011 17:25:37]

#

Lebe80 kirjoitti:

Näyttää muuten ihan semmoiselta projektilta, jossa tietokanta olisi pop.

Aloittelijalle tekstitiedosto kelpaa hyvin. Tekstitiedostoillakin saa suht monipuolisia aikaan.

Lebe80 [13.06.2011 17:32:03]

#

Miksi aloittelijalle tekstitiedoston käyttö olisi yhtään helpompaa kuin tietokannan käyttö?

The Alchemist [13.06.2011 17:53:39]

#

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

Olli [13.06.2011 20:44:26]

#

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.

The Alchemist [13.06.2011 22:05:29]

#

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?

Lebe80 [13.06.2011 23:26:58]

#

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.

The Alchemist [14.06.2011 07:56:55]

#

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.


Sivun alkuun

Vastaus

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

Tietoa sivustosta