Olen tekemässä PHP:llä Antin vieraskirjan pohjalta omalle kotisivulle vieraskirjaa jossa on vastausominaisuus. Siis jokainen käyttäjä voi vastata alkuperäiseen viestiin. Vastattuun viestiin ei voisi vastata ettei tule liian rönsyilevä ketju. Kotisivu on pieni suljettu ryhmä.
Miten tuo kannattaisi viestien osalta järjestellä? Kaikki samaan ketjuun $viestit(viesti) jolloin vastattu viesti talletetaan alkuperäisen viestin jälkeen jolloin ne ovat helposti talletettavissa mutta taulukon uudelleen järjestely vaatii hieman koodaamista. Tuo pitäisi merkitä jotenkin $viestit(viesti)(0 tai 1) jossa 0-viesti ja 1-vastaus. Vai olisiko $viestit(alkuperäinenviesti)(vastattuviesti) parempi järjestys jolloin vastatut ovat omassa ryhmässä? Onko vielä parempaa vaihtoehtoa jolla tuon voisi toteuttaa? MySQL ei ole hallinnassa.
Olen koodannut hyvin vähän joten en osaa enkä tiedä kaikkia vaihtoehtoja.
Yksi vaihtoehto on lisätä toinen tiedosto, johon tulee indeksi|viestin_id|muut_tiedot..., eli viestien aloitusviestit ovat omassa tiedostossaan ja vastaukset toisessa. Voihan ne samaan tiedostoonkin tallentaa, mutta tiedoston rakenteesta tulee kummallinen, koska välillä on viesti ja välillä vastaus.
Jos sinulla on esimerkiksi tiedosto tässä muodossa:
id|lähettäjä|viesti|aika|vastaus (vastaus oletuskena tyhjä)
Tekisin näin: Kun halutaan vastata, haetaan koko tiedosto taulukkoon $viestit = file("tiedosto.txt");
. Viesti johon halutaan vastata, voitaisiin tunnistaa siten, että katsotaan $_GET-taulukosta ID ?id=x
Sitten haet taulukosta ID:n perusteella oikean viestin (Huomaa, että PHP:ssä numerointi alkaa nollasta). Sitten voit parsia explode()
-funktiolla halutun rivin: $rivi = explode("|", $viestit);
. Sen jälkeen saat taulukon:
array( 0 => "id", 1 => "lähettäjä", 2 => "viesti", 3 => "aika", 4 => "vastaus" (tyhjä) );
Nyt voit muuttaa $rivi[]
-nimisestä taulukosta viimeisen sarakkeen (vastaus) haluamaksesi: $rivi[4] = "vastauksesi";
.
Vastauksen näyttäminen:
Kun tulostat viestin, voit tarkistaa strlen()
tai empty()
-funktiolla onko vastausta: if(!empty($viestintiedot[4])). Sitten jos ehto on tosi (true), voit tulostaa vastauksen.
Tässä vielä esimerkit.
viestit.php
<?php // viestit.php $tiedosto = file("tiedosto.txt"); // luo taulukon for($i = 0; $i < sizeof($tiedosto); $i++) { // käydään kaikki viestit läpi // erotellaan viestin tiedot ja tulostetaan $tiedot = explode("|", $tiedosto); echo "<p>" . htmlspecialchars($tiedot[1]) . " (" . date("d.m.Y H:i:s", $tiedot[3]) . ")<br>" . htmlspecialchars($tiedot[3]); // tarkistetaan, onko vastausta if(!empty($tiedot[4])) { echo "<p><b>Vastaus:</b><br>" . htmlspecialchars($tiedot[4]) . "</p>\n"; } echo "</p>\n"; } ?>
vastaus.php
<?php // haetaan id $id = @$_GET["id"]; // jos se on if($id) { // haetaan viestit taulukkoon $viestit = file("tiedosto.txt"); // ko. viesti taulukkoon $rivi = explode("|", $viestit[$id]); // näin voidaan lisätä vastaus // formin jne. toteuttaminen kotiläksynä // lisäksi suojaus, salasana vain adminille! $vastaus = $rivi[4]; $vastaus = "haluamasi vastaus"; } else die; ?>
Niinhän sitä sanotaan että nälkä kasvaa syödessä.
Miten onnistuisi useampi vastaus alkuperäiseen viestiin?
Vastausviestiin ei voisi vastata. Meneekö jo kuinka vaikeaksi?
Jos saat PHP:n puolella luotua haluamasi rakenteen taulukkoon (alla $data), voit tallentaa sen sellaisenaan tiedostoon:
<?php // Tallennus: file_put_contents("data.txt", serialize($data)); // Lataus: $data = unserialize(file_get_contents("data.txt"));
Tämä ei toki ole kovin tehokasta, mutta jos järjestelmä on pieni, huonokin ratkaisu riittää. Jos vastauksia alkaa tulla paljon, voi olla viisaampaa tallentaa jokainen keskustelu omaan tiedostoonsa.
Tai käyttää tietokantaa. MySQL-tietokantaan voit sulloa vastauksia helposti. Voit erotella ne vaikka |-merkillä.
Esimerkkitaulu:
id | lahettaja | aika | viesti | vastaukset |
0 | Macro | 1234567890 | Moikkelis! | [Vastaus=Uolevi]Vastaus Uolevilta[/Vastaus][Vastaus=Pekka]Vastaus Pekalta[/Vastaus] |
Esimerkkitaulukosta voit parsia säännöllisillä lausekkeilla vastaukset omiin muuttujiinsa, ja tulostaa.
Macron ideaa ei ainakaan kannata toteuttaa: jos tietokanta on käytössä, kannattaa saman tien käyttää sitä kunnolla.
id | edellinen_id | viesti |
---|---|---|
1 | NULL | Tämä on aloitusviesti |
2 | 1 | Tämä on vastaus viestiin 1. |
3 | 1 | Tämä on myös vastaus viestiin 1. |
4 | 2 | Tämä on vastaus viestiin 2. |
5 | NULL | Tämä on uusi, itsenäinen aloitusviesti. |
Tiedostojen kanssa tuollainen kikkailu vielä menettelee, kun joutuu kuitenkin kikkailemaan. Itse suosittelen vakavasti serialize-systeemiä tai vaikka JSON-formaattia, jolloin dataa ei tarvitse itse "parsia" mitenkään, vaan luvut ja tekstit saa ladattua täsmälleen samassa muodossa, jossa ne on kirjoitettukin.
Onnistuuko sillai että kaikki muotoilut tallentaisi muuttujaan datan kanssa jolloin echolla voisi tulostaa sen ilman suurempia muotoilukomentoja?
echo $data;
jolloin tulostuisi:
nimi - aika viesti nimi - aika vastausviesti nimi - aika toinen vastausviesti
Laiskana miehenä en viitsi alkaa kokeilemaan vaan kysyn onnistuuko tällainen?
$data=$nimi+$aika+"/n"+$viesti+"/n"+$nimi+$aika+"/n"+$vastausviesti;
siis periaatteessa noin. Ei ole täysin hallinnassa php.
Unohtakaa tuo ylempi viesti, testasin ettei toimi.
Nyt on uusi idea jolla koetan lähestyä ongelmaa.
Jos teen taulukot kaikille tiedoille erikseen näin:
<?php //alkuperäisetviestit $nimet[]; $ajat[]; $viestit[]; //vastausviestit $vastausnimet[$id][$nimi]; $vastausajat[$id][$aika]; $vastaukset[$id][$vastausviesti]; //vastaustaulukot moniulotteisia koska vastausviestejä voi olla useampia ?>
Miten tallennan ja lataan taulukot? Onnistuuko Metabolix:n neuvomalla tavalla jossa käytetään serializea file_put_contents kanssa?
Teen aluksi hyvin yksinkertaisen perustan jotta ymmärrän vielä viikon päästä mitä olen rakentamassa siksi taulukot on erikseen.
Ootko edes kokeillut serializea?
Eli ensimmäiseksi sinun kannattaisi aina testata. Jos ei toimi, niin alat debuggamaan (etsi virhe, lue omaa koodia sisäistäen mitä olet tehnyt, hae virhettä googlella), vasta kun tuntuu, ettei millään (useampi tunti) löydy virhettä, niin ota yhteyttä viisaampiin.
edit:
Itse en kyllä ihan tuommoista rakennetta tekisi, vaan lisäisin nuo ajat, kirjoittamat yms. ihan aina siihen "viestiin", enkä loisi jokaiselle määreelle omaa täysin erillistä taulukkomuuttujaa.
Ennen kuin suunnittelet tallennusta, suunnittele muuttujasi niin, että osaat itse hakea sieltä tiedon. Siis luo tarvittavat muuttujat, lisää muutama kuvitteellinen viesti ja hae ja tulosta sitten näiden viestien tiedot. Kun tämä toimii, voit lisätä tallennuksen ja lataamisen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.