Alkutilanteen kuvaus: Olen ilman ohjelmointitaitoja onnistunut vääntämään tältä sivustolta ja muualta internetistä löytyneiden koodipalojen avulla systeemin, jonne kirjaudutaan ja siellä voi muokata txt-tiedostoa. Systeemi toimii niin, että kirjautumisen jälkeen on lomake, jonka viestikenttään haetaan txt-tiedosto - muokkauksen jälkeen jatka-nappi tallentaa ja näyttää uuden lomakkeen, joka näyttää saman txt-tiedoston read onlyna. Tässä kohtaa on tallenna-nappi, joka lähettääkin lomakkeen haluttuun sähköpostiin, jolloin ylläpitäjä saa tiedon muokkauksista.
Tätä kansiota, jossa tämän tiedostot ovat, kopioidaan eri asiakkaita varten ja nimetään aina uusiksi. Toisin sanoen olen luonut mieluummin tietokantapohjaan kuuluvan sovelluksen txt-tiedoston ja lomakkeenlähettäjän varaan.
Ongelman kuvaus: Nyt tiedot halutaankin taulukkoon; 50 riviä, joissa jokaisella neljä tietokenttää.
Ajattelin että näkisin kovan vaivan ja muuttaisin systeemini sellaiseksi, että se muokkaisikin 200 txt-tiedostoa (50 riviä x 4 tietokenttää per rivi). Homma tyssäsi kuitenkin niin alkumetreille, että en osaa muuttaa txt-tiedoston avaavaa koodia aukaisemaan useampia kuin yhden tiedoston (jos edes onnistuu?).
Nyt pitäisi siis saada tilalle systeemi, jossa voisi muokata vaikkapa ihan html-sisältöä, että saisi sen taulukon sinne. Tietojen lähetys sähköpostiin pitäisi säilyä, mutta tarvittaessa pelkkä ilmoitus tapahtuneesta muokkauksesta riittä.
Mistä löytyisi koodeja? Mistä alkuun, neuvoja, mitä tahansa mistä on apua. Ja mielellään melko kansantajuisesti - muistakaan, että yritän nyt ensimmäistä kertaa tehdä php:lla jotain, eikä edes perustermit ole hallussa.
Tässä on txt:n avaava koodi:
<? $fn = "tiedosto.txt"; $content = stripslashes($_POST['content']); $fp = fopen($fn,"w") or die ("Virhe tiedoston avaamisessa!"); fputs($fp,$content); fclose($fp) or die ("Virhe tiedoston sulkemisessa!"); echo "<meta http-equiv=\"refresh\" content=\"0; url=varmista.php\" />\n"; ?>
ja tässä on muokkaussivu, joka hakee tuon edellisen koodin sisältävän php-tiedoston:
<form action="processscript.php" method="post"> <textarea rows="25" cols="100" name="content"> <? $fn = "tiedosto.txt"; print htmlspecialchars(implode("",file($fn))); ?> </textarea><br> <input type="submit" value="Jatka"> </form>
Löytyykö neuvoja vai yritänkö aloittaa turhan hankalalla hommalla taitoihin nähden?
Jos PHP5-tuki löytyy niin file_get_contents ja file_put_contents funktiot ovat paljon kätevämpiä tuossa käyttötarkoituksessa.
Edits: Tässä nyt jonkinmoinen pikku esimerkki miten tommosen sais tehtyä (jos ny hokasin mikä oli ropleema :P).
<?php $files = array("foobar.txt", "foo.txt", "bar.txt"); // Lomakkeen käsittely if($_POST['content']){ // Foreachilla mennään läpi kaikki saadut tulokset foreach($_POST['content'] as $key => $data){ $data = stripslashes($data); file_put_contents($files[$key], $data); } echo "<h3>Tallennettu!</h3>"; } // Lomake echo "<form action=\"?\" method=\"post\">"; // Foreachilla läpi kaikki tiedostot foreach($files as $filename){ echo "<textarea rows=\"12\" cols=\"100\" name=\"content[]\">"; if(file_exists($filename)) echo htmlspecialchars(file_get_contents($filename)); echo "</textarea><br />"; } echo "<input type=\"submit\" value=\"Tallenna\" />"; echo "</form>"; ?>
200 tekstitiedoston linjalle ei missään tapauksessa kannata lähteä.
JavaScriptilla olisi mahdollista tehdä todella tyylikkäitä ja näppäriä ratkaisuja, ja myös PHP:llä pystyy vaikka mihin. Nämä kuitenkin vaativat jonkin verran ohjelmointia. Viestistäsi sain kuvan, että mieluiten pääsisit melko helpolla, joten ehdotan vain yhtä yksinkertaista menetelmää:
Jos jollain merkillä (esim pystyviivalla "|") ei ole käyttöä itse datassa, voit käyttää sitä erottimena. Taulukko tallennettaisiin siis näin:
rivi 1, sarake 1|rivi1, sarake 2|3|4 rivi 2, sarake 1|...|.|.
Asiakas osannee itsekin kirjoittaa tekstikentän tässä muodossa, jos ohjeet ovat selkeät. Erottimeksi kelpaa myös muu merkki tai pidempi teksti ("##", "<VAIHTO>"). Erotinmerkintä ei voi esiintyä muualla tekstissä!
Datan saa helposti HTML-taulukoksi näin:
<?php echo "<table>\n"; // Käydään tiedoston rivit läpi. foreach (file("tiedosto.txt") as $rivi) { echo "<tr>"; // Katkotaan rivi erottimen "|" kohdalta ja käydään sarakkeet läpi. foreach (explode("|", $rivi) as $sarake) { // Tulostetaan sarakkeen sisältö turvallisesti tekstimuodossa. echo "<td>", htmlspecialchars($sarake), "</td>"; } echo "</tr>\n"; } echo "</table>\n";
Jos kuitenkin haluat, että asiakas saa syöttää tiedot vapaasti 50×4 erilliseen tekstilaatikkoon, voit nimetä laatikot tähän tapaan: laatikko[37][2]. Laatikot voi tulostaa PHP:llä, ja myös lähetetyn datan saa helposti luettua, koska laatikot tulevat $_POST-taulukkoon erillisinä, esimerkiksi $_POST['laatikko'][37][2]. Voit sitten enkoodata datan tiedostoon haluamallasi tavalla; yksi mahdollisuus on käyttää PHP:n funkiota serialize ja purettaessa funktiota unserialize; näillä saa minkä tahansa PHP:n muuttujan (myös taulukon) tallennusta varten tekstiksi ja luettaessa takaisin alkuperäiseen muotoonsa.
htmlspecialchars -> strip_tags
peg: Keksi yksikin perustelu. Tässä tilanteessa juuri htmlspecialchars toimii oikein ja strip_tags ehdottomasti väärin. Kuvitellaanpa vaikka, että asiakas haluaa kirjoittaa tekstin "a<b mutta c>d" – miten onnistuu?
Käytännössä strip_tags-funktio on hyödyllinen vain silloin, kun on todella tarkoitus poimia HTML- tai XML-koodin seasta oikea teksti. Jos taas on vain tarkoitus estää HTML-koodin kirjoittaminen, htmlspecialchars on oikea funktio.
Tuo Metabolixin ehdotus kuulostaa paremmalta, vaikkakin saatan joutua käyttämään tuota temu92:n ratkaisua jos en saa muuten toimimaan.
Jos käytän alkuperäistä tallennussysteemiä tuon kanssa:
<form action="processscript.php" method="post"> <?php echo "<table border=\"1\" align=\"center\">\n"; // Käydään tiedoston rivit läpi. foreach (file("tiedosto.txt") as $rivi) { echo "<tr>"; // Katkotaan rivi erottimen "##" kohdalta ja käydään sarakkeet läpi. foreach (explode("##", $rivi) as $sarake) { // Tulostetaan sarakkeen sisältö turvallisesti tekstimuodossa. echo "<td align=\"left\" width=\"200\" valign=\"top\">", htmlspecialchars($sarake), "</td>"; } echo "</tr>\n"; } echo "</table>\n"; <textarea rows=\"25\" cols=\"100\" name=\"content\"> $fn = "tiedosto.txt"; print htmlspecialchars(implode("",file($fn))); ?> </textarea><br> <input type="submit" value="Jatka"> </form>
Niin ensimmäinen ongelma joka tulee vastaan on se, että jokainen tallennus lisää tyhjän rivin txt-tiedoston loppuun, joka sitten lisää vastaavasti tyhjiä rivejä taulukkoon.
Toinen ongelma on, että tarvitsisin koodiesimerkin, että miten tämä tehdään käytännössä:
Metabolix kirjoitti:
Jos kuitenkin haluat, että asiakas saa syöttää tiedot vapaasti 50×4 erilliseen tekstilaatikkoon, voit nimetä laatikot tähän tapaan: laatikko[37][2]. Laatikot voi tulostaa PHP:llä, ja myös lähetetyn datan saa helposti luettua, koska laatikot tulevat $_POST-taulukkoon erillisinä, esimerkiksi $_POST['laatikko'][37][2]. Voit sitten enkoodata datan tiedostoon haluamallasi tavalla; yksi mahdollisuus on käyttää PHP:n funkiota serialize ja purettaessa funktiota unserialize; näillä saa minkä tahansa PHP:n muuttujan (myös taulukon) tallennusta varten tekstiksi ja luettaessa takaisin alkuperäiseen muotoonsa.
Mutta hyviä neuvoja on tullut, alkaa jo ahistus helpottaa kun huomaa, että saa tämän nyt ylipäätään itse tehtyä :-)
Lisää stripslashes-funktion ympärille vielä trim-funktio, joka poistaa tekstin alusta ja lopusta ylimääräiset rivinvaihdot ja välilyönnit.
Tän voi varmaan laittaa jotenkin nätimminkin:
{ $content = trim($_POST['content']); $content = stripslashes($_POST['content']); $content = trim($_POST['content']); }
...mutta se näyttäis ainakin toimivan näinkin.
Miten noi laatikot sitten merkitään jos niistä haluaa erilliset laatikot?
<input name="laatikko[37][2]" type="text" value="<?php include("laatikko[37][2]"); ?>" />
Siis tuskinpa vain näin, mutta kun textfieldin pitäis avatessa näyttää edellisen kerran tallennettu data niin jotenkin se pitää saada valueksi.
Ylipäätään en vielä hoksannut sitäkään, että miten noi laitetaan tohon koodiin. Jotenkin näinkö:
<? $fn = "tiedosto.txt"; { $content = trim($_POST['content']); $content = stripslashes($_POST['content']); $content = trim($_POST['content']); } $_POST['laatikko'][37][1] $_POST['laatikko'][37][2] $_POST['laatikko'][37][3] $_POST['laatikko'][37][4] $fp = fopen($fn,"w") or die ("Virhe tiedoston avaamisessa!"); fputs($fp,$content); fclose($fp) or die ("Virhe tiedoston sulkemisessa!"); echo "<meta http-equiv=\"refresh\" content=\"0; url=varmista.php\" />\n"; ?>
(Edit: nuo post-laatikko -rivit siis varmaan ainakin pari riviä alemmas kohdan jälkeen, jossa tiedosto on ensin avattu.)
Ja sitten tuolla mallilla loputkin rivit - elikkäs tuossa olis sitten rivin 37 neljä eri textboksia?
<?php $content = trim(striplslashes($_POST["content"]));
Kiitos MIB.
Nyt tuli lisäksi uusi ongelma. Olin ottanut koodista kirjautumisen pois näiden kehitysten ajaksi ja nyt kun lisäsin sen takaisin niin saan tällaisia virheilmoituksia:
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent
Ja tässä on siis tuo salasanakoodi, jonka rivistä 3 (session start) tulee herja:
<?php //aloitetaan sessionit session_start(); //asetukset $tiedosto = "userit.txt"; //tiedosto jossa tiedot usereista $tarkastus = "tarkista.php"; //TÄMÄ tiedosto $etusivu = "userfilu.php"; //sivu jonne mennään kirjautumisen jälkeen //jos tiedostoa ei ole, tehdään se if(!file_exists($tiedosto)) { touch($tiedosto); chmod($tiedosto, "0766"); } $data = file($tiedosto); $userit = array(); //kerätään tiedot usereista for ($i=0; $i<count($data); $i++) { $entry = explode("|", $data[$i]); $userit[$i] = $entry[0]; } //tietojen siistimistä varten function clean ($string) { $string = str_replace("|", "", $string); $string = strip_tags($string); $string = ereg_replace("\n", "", $string); return strtolower($string); } //jollei olla sisällä näytetään kirjautumislomake if (empty($_SESSION["sess_tunnus"]) || $_SESSION["sess_iposoite"] != $_SERVER["REMOTE_ADDR"]) { $tunnus = clean($_POST["tunnus"]); $email = clean($_POST["email"]); $salasana = clean($_POST["salasana"]); $salasana2 = clean($_POST["salasana2"]); //kirjautuminen if (isset($_POST["kirjaudu"])) { if (in_array($tunnus, $userit) != "") { $entry = explode("|", $data[array_search($tunnus, $userit)]); if ($entry[2] == md5($salasana)) { //sessionit kuntoon session_register("sess_tunnus"); $_SESSION["sess_tunnus"] = $tunnus; session_register("sess_iposoite"); $_SESSION["sess_iposoite"] = $_SERVER["REMOTE_ADDR"]; echo "<center><br><br><br><br><b>Kirjauduit sisään!</b><br>\n"; echo "Jatka klikkaamalla <a href=\"index.php\">tästä</a>.</center>"; } else { echo "<center><br><br><br><br><b>Virheellinen salasana.</b><br>\n"; echo "Voit kirjautua uudelleen klikkaamalla <a href=\"". $tarkastus ."\">tästä</a>.</center>"; } } else { echo "<center><br><br><br><br><b>Tunnusta \"<i>". $tunnus ."</i>\" ei löydy.</b><br>\n"; echo "Voit kirjautua uudelleen klikkaamalla <a href=\"". $tarkastus ."\">tästä</a>.</center>"; } } //rekisteröityminen elseif (isset($_POST["rekisteroidy"])) { if (in_array($tunnus, $userit) == $null) { if ($salasana == $salasana2) { if (strlen($tunnus) >= 3) { if (strlen($salasana) >= 3) { $fo = fopen($tiedosto, "a"); flock($fo, 2); //lukitaan tiedosto fwrite($fo, $tunnus ."|". $email ."|". md5($salasana) ."|\n"); flock($fo, 3); //ja vapautetaan se fclose($fo); echo "<b>Kiitos rekisteröitymisestäsi!</b><br>\n"; echo "Voit nyt kirjautua sisään <a href=\"". $tarkastus ."\">tästä</a>."; } else { echo "<b>Epäkelpo salasana.</b><br>\n"; } } else { echo "<b>Epäkelpo tunnus \"<i>". $tunnus ."</i>\".</b><br>\n"; } } else { echo "<b>Salasanat eivät täsmää.</b><br>\n"; } } else { echo "<b>Tunnus \"<i>". $tunnus ."</i>\" on jo käytössä.</b><br>\n"; } } else { if ($_GET["act"] == "rekisteroidy") { echo "<form action=\"". $tarkastus ."\" method=\"post\">\n"; echo "<b>Rekisteröidy</b><br>\n"; echo "Jos sinulla on jo tunnus, <a href=\"". $tarkastus ."\">kirjaudu</a>.<br>\n"; echo "Tunnus: <input type=\"text\" name=\"tunnus\"><br>\n"; echo "E-mail: <input type=\"text\" name=\"email\"><br>\n"; echo "Salasana: <input type=\"password\" name=\"salasana\"><br>\n"; echo "Salasana uudelleen: <input type=\"password\" name=\"salasana2\"><br>\n"; echo "<input type=\"submit\" value=\"Rekisteröidy\" name=\"rekisteroidy\">\n"; echo "</form>"; } else { echo "<form action=\"". $tarkastus ."\" method=\"post\">\n"; echo "<center><br><br><br><br><b>Kirjaudu sisään</b><br>\n"; echo "Ole hyvä ja kirjaudu sisään.<br>\n"; echo "Tunnus: <input type=\"text\" name=\"tunnus\"><br>\n"; echo "Salasana: <input type=\"password\" name=\"salasana\"><br>\n"; echo "<input type=\"submit\" value=\"Kirjaudu\" name=\"kirjaudu\">\n"; echo "</center></form>"; } } exit(); } ?>
Virheilmoitus johtuu siitä, kun olet tulostanut jotain selaimelle ennen headerssien muokkausta.
Jos et mielestäsi ole mitään tulostanut, niin tarkista ettei ole jäänyt esim. välilyöntiä jonnekin, esim. ennen <?php -tägien alkua.
Voit laittaa heti <?php tagin jälkeen ob_start() funktion.
Kiitos Lebe80, tarkistuskoodini oli kokonaan body-tagien sisällä. Laitoin tämän rivin tiedoston ensimmäiseksi niin homma lähti toimimaan:
<?php include("tarkista.php"); ?>
Tuon kun vielä saisi pelittämään, että miten nuo tiedot saisi omiin kenttiin, että ei olisi yhtä tällaista kenttää:
tieto1##tieto2##tieto3##tieto4
tieto1##tieto2##tieto3##tieto4
tieto1##tieto2##tieto3##tieto4
jne rivit 4-50.
Tuo kun muuttuu melko sekavaksi kun eri kohdissa on erimittaista tekstiä. Metabolixilla tuossa se on kerrottuna, mutta en ihan noilla neuvoilla vielä pääse maaliin.
$tiedot = explode("##", $rivi) //sitte kenttien valueksi vaan... value="<?php echo($tiedot[0]) >" ja jne... value="<?php echo($tiedot[0]) value="<?php echo($tiedot[1]) value="<?php echo($tiedot[2]) value="<?php echo($tiedot[3]) //tuossa laitetaan valueksi eka 1. sitten 2. jne...
Elikkäs jos formissa on näin:
<input name="tiedot_1-1" type="text" value="<?php echo($tiedot[1][1]) ?>" /> <input name="tiedot_1-2" type="text" value="<?php echo($tiedot[1][2]) ?>" /> <input name="tiedot_1-3" type="text" value="<?php echo($tiedot[1][3]) ?>" /> <input name="tiedot_1-4" type="text" value="<?php echo($tiedot[1][4]) ?>" />
niin prosessointi skripti ei voi olla näin:
<? $fn = "tiedosto.txt"; $content = trim(stripslashes($_POST["content"])); $fp = fopen($fn,"w") or die ("Virhe tiedoston avaamisessa!"); $_POST['tiedot'][1][1] $_POST['tiedot'][1][2] $_POST['tiedot'][1][3] $_POST['tiedot'][1][4] fputs($fp,$content); fclose($fp) or die ("Virhe tiedoston sulkemisessa!"); echo "<meta http-equiv=\"refresh\" content=\"0; url=varmista.php\" />\n"; ?>
Ainakaan tuo ei toimi, tulee virheilmoitus:
Parse error: syntax error, unexpected T_VARIABLE in processscript.php on line 6
Rivit päättyvät puolipisteeseen.
Hups... No nyt lisäsin puolipisteet, eikä virheilmoituksia enää tule, mutta tiedot eivät tallennu noista kentistä.
$tiedot[1][1] = $_POST['tiedot_1-1']; $tiedot[1][2] = $_POST['tiedot_1-2']; $tiedot[1][3] = $_POST['tiedot_1-3']; $tiedot[1][4] = $_POST['tiedot_1-4'];
Etkä lisää noita tietoja missään vaiheessa $content muuttujaan?
edit: eli nyt vielä tallennat ton $tiedot-taulukon sisällön tiedostoon.
Ei saa nyt hermostua kun mikään ei mene ilman rautalankaa jakeluun, mutta miten tuo tallennus lisätään?
Ensinnäkin voit unohtaa kohtuullisen osan vehkis91:n neuvoista, jotka ovat melkoista purkkaa.
Jotta pääsisit tuosta typerästä stripslashes-funktiosta eroon, tallenna seuraava koodi erilliseen php-tiedostoon ja liitä se includella aivan sivun alussa (mieluiten joka sivulla). Voit välttää tällä paljon päänvaivaa. Koodi on sovellettu PHP:n sivuilta käyttäjän kommenteista, jolla on myös kerrottu asian taustoja. Lisätietoa löytyy hakusanalla "magic quotes".
<?php if (!function_exists("undoMagicQuotes") && get_magic_quotes_gpc()) { function undoMagicQuotes($array, $topLevel = true) { $newArray = array(); foreach($array as $key => $value) { if (!$topLevel) { $key = stripslashes($key); } if (is_array($value)) { $newArray[$key] = undoMagicQuotes($value, false); } else { $newArray[$key] = stripslashes($value); } } return $newArray; } $_GET = undoMagicQuotes($_GET); $_POST = undoMagicQuotes($_POST); $_COOKIE = undoMagicQuotes($_COOKIE); $_REQUEST = undoMagicQuotes($_REQUEST); } if (get_magic_quotes_runtime()) { set_magic_quotes_runtime(0); }
Sitten voimme toteuttaa ehdotukseni, kuten aiemmin sen kirjoitin.
Tiedoston lukeminen:
<?php // Luetaan raaka data. $data = file_get_contents("tiedot.txt"); // Jos dataa saatiin, palautetaan se PHP:n tuntemaan muotoon. if ($data) { $data = unserialize($data); } // Jos dataa ei saatu tai se oli viallista, luodaan uusi taulukko. if (!$data) { // 50 riviä, 4 saraketta. $data = array_fill(0, 50, array_fill(0, 4, "")); }
Rivin lisäys jälkikäteen (:
<?php // Ennen sivun tulostusta: $data[] = array_fill(0, 4, "");
Tulostus:
<?php echo "<table>\n"; foreach ($data as $rivi => $tiedot) { echo "<tr>"; foreach ($tiedot as $sarake => $sisalto) { echo "<td><textarea name='tiedot[$rivi][$sarake]' rows='4' cols='25'>", htmlspecialchars($sisalto), "</textarea></td>"; // Varsinaiselle sivulle: // echo "<td>", nl2br(htmlspecialchars($sisalto)), "</td>"; } echo "<tr>\n"; } echo "</table>\n";
Tallennus:
<?php // Jos luotat käyttäjään, voit tallentaa suoraan. // Tässä on kuitenkin hakkerille taas paikka. $data = $_POST['tiedot']; // Muuten käy data läpi. Ei ole koskaan pahitteeksi. $data = array(); foreach ($_POST['tiedot'] as $tiedot) { $i = count($data); foreach ($tiedot as $sisalto) { $data[$i][] = (string) $sisalto; } } // Nyt $data sisältää samanlaista dataa kuin latauskoodin jälkeen. // Itse tallennus: file_put_contents("tiedot.txt", serialize($data));
En toki testannut koodia, mutta hyvällä tuurilla se toimii täysin ilman muutoksia.
Onneksi PHP 6:ssa päästään viimein eroon noista tragic quoteseista.
Nyt olen vielä kauempana maalista mitä äsken olin.
Ensimmäisen esimerkin koodi siis tallennetaan omaksi tiedostoksi ja tuodaan includella - tämä on ok, mutta sitten menin jossain vipuun.
Onko tiedoston lukeminen, tulostus ja tallennus -koodit tarkoitettu olemaan samalla vai eri sivuilla? Laitoin tallennuksen omaksi tiedostoksi, jonne viittasin formissa <form action="tallennus.php" method="post">, mutta en varmaan tajunnut koko ideaa kun sain parhaimmillaankin näkymään vain taulukon ja tekstilaatikon päällekkäin, mutta en onnistunut tallentamaan mitään :-/
Edit: oletkin näköjään päivittänyt tallennuskoodia, jatkan testaamista...
Edit2: ei vaan taidot riitä. Taitaa liian sitkeä pala aloittaa koodaamiseen tutustumista.
Ajattele nyt tuota koodien sijoittelua ihan järjellä. Tietenkin tiedosto pitää ensin lukea ja sitten tulostaa – nämä siis kuuluvat aina tässä järjestyksessä peräkkäin. Tallennus taas ei voi mitenkään kuulua näiden perään, koska nythän vasta luodaan sivua datan syöttämiseksi. Niinpä tallennuskoodi täytyy sijoittaa erilliseen tiedostoon, johon formin action viittaa.
En tiedä, mitä olet sotkenut, mutta koodini kyllä toimii.
Jos virheen mahdollisuus on olemassa, niin kyllä virhe tapahtuu kun on ihmisistä kyse :-)
Luulin että php:ssa kuuluu aina sulkea koodi (?>), mutta ne olikin tainnut jäädä tarkoituksella noissa koodiesimerkeissä auki kun demossasikin ne näkyy olevan auki.
Joka tapauksessa tämä ratkaisi ongelmani. Kiitos suuresti avusta - tai siis oikeastaan voisi sanoa, että koko työstä kun ei omilla oivalluksilla päästy puusta pitkään.
Hitusen vielä kun treenaan niin rupean koodaamaan Drupalin tappajaa ;-)
Aihe on jo aika vanha, joten et voi enää vastata siihen.