Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Tiedostolistaus, haku ja dynamiikka

Sivun loppuun

Thomas Taussi [15.07.2007 15:01:27]

#

Hei! Kuten jotkut jo tietävät ennestään ja kaikki tämän viestin jälkeen, olen vasta-alkaja PHP:n parissa, vaikka tutustuinkin kieleen jo muutama vuosi sitten käyttäen pitkään vain paria komentoa, jotka riittivät tyydyttämään silloiset tarpeeni.

Olen lueskellut esimerkkejä ja oppait niiltä kohdin, joista saattaisi olla apua tämänhetkisessä pikku työssäni, tiedostonlistaajassa, joka erottelee tekstitiedoston rivit omiksi yksiköiksi ruudulle muodostaen taulukon.

Tekstitiedostolle, josta tiedot poimitaan, olen tehnyt myös oman muokkaimen (rivinlisääjän), joka lisää halutut tiedot sisältävän rivin tiedoston loppuun, jonka takia olen myös joutunut laittamaan taulukkotiedostoon säännön, joka järjestää ne rivin alkukirjaimen (tiedoston nimen) mukaan aakkosjärjestykseen.

Tarvistisin vielä toimintoja kyseiselle ohjelmalle:

-Tiedostojen järjesteleminen esim. $julkaisuvuoden ja $lisäämispäivän sekä mahdollisesti $tiedostokoon mukaan. Olen nähnyt, että sellaisia toteutetaan dynaamisilla php-sivuilla, joista en ole löytäyt vähään aikaan kunnon oppaita.

-Tiedostojen järjestely eri sivuille (esim. 25 listattua tiedostoa per sivu) varmaankin samaista dynaamista systeemiä käyttäen.

-Hakukonetoiminto, joka listaa löytyneet tulokset tekemääni tiedostolistaan.


