Heips kaikille.
Vieraskirjassani on admin osio, jossa jokaisen viestin perässä on painike "Poista".
Itse poisto toimii siten, että piilokenttänä on viestissä (formin sisässä) message ID, jonka mukaan poisto tehdään.
Nyt olisi tarkoitus muuttaa se siten, että jokaisen viestin perässä olisi check box ja vain yksi painike "Poista valitut".
Lähinnä kysymykseni koskee, pitäisikö kaikki viestit nyt olla yhden formin sisällä ja miten nyt tuota oikein lähtisin muuttamaan?
Vinkkejä?
Juu, kaikki viestit yhdessä formissa. Yksinkertaisesti käyt silmukalla läpi kaikki checkboxit ja tarkastat onko siinä rasti ja poistat kannasta jos on.
Se hankalin pohtimisen paikka voisi olla cb:n nimeäminen. Yksi vaihtoehto voisi olla nimetä ne vaikka yksinkertaisesti id:llä.
Tässä pieni esimerkki havainnollistamaan:
//tarkastus if (isset($_POST["submit"])) { echo "<p>Poistetuksi valitut ovat:</p>"; for ($i=0;$i<10;$i++) { if (isset($_POST["$i"])){ echo "$i "; } } } //tulostus echo "<form name='f' method='post' action='cb.php'>"; for ($i=0;$i<10;$i++) { echo "<p><input type='checkbox' name='$i' value='$i'></p>"; } echo "<p><input type='submit' name='submit' value='tarkasta'></p>";
Pitäisi jopa toimia :)
Juu. Ajattelin nimetä ne cb:t ID:ksi.
Tuntuu ainakin minun mielestäni loogiselta.
Vielä sellanen pikku kysymys, että miten tehdään tavan linkki formille painikkeen sijaan?
Painikkeita tulee niin paljon, että tavan linkit saisi paremmin sivulle järjestykseen ja pienempään tilaan.
Linkin teet käyttämällä $_GET -parametrejä. Tällöin mitään formia ei edes tarvita.
esim.
<a href="sivu.php?toiminto=poista&id=43&tarkiste=d9fd0ba0bbc7e95862c1d7912096848c5f4f6e86">Poista viesti</a>
sivu.php:lle välittyvät parametrit siis $_GET -muuttujina:
$toiminto = $_GET["toiminto"]; // poista $id = $_GET["id"]; // 43 $tarkiste = $_GET["tarkiste"]; // d9fd0ba0bbc7e95862c1d7912096848c5f4f6e86 = esim. sha1("prefix".43)
Ne voi laittaa myös taulukkoon, joka on mielestäni fiksumpi tapa:
for ($i=0;$i<10;$i++) { echo "<p><input type='checkbox' name='i[]' value='1'></p>"; }
Enää ei tarvitse tarkistaa onko muuttujaa x olemassa, vaan käydään tuo taulukko esim foreachilla läpi, koska jokainen valittu checkbox oli tuossa taulukossa.
Seuraa yleistä jarnaa. Laitetaan lainausmerkit ja heittomerkit oikeaan järjestykseen eli tagien attribuutit ympäröidään lainausmerkeillä ja taulukon arvoihin viitataan heittomerkkien kanssa. Nämä ovat suosituksia, joita kannattaa noudattaa.
<?php echo '<p><input type="checkbox" name="'.$i.'" value="'.$i.'" /></p>"; $toiminto = $_GET['toiminto']; // poista ?>
hmm. Vielä tuosta painike linkiksi.....
Tällä hetkellä painike ohjaa tiedot toiseen tiedostoon, joka tekee poiston.
Tarkoitus olisi siis pitääkin poisto koodi omana tiedostonaan.
Esimerkeistä ei oikein minulle auennut, miten saisi normaali linkin tekemään saman toiminnon mitä painike tällä hetkellä.
Käytännössä minulla on siis painikkeilla yksittäisten viestien poisto.
Vain lisänä tulisi cb:t, jotta useamman viestin poisto tulisi kerralla mahdolliseksi.
JavaScriptillä:
<script type="text/javascript"> function submitform() { document.myform.submit(); } </script> <a onClick="submitform()">Linkki</a>
Jos tahtoo linkin näyttävän linkiltä niin tagiin pitää lisätä href-attribuutti. Linkki kuitenkin johtaa formin actionin osoitteeseen.
Mitäh? Siis haluat linkkiä klikkaamalla tapahtuvan yksittäisen viestin poiston? Ei nyt hemmetissä mitään javascriptiä sotketa näin yksinkertaiseen asiaan.
<?php if($_GET['act'] == "delete"){ poista_viesti($_GET['id']); } ?> <a href="?act=delete&id=5">Poista viesti numero 5</a>
T.M. kirjoitti:
<a href="?act=delete&id=5">Poista viesti numero 5</a>
Olin eka! 05.04.2006 12:44:06 ;p
Joo en näemmä huomannut.
Sulla oli jokin ihme tarkiste, mitä sillä tekee?
Tarkiste tekee useimmat käsinkirjoitetut poisto yritykset voimattomiksi.
prefix kannattaa koostaa esim. päivämäärästä, jolloin tarkiste muuttuu joka päivä.
Tietenkin tarkisteen oikeellisuus tarkastetaan viestin poiston yhteydessä.
Aku2 kirjoitti:
Vielä sellanen pikku kysymys, että miten tehdään tavan linkki formille painikkeen sijaan?
Aku2 kirjoitti:
Vielä tuosta painike linkiksi..... -- Vain lisänä tulisi cb:t, jotta useamman viestin poisto tulisi kerralla mahdolliseksi.
Lebe80 kirjoitti:
Tarkiste poistaa useimmat käsinkirjoitetut poisto yritykset.
prefix kannattaa koostaa esim. päivämäärästä, jolloin tarkiste muuttuu joka päivä.
Mutta mitä se hyödyttää ? Olet admin, ei kukaan muu pääse sinne...?
koska poisto-scripti käyttää $_GET-muuttujia, kuka tahansa voi kokeilla poisto-scriptiä lisäämällä url-kentän perään omia parametrejä.
Esim. serverillä tapahtunut virhe voi tuoda admin-osion vaikka vain sekunniksi esiin kaikille käyttäjille.
Ei ole siis yhtään pahitteeksi reagoida noihin etukäteen.
T.M. kirjoitti:
Edit: Ahaa, tajusin, eli teet erilliseen tiedostoon sen poiston? mutta ei siinä ole mitään järkeä, kun saman voi hoitaa yhdessä tiedostossa.
En tarkoittanut. Luulin, että kun admin kirjautuu vieraskirjaan, niin poistolinkit näytetään hänelle.
T.M. kirjoitti:
Edit: jos se admin tuodaan vahingossa esille, niin miksei se käyttäjä voisi klikkailla niitä poistolinkkejä sitten hiirelläkin?
Kun näen, että poistaminen tapahtuu vain lisäämällä osoitteen perään &act=delete&id=32
niin voin helposti poistaa mitä tahansa viestejä koska tahansa.
Tämän takia on hyvä lisätä vielä tarkiste, että poisto scripti todellakin ajetaan oikeasti. Eikä tällöin esim. ylläpito voi vahingossa poistaa selaimeen tallentuneiden vanhojen osoitteiden avullakaan myöhemmin.
Mutta eihän kukaan tee admin paneelia sillä tavalla että sinne pääsee kuka tahansa ?
Edit: jee täähä on iha ku chät.
Edit: Ahaa, tajusin, eli teet erilliseen tiedostoon sen poiston? mutta ei siinä ole mitään järkeä, kun saman voi hoitaa yhdessä tiedostossa.
Edit: jos se admin tuodaan vahingossa esille, niin miksei se käyttäjä voisi klikkailla niitä poistolinkkejä sitten hiirelläkin?
Tässä haluttiin ilmeisesti poistaa monta viestiä kerralla ja käyttää painikkeen sijasta linkkiä, joten eikös tuo linkki JavaScriptillä hoidu (kuten yllä lainailin) ja tuon tarkisteen voi heittää hidden-kenttänä formiinkin toisena vaihtoehtona.
Mutta eihän tuo varmistus juttu toimi kuin eri päivinä, eli jos poistat viestin tänään, niin vasta huomenna se varmistaa sun poistot, eli aika turha.
T.M. kirjoitti:
Mutta eihän tuo varmistus juttu toimi kuin eri päivinä, eli jos poistat viestin tänään, niin vasta huomenna se varmistaa sun poistot, eli aika turha.
täh?!
echo sha1("varmisteTeksti".date("dmy").$id); palauttaa huomena eri tarkisteen.
tietysti poisto-funktiossa tarkistetaan onko saatu tarkiste oikea:
esim.
if ($_GET["tarkiste"]!=sha1("varmisteTeksti".date("dmy").$id)){ die("viestin poisto ei onnistunut. Istunto on vanhentunut"); }
ja tietysti tarkiste luodaan vieraskirjaan samalla kaavalla.
edit:
eli jotenkin tuntuu ettet ole ymmärtänyt tarkisteen ideaa.
Eli jos tiedät, että viesti (id:43) poistetaan seuraavalla url:lla.
http://www.sivu.php?toiminto=poista&id=43
niin voit päätellä että voit poistaa vietin (id:23) seuraavasti
http://www.sivu.php?toiminto=poista&id=23
mutta kun lisätään tarkiste, joka koostuu id:stä ja päivämäärästä, sekä prefixistä (joka on alfanumeerinen), niin on vaikeampi päätellä miten poistat viestejä.
// pvm. 5.4.2006 http://www.sivu.php?toiminto=poista&id=43&tarkiste=42422929679a058309e6ec900e75460d327892d0
Miten poistat viestin (id:23) ?
Varmaankin T.M. viittasi tähän:
Lebe80 kirjoitti:
Eikä tällöin esim. ylläpito voi vahingossa poistaa selaimeen tallentuneiden vanhojen osoitteiden avullakaan myöhemmin.
Systeemi a: Jos viesti id=5 on jo poistettu niin sitä ei voi poistaa uudelleen ts. tyhjän viestin poistolla ei ole mitään merkitystä.
Systeemi b: Kun viesti id=5 poistetaan, sitä seuraavien viestien id kelautuu yhdellä taaksepäin. Tässä systeemissä niiden vanhojen osoitteiden avulla voisi poistaa viestejä uudelleen vielä samana päivänä.
Kuten sanoin yllä, niin lisää sen tarkisteen sinne formiin, eipähän tule ongelmia selaimen sivumuistiin tallentuneiden osoitteiden muodossa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.