hei,
minulla on php-koodi, josta valitaan poistettava tietue:
<?php //laitetaan taulun kenttänimet taulukkoon echo "<table border=\"1\"><tr> <td>id</td> <td>Merkki</td> <td>Malli</td> <td>Vuosi</td> <td>Km</td> <td>Hinta</td> <td>toiminto</td> </tr>"; // Luetaan SQL-kyselyn palauttamaa tietoa rivi riviltä while($mysql_tiedot = mysql_fetch_array($mysql_haun_tulos)){ echo "<tr> <td>". $mysql_tiedot["id"]."</td> <td>". $mysql_tiedot["merkki"]."</td> <td>". $mysql_tiedot["malli"]."</td> <td>". $mysql_tiedot["vuosi"]."</td> <td>". $mysql_tiedot["km"]."</td> <td>". $mysql_tiedot["hinta"]."</td> <td><a href=\"poista.php?id=" .$mysql_tiedot["id"]. "\">poista</a></td> </tr>";} echo "</table>"; ?>
ja vastaanottava eli poistava php-koodi on:
<html> <head> <title>Tuotteen poisto</title></head> <?php require "../../funktiot.php"; $yhteys = AvaaTietokanta(); $sql="delete from autot where id=" . $_GET["id"] . " limit 1"; $mysql_haun_tulos = mysql_query($sql, $yhteys); echo "<p>Auto poistettu tietokannasta!</p>"; mysql_close($yhteys); ?> <p><a href="val_poistettava.php">Palaa tästä selaukseen</a></p> </body> </html>
se kysymys: miten saan kysyttyä käyttäjältä ennen fyysistä poistoa halutaanko tietue poistaa? (vastaus y/n) ymmärtääkseni tätä ei voi tehdä javascriptillä, koska ollaan toimimassa palvelimen päässä koko ajan!
Väärin, tuon voi tehdä javascriptillä, jolloin teet vain, kun kysymykseen vastataan "ei", niin mitään tietoa ei lähetetä palvelimelle, eikä myöskään tietoa poisteta.
Järkevää olisi myös tehdä tietokannan riveihin tietue, joka määrittelee onko rivi julkaistu vai ei.
Kun tietoa poistetaan, niin oikeasti tuo yksi tietue määritelläänkin asennosta 1 asentoon 0. Tällöin poistetun tiedon voi vielä palauttaa, esim. tekemälläsi "undo" -toiminnolla:
Rivi 'Ford Mustang' poistettiin tietokannasta. _Kumoa toiminto_
Myös tuo K/E-kysely on loppujen lopuksi suurimmaksi osaksi ärsyttävä ja käyttöliittymäsuunnittelijatkin (List Apart, Humanized yms.) ovat sen jo todenneet turhaksi, kun ihmiset muutenkin ehtivät yleensä klikkaamaan tottumuksesta nappia, ennen kuin ovat oikeasti edes lukeneet kysymyksen.
Osa nykyisistä sivustoistakin on jo siirtynyt ennemminkin juuri tuohon undo-toimintoon, jolloin suuri määrä tietoa on helppo poistaa, silloin kun siihen on tarve, ja vahinkolaukauksissa tieto on helppo palauttaa.
Voin väittää, että "Undo"-toiminto tulee maksamaan itsensä takaisin, varsinkin kun se on suhteellisen yksinkertainen toteuttaa.
Ainoa, että jokaisessa tietokantahaussa sinun tulee ottaa huomioon tuo "julkaistu"-tila, ettet näytä käyttäjille jo poistettuja rivejä.
lainaus:
Väärin, tuon voi tehdä javascriptillä, jolloin teet vain, kun kysymykseen vastataan "ei", niin mitään tietoa ei lähetetä palvelimelle, eikä myöskään tietoa poisteta.
täsmennä hieman mitä tarkoitat. pieni esimerkki olisi ok!
lainaus:
Järkevää olisi myös tehdä tietokannan riveihin tietue, joka määrittelee onko rivi julkaistu vai ei.
Kun tietoa poistetaan, niin oikeasti tuo yksi tietue määritelläänkin asennosta 1 asentoon 0. Tällöin poistetun tiedon voi vielä palauttaa, esim. tekemälläsi "undo" -toiminnolla:
olet oikeassa. toisaalta taas tälläisen delflagin käyttö vaatii sitten deletointiajojen tekemistä kantaan säännöllisesti. muutenhan sinne kertyy aikojen kuluessa kasapäin deletoijuja tietueita.
<a href="poista.php?id=123" onclick="return confirm('Poistetaanko varmasti?');">Poista</a>
Tässä on kuitenkin kaksi huomioitavaa asiaa: Jos JavaScript on pois päältä, varmistusta ei näytetä. Lisäksi poistettavan id:n välittäminen GET-parametrina on ideologisesti väärin; varsinaiseen poistamiseen johtavalla kerralla kuuluisi käyttää POST-formia.
PHP:llä toteutettuna homma menisi näin:
<a href="poista.php?id=123">Poista</a>
<?php # poista.php $id = intval(@$_GET["id"]); // SELECT * FROM taulu WHERE id = $id... // Näytetään tietueen tiedot. ?> <p>Haluatko varmasti poistaa tämän tietueen?</p> <form action="poista_post.php" method="post"> <button type="submit" name="id" value="<?php echo $id; ?>">Poista</button> </form>
<?php # poista_post.php $id = intval(@$_POST["id"]); // DELETE FROM taulu WHERE id = $id... echo "Kohde $id poistettu!";
volume kirjoitti:
kertyy aikojen kuluessa kasapäin deletoijuja tietueita
Jos poistettuja on kannassa vähemmän kuin poistamattomia, niillä ei ole paljonkaan merkitystä, ellei datamäärä ole todella suuri (vähintäänkin miljoonia tietueita). Muutenkin epäilen, että ohjelmasi käsittelemät datamäärät ovat niin pieniä, ettei tällä asialla ole mitään merkitystä, kunhan teet ohjelman muuten oikein.
volume kirjoitti:
sinne kertyy aikojen kuluessa kasapäin deletoijuja tietueita.
En jaksa uskoa, että tuo muodostuu ongelmaksi sun datamäärillä.
Itsekään en usko, että datamäärästä on juurikaan haittaa. Tietenkin, mukaan vielä päivämääräkenttä, jonka perusteella vanhentuneita rivejä voisi ajoitetusti poistaa.
ajattelen asiaa pikemminkin periaate kuin tämän esimerkin valossa: tietueen looginen delflag-kenttä vaatii mielestäni mukaansa niin päivämäärä (kuten on esitetty) kuin myös kannan siivousajot toimiakseen kunnolla.
Eikös ihan se oikeakin DELETE useimmissa kannoissa käytännössä tee delflagilla sen. Ainoa vaan että sitä ei usein saa helposti undottua.
Grez kirjoitti:
Eikös ihan se oikeakin DELETE useimmissa kannoissa käytännössä tee delflagilla sen. Ainoa vaan että sitä ei usein saa helposti undottua.
olenko ymmärtänyt oikein, että mysql-kannassa ole ole lainkaan loogista tietotyyppiä?
volume kirjoitti:
olenko ymmärtänyt oikein, että mysql-kannassa ole ole lainkaan loogista tietotyyppiä?
Onhan MySQL:issä tietotyyppi BOOL.
volume kirjoitti:
olenko ymmärtänyt oikein, että mysql-kannassa ole ole lainkaan loogista tietotyyppiä?
Suurin osa sen tietotyypeistä on loogisia. Taitaa olla itse asiassa kaikki, vaikka joskus jotkut tuntuisikin epäloogisilta...
Jos tarkoitit totuusarvoa, kaksiarvoista, Boolen arvoa tms, niin sitten tuossa -tossu- vastasikin jo.
Mutta varsinainen ihmetys oli, että miksi lainasit viestini tuohon alustukseksi?
Grez kirjoitti:
volume kirjoitti:
olenko ymmärtänyt oikein, että mysql-kannassa ole ole lainkaan loogista tietotyyppiä?
Suurin osa sen tietotyypeistä on loogisia. Taitaa olla itse asiassa kaikki, vaikka joskus jotkut tuntuisikin epäloogisilta...
Jos tarkoitit totuusarvoa, kaksiarvoista, Boolen arvoa tms, niin sitten tuossa -tossu- vastasikin jo.
Mutta varsinainen ihmetys oli, että miksi lainasit viestini tuohon alustukseksi?
Käsittääksi tuo MySQL:n BOOL-tyyppi toteutetaan kuitenkin TinyInttinä joka voi saada arvon siis 0 tai 1, mutta periaatteessahan tuolla ei ole nyt niin väliä...
Luulisin että harvassa on tietokannat, jossa bool todellisuudessa pakattaisiin alle tavuun. Eli siis että kantaan voisi laittaa vaikka 80 boolia ja rivin koko kasvaisi vain 10 tavulla. Eli sikäli se taitaa lähes aina olla "tinyint" joka saa arvon 0 tai 1, toki jossakin kantaimplementaatiossa saattaisi olla esim. 0 ja 255 tai null voisi olla samassa tavussa jolloin olisi kolme vaihtoehtoa tallennettavana.
Aihe on jo aika vanha, joten et voi enää vastata siihen.