Tiedostolistaimeni lähdekoodi ja toimiva esimerkkisivu( http://koti.mbnet.fi/thauzie/riviedis/katsele2.php )

<?php
//kerätään "filut" taulukkoon
$filut = file("base.txt");

//filut = tiedoston rivit
$filumaara = count($filut);




function aakkoset($a, $b) {
    if (strtolower($a) == strtolower($b)) return 0;
    return (strtolower($a) < strtolower($b)) ? -1 : 1;
}

usort ($filut, "aakkoset");


//Printataan filumäärä
echo "<font size=\"2\" face=\"Verdana\">Listattuna $filumaara tiedostoa.</font><p></p>";

//käydään jokainen filu läpi
for ($i = 0; $i < $filumaara; $i++) {
   //$filut[$i] on merkkijono, joka sisältää viestin $i tiedot
   //pystyviivoilla erotettuna; jaetaan viestit $tiedot-taulukkoon
   $tiedot = explode("|", $filut[$i], 10);

   //erotellaan tiedot omiin muuttujiinsa
   $nimi = $tiedot[0];
   $lisätty = $tiedot[1];
   $urli = $tiedot[2];
   $julkaisija = $tiedot[3];
   $julkaisijan = $tiedot[4];
   $vuosi = $tiedot[5];
   $esittely = $tiedot[6];
   $koko = $tiedot[7];
   $kuva = $tiedot[8];
   $kuvateksti = $tiedot[9];





   echo"</head><body><table border=\"1\" width=\"100%\" id=\"table1\" align=\"top\" style=\"border-collapse: collapse\" bordercolordark=\"#000000\" bordercolorlight=\"#000000\"><tr align=\"top\"><td align=\"top\"><p align=\"center\"><font size=\"2\" face=\"Verdana\"><B>$nimi</b></font> <font size=\"1\" face=\"Verdana\">&nbsp;&nbsp;&nbsp;&nbsp;(Lisätty $lisätty)</font></td></tr><tr><td valign=\"top\"><table border=\"0\" width=\"100%\" id=\"table2\"><tr><td width=\"775\" valign=\"top\"><table border=\"0\" width=\"100%\" id=\"table3\" valign=\"top\"><tr align=\"top\"><td valign=\"top\"><font size=\"2\" face=\"Verdana\">Julkaisija: <b>$julkaisija</b></font></td></tr><tr><td><font size=\"2\" face=\"Verdana\">Julkaisijan kotisivut: </font>";


if (preg_match("/http:/", $julkaisijan) ) echo "<font size=\"2\" face=\"Verdana\"><a href=\"$julkaisijan\"<a><b>$julkaisijan</b></font></a>";
else
   echo "<font size=\"2\" face=\"Verdana\"><i>Ei ole saatavilla</i></font>";






echo "</td></tr><tr><td><font size=\"2\" face=\"Verdana\">Julkaisuvuosi: <b>$vuosi</b></font></td></tr><tr><td><font size=\"2\" face=\"Verdana\"><p>$esittely</font><p>&nbsp;</td></tr><tr><td><font size=\"2\" face=\"Verdana\">Tiedoston koko: $koko</font></td></tr><tr><td><p>
<font size=\"2\" face=\"Verdana\"><a href=\"$urli\"<a>Lataa tästä</a></font></td></tr></table></td><td valign=\"top\"><img src=$kuva><font size=\"2\" face=\"Verdana\"><p align=\"center\">$kuvateksti</td></font> </tr></table></td></tr></table></body></html><p></p>";

}
?>
</body>
</html>

Sitten base.txt josta huomaatte miten tiedot on listattuna:

Tiedoston nimi|päivämäärä kellonaika|tiedoston url|Julkaisija|Julkaisijan kotisivujen url|julkaisuvuosi|Esittelyteksti|tiedostokoko|kuvan url|kuvateksti

Odottaisin kokeneiden kommentteja toteutustavoista, niiden mahdollisuuksista, vinkeistä ja kaikesta muusta mistä en vielä maininnut. Jos joku vaivautuu niin onhan koodikin tervetullutta. Kiitos

Mod. lisäsi kooditagit

Antti Laaksonen [24.07.2007 23:22:31]

#

Thomas Taussi kirjoitti:

Tiedostojen järjesteleminen esim. $julkaisuvuoden ja $lisäämispäivän sekä mahdollisesti $tiedostokoon mukaan.

Tässä on laajennettu vertailufunktio, joka osaa järjestää minkä tahansa kentän mukaan. Ainoa vaatimus on, että taulukossa on merkkijonoja, joissa on pystyviivoilla erotettuja tietoja. Muuttujassa $kohta ilmoitetaan järjestyksen määräävän sarakkeen numero nollasta aloittaen. Muuttujassa $suunta määritetään, onko järjestyssuunta a:sta ö:hön (0) vai ö:stä a:han (1). Esim. kun $kohta on 3 ja $suunta 1, tiedot järjestetään julkaisijan mukaan ö:stä a:han.

function vertailu($a, $b) {
    global $kohta, $suunta;
    $aa = explode("|", strtolower($a));
    $bb = explode("|", strtolower($b));
    if ($aa[$kohta] == $bb[$kohta]) return 0;
    if ($suunta == 0) {
        return ($aa[$kohta] < $bb[$kohta]) ? -1 : 1;
    } else {
        return ($aa[$kohta] < $bb[$kohta]) ? 1 : -1;
    }
}

$kohta = 3;
$suunta = 1;
usort ($filut, "vertailu");

Thomas Taussi kirjoitti:

Tiedostojen järjestely eri sivuille (esim. 25 listattua tiedostoa per sivu) varmaankin samaista dynaamista systeemiä käyttäen.

Tutkipa tätä koodivinkkiä:
https://www.ohjelmointiputka.net/koodivinkit/24487-php-sivutus

Thomas Taussi kirjoitti:

Hakukonetoiminto, joka listaa löytyneet tulokset tekemääni tiedostolistaan.

Tätä sinun pitää vielä selventää. Pitääkö näytettäviä tiedostoja karsia annetun hakusanan mukaan vai mitä?

Thomas Taussi [07.08.2007 21:04:35]

#

Kiitoksia runsaista avuista. Jos ensin ottaisin syyniin tuon listauksen määritelmät. Sain toimimaan, mutta miten $kohtaa voisi vaihtaa tiedoston sisällä, eli dynaamisesti ettei tarvitse tehdä eri sivuja, vaan linkki toteuttaisi funktion ja osoite olisi malliin katso.php?kohta=3

Thomas Taussi [08.08.2007 17:48:47]

#

Oivalsinkin jo heti miten tuon voisi toteuttaa ja niinhän se toimikin. Kokeilen hieman itse sovellella oppimaani jos vaikka saisin ilman apuanne listattujen määrää ja hakukonetta tehtyä.

Thomas Taussi [09.08.2007 12:20:53]

#

Hakujutussa sekä lajittelussa tarvitsisin nyt hieman apua.
Saan vähällä säädöllä säädettyä niin, että vain listaus, jonka nimi vastaa hakusanaan, näytetään. Ilman dynamiikkaa en kuitenkaan usko kovin pitkälle mentävän. Arvelisin, että jotenkin regexeillä saisi laitettua poimintafunktion, joka karsii halutun tiedon funktio.php?numero=2&desimaali=5. Kai tuohon samaan saisi mahtumaan juuri hakukriteerit ja lajittelsäännöt.

Antti Laaksonen [09.08.2007 19:57:11]

#

Mitähän tarkoitat poimintafunktiolla? Jos sivun osoite on "funktio.php?numero=2&desimaali=5", tieto 2 on muuttujassa $_GET['numero'] ja tieto 5 on muuttujassa $_GET['desimaali']. Varmaan tarkoitit muuta, mutta selvennä.

Thomas Taussi [09.08.2007 21:23:26]

#

Kiitos, tuota juuri tarkoitin. Onko jotain muuta mahdollisuutta saada urliin määrittelyjä muuten kuin hyperlinkillä? Header ei suostu oikein toimimaan.

Antti Laaksonen [09.08.2007 23:15:40]

#

Yksi mahdollisuus on tietysti tehdä HTML-lomake, jossa lähetystapa on "get".

Ihan hyvin header-funktio tuntuu toimivan, vaikka osoitteen perässä olisi muuttujia:

<?php
// valitys1.php
header("Location: valitys2.php?abc=123");
?>

<?php
// valitys2.php
echo $_GET['abc'];
?>

Mutta mitä olet oikeastaan tekemässä?

Thomas Taussi [09.08.2007 23:26:31]

#

Uploadaisin ongelmani internettiin, mutta koko höskä on vaihteeksi omalla koneella (käytön aikana serveri).

Headerista se valittaa: Warning: Cannot modify header information - headers already sent by (output started at C:\Program Files\xampp\htdocs\kansio\kts.php:7) in C:\Program Files\xampp\htdocs\kansio\kts.php on line 9

kayttaja-2791 [09.08.2007 23:34:38]

#

Älä tulosta mitään ennenkuin käytät header-funktiota. Lisää aiheesta:
http://pp.kpnet.fi/blaze/codefaq/#headerssent

Haulla myös löytyy aiheesta enemmänkin...

Grez [09.08.2007 23:36:16]

#

Juu tai vaikka Kuhan FAQista http://wiki.mureakuha.com/wiki/FAQ#Mit.C3.A4_tarkoittaa_.27Headers_already_sent.27-virheilmoitus.3F

Thomas Taussi [10.08.2007 19:27:28]

#

Kiitokset, Grez ja JTS. Sain ongelman ratkaistua puskuroimalla. MBnetin serverillä kyseistä ei olisi tarvinut tehdä, mutta haluan pelata varman päälle siltä varalta jos alan pyörittämään omaa serveriä. Seuraavaksi alankin pähkäilemään siinä miten nuo hakutulokset lajitellaan eri sivuille määrästä riippuen. Onhan minulla jonkinlainen tutoriaali. Kiitos Antille.


Sivun alkuun

Vastaus

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

Tietoa sivustosta