Niih, eli olis haussa semmonen scripti, joka näyttäis 5 uusinta viestiä tämmösessä vieraskirjan tapasessa jutussa.
Viestit on tekstitiedostossa (yks viesti /rivi) ja ne luetaan näin sivuun:
echo "<a href=\"mailto:$email\">$nimi</a>"; echo " " . date("d.m.Y H:i", $aika) . ""; echo "<br><b>Aihe:</b> $aihe"; echo "<br><b>Kuvaus:</b> $viesti <br><br>";
...Jos siitä nyt on apua. Noista olis tarkotus siis saaha 5 uusinta viestiä näkymään toisella sivulla.
Lue tiedosto taulukkoon ja tulosta taulukosta viisi viimeistä riviä, tai miten monta riviä yksi viesti sitten viekin.
Ei onnistu.. =(
Apuja?
Kyllä varmasti onnistuu, kunhan kerrot, mitä kohtaa et osaa. Tiedosto luetaan taulukkoon näin:
$taulukko = file("tiedosto.dat");
Ja alkioiden määrä selvitetään näin:
$alkiot = count($taulukko)
Alkioiden määrästä saat selville suoraan myös viimeisen alkion indeksin, jolloin tiedät missä kohtaa on viimeinen viesti. Sitä edeltävässä alkiossa on sitä edellinen viesti jne.
Hieman apuja:
<?php $filu = file("viekku.txt"); $count = count($filu); for($i=$count-5; $i<$count; $i++) { //tulosta } ?>
EDIT: Kokonaisen minuutin myöhässä.
Mulla on niitä tekstitiedostoja siis kolme, joita pitäs 5 uusinta poimia..
Sen jutun osote on http://www.neitokakadu.net/KAUPPA se ei siis oo vieraskirja vaan vieraskirjan tyylinen kauppasivu. Sieltä siis 5 uusinta ilmoitusta pitäs löytyä. siellä jokaisen eri osion kansiost löytyy ilmoitukset.txt jossa on ne kaikki sen osion ilmoitukset 1kpl/rivi.
Sinulla näyttää olevan aikaleima tallennettuna jokaiseen ilmiotukseen. Nyt vain luet kaikki kolme tiedostoa eri taulukoihin, ja katsot aikaleimojen perusteella viisi uusinta viestiä. En jaksa kirjoittaa koodia, joten tämä jää sinun tehtäväksesi.
Jos jokin yksittäinen asia tuosta tuottaa hankaluuksia niin kysy.
Mainitut tavat eivät ole niitä optioidumpia. Hyvä (paras?) olisi kun uuden ilmoituksen yhteydessä vain generoitaisiin ne 5 uusinta uudestaan johonkin tiedostoon.
JTS, toihan vois olla ihan hyvä juttu!
Mitenkä sen sais tehtyä? itelle ei nyt tule mieleen...
No samalla kun kirjoitat johonkin niistä kolmesta tiedostosta, lisäät saman myös johonkin neljänteen.
<?php $uusimmat = file("uusimmat.txt"); $uusimmat[] = $lisättävä; $f = fopen("uusimmat.txt", "w"); for ($i = 1; $i < 6; $i++) { fwrite($f, $uusimmat[$i]); } fclose($f); ?>
Viimeisellä rivillä siis uusin.
Lisäsin sen tuonne yhen tiedoston koodin sekaan.. taisin laittaa väärin tai jotain, ei kirjottanu mitään.
<?php if (!isset($_POST['nimi'])) { ?> <form action="ilmoita.php" method="post"> Nimi: <br> <input type="text" name="nimi"> <br> Sähköposti: <br> <input type="text" name="email"> <br> Aihe: <br> <input type="text" name="aihe"> <br> Kuvaus: <br> <textarea name="viesti" width="200" height="200"></textarea> <input type="submit" value="Lähetä"> </form> <?php } else { $tiedosto = fopen("ilmoitukset.txt", "a"); $nimi = $_POST['nimi']; $email = $_POST['email']; $aihe = $_POST['aihe']; $viesti = $_POST['viesti']; if (strlen($aihe) <2) { exit ("<H1>aihe on pakollinen!</H1>"); } if (strlen($nimi) <2) { exit ("<H1>nimi on pakollinen!</H1>"); } if (strlen($email) <2) { exit ("<H1>Sähköposti on pakollinen!</H1>"); } if (strlen($viesti) <2) { exit ("<H1>Kuvaus on pakollinen!</H1>"); } $viesti = stripslashes($viesti); $viesti = htmlspecialchars($viesti); $viesti = str_replace("\n", "<br>", $viesti); $aika = time(); $rivi = "$nimi|$email|$aika|$aihe|$viesti\n"; fwrite($tiedosto, $rivi); fclose($tiedosto); $uusimmat = file("../uusimmat.txt"); $uusimmat[] = $lisättävä; $f = fopen("../uusimmat.txt", "w"); for ($i = 1; $i < 6; $i++) { fwrite($f, $rivi[$i]); } fclose($f); header("Location: index.php"); } ?>
Ilmiselvästi $lisättävä = $rivi, ja $uusimmat pitää jättää rauhaan (se ei ole $rivi).
Yritin jotakin, mutten onnistunu.. se kirjotti 4 jotain merkkiä sinne vaan
Jatka yritystä. Jos perusasiat eivät ole hallinnassa tutustu vaikka tähän Putkan oppaaseen. Jos ei auta niin yksinkertaista koodia, tee vaikka toinen tiedosto johon liität sitä oikeaa koodia, yksinkertaistettuna vain. Ei se ohjelmointi aina ole helppoa, tai no yleensä se ei ole helppoa vaan haastavaa. Siksi se onkin niin palkitsevaa.
php opas on tuolt pariin kertaan luettu.
parikyt yritystä oon koittanu, mut ei onnistu :(
Mikä tuossa ylläolevassa koodissa oli vikana? tai mitä kaikkee pitää muuttaa?
- Et määrittele tuota lisättävä muuttujaa misään: $uusimmat[] = $lisättävä;
- Kirjoitat tiedostoon string:ä kirjain kerrallaa: fwrite($f, $rivi[$i]);
Pienillä muutoksilla saat tuon toimimaan, mutta itse tekisin tuo tähän tyyliin:
$uusimmat = file("../uusimmat.txt"); $uusimmat[] = $lisättävä; $f = fopen("../uusimmat.txt", "w"); for ($i = 1; $i < 6; $i++) { fwrite($f, $rivi[$i]); } fclose($f);
Muutetaan muotoon:
// $rivi sisältää uusimman ilmoituksen array_push($uusimmat = file('../uusimmat.txt'), $rivi); $uusimmat = implode('', array_slice($uusimmat, -5)); $f = fopen('../uusimmat.txt', 'w'); fwrite($f, $uusimmat); fclose($f);
Näyttää toimivan. Kiitos!
uusimmat.txt ilmotusten järjestys muuttuu jostai ihme syystä aina välillä.. miks? miten sen saa estettyä?
Miten se muuttuu? Kyllä tuo minulla toimii niin kuin pitäisikin.
Ilmoitusten järjestys. Välillä on kahesta toinen ylempänä ja välillä toinen.
http://www.neitokakadu.net/KAUPPA Siinä näkyy heti 5 uusinta (Niitä ilmpotuksia no kuitenki vasta kaks)
Miten haet ilmoitukset tuohon uusimmat listaan? Eihän tuo antamani koodi liity ilmoitusten näyttämiseen millään tavoin, vaan tarkoitus oli että uusimmat.txt generoidaan uudestaan vain silloin kun lisätään uusi ilmoitus.
Näin:
<?php $viestit = file("uusimmat.txt"); $viestit = array_reverse($viestit); $viestimaara = count($viestit); for ($i = 0; $i < $viestimaara; $i++) { $tiedot = explode("|", $viestit[$i], 5); $nimi = $tiedot[0]; $email = $tiedot[1]; $aika = $tiedot[2]; $aihe = $tiedot[3]; $viesti = $tiedot[4]; echo " <div align=\"center\" class=\"tekstiloota2\">"; echo " <div align=\"left\" class=\"tekstiloota\">"; echo "<a href=\"mailto:$email\">$nimi</a>"; echo " " . date("d.m.Y H:i", $aika) . ""; echo "<br><b>Aihe:</b> $aihe"; echo "<br><b>Kuvaus:</b> $viesti <br><br>"; echo "</div></div><br>"; } ?>
Käytä array_reversen sijasta for-lauseena for($i=count($viestit);$i>0;--$i) { (korjatkaa jos meni väärin). Eikä echon tarvitse alkaa heittomerkeillä tai loppua niihin eli echo " " . date("d.m.Y H:i", $aika) . ""; muotoon echo date(..); Ja virheenkäsittelyhän tuosta puuttuu.
Ei auta. Listasta tulee ihan yhtä sotkua aina välillä, tekstitiedostossa viestit pomppii eri paikkoihin.
Nyt on tämmönen:
http://www.neitokakadu.net/KAUPPA/virhe1.jpg
pitäs olla tämmönen:
http://www.neitokakadu.net/KAUPPA/virhe2.jpg
eli sen saa kyllä kuntoon ku sitä tekstitiedostoo muuttaa, jossa on menny se järjestys ihan sotkuks.. Mut miten sen saa pysymään kunnossa?
Ymmärsinkö nyt ihan oikein - uusimmat.txt:n rivien järjestys muuttuu vaikka et lisää uutta ilmoitusta?
Sulla näyttää olevan HTML-väärin joka saattaa olla syy.
Juu, niin.
Mistä kohti se HTML menee väärin? Äsken ku pikaseen katoin nii en huomannu mitään.
Katoppas vaikka validaattorilla :)
öhm.. Missä tiedostossa se virhe on?
Tontttu kirjoitti:
Ilmoitusten järjestys. Välillä on kahesta toinen ylempänä ja välillä toinen.
http://www.neitokakadu.net/KAUPPA Siinä näkyy heti 5 uusinta (Niitä ilmpotuksia no kuitenki vasta kaks)
Voi luoja, onko meillä php newbie joka on koodaamassa jotain kauppa sovellutusta? Voi tietoturvan kevät.
lapm kirjoitti:
Voi luoja, onko meillä php newbie joka on koodaamassa jotain kauppa sovellutusta? Voi tietoturvan kevät.
Näyttää kyllä ihan pelkältä ilmoituspalstalta. Ja vaikka aloittelija olisikin kyseessä, jostainhan sitä on lähdettävä ja tekemällä oppii.
Ilmoituspalstahan se on. Ja aloittelija oon.
Jotain oon yrittäny tolle tehä, en oo onnistunu saamaan sitä pysymään oikein.
Niin.. apuja?
Validoi koodisi, niin todennäköisesti löydät vian. Lyhemmät rivit helpottaisivat myös ('\n'):
<?php echo " <div align=\"center\" class=\"tekstiloota2\">\n"; echo " <div align=\"left\" class=\"tekstiloota\">\n"; echo "<a href=\"mailto:$email\">$nimi</a>"; echo " " . date("d.m.Y H:i", $aika) . ""; echo "<br><b>Aihe:</b> $aihe\n"; echo "<br><b>Kuvaus:</b> $viesti <br><br>\n"; echo "</div>\n</div><br>"; } ?>
Koitrin tota juttua, tuli vaan punanen teksti "Failed validation".
Muutin tuon lopun, saas nähä et meneeks vielä viestit sekasin..
Aihe on jo aika vanha, joten et voi enää vastata siihen.