Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Vieraskirja

Sivun loppuun

novari [16.04.2010 12:30:53]

#

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.

Teuro [16.04.2010 12:47:36]

#

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.

Macro [17.04.2010 12:49:40]

#

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

novari [19.04.2010 11:03:53]

#

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?

Metabolix [19.04.2010 11:09:57]

#

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.

Macro [19.04.2010 17:59:48]

#

Tai käyttää tietokantaa. MySQL-tietokantaan voit sulloa vastauksia helposti. Voit erotella ne vaikka |-merkillä.

Esimerkkitaulu:

idlahettajaaikaviestivastaukset
0Macro1234567890Moikkelis![Vastaus=Uolevi]Vastaus Uolevilta[/Vastaus][Vastaus=Pekka]Vastaus Pekalta[/Vastaus]

Esimerkkitaulukosta voit parsia säännöllisillä lausekkeilla vastaukset omiin muuttujiinsa, ja tulostaa.

Metabolix [19.04.2010 18:07:59]

#

Macron ideaa ei ainakaan kannata toteuttaa: jos tietokanta on käytössä, kannattaa saman tien käyttää sitä kunnolla.

idedellinen_idviesti
1NULLTämä on aloitusviesti
21Tämä on vastaus viestiin 1.
31Tämä on myös vastaus viestiin 1.
42Tämä on vastaus viestiin 2.
5NULLTä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.

novari [21.04.2010 14:54:29]

#

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.

novari [22.04.2010 12:31:07]

#

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.

Lebe80 [22.04.2010 15:09:21]

#

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.

Metabolix [22.04.2010 15:46:14]

#

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.


Sivun alkuun

Vastaus

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

Tietoa sivustosta