Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: php ja tietueen poisto kannasta

Sivun loppuun

volume [29.08.2010 13:36:59]

#

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&auml;st&auml; 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!

Lebe80 [29.08.2010 14:00:40]

#

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ä.

volume [29.08.2010 14:12:05]

#

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.

Metabolix [29.08.2010 14:19:04]

#

<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.

Blaze [29.08.2010 16:24:55]

#

volume kirjoitti:

sinne kertyy aikojen kuluessa kasapäin deletoijuja tietueita.

En jaksa uskoa, että tuo muodostuu ongelmaksi sun datamäärillä.

Lebe80 [29.08.2010 19:09:06]

#

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.

volume [30.08.2010 08:18:07]

#

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.

Grez [30.08.2010 10:14:50]

#

Eikös ihan se oikeakin DELETE useimmissa kannoissa käytännössä tee delflagilla sen. Ainoa vaan että sitä ei usein saa helposti undottua.

volume [30.08.2010 11:56:53]

#

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

-tossu- [30.08.2010 15:22:48]

#

volume kirjoitti:

olenko ymmärtänyt oikein, että mysql-kannassa ole ole lainkaan loogista tietotyyppiä?

Onhan MySQL:issä tietotyyppi BOOL.

Grez [30.08.2010 16:16:58]

#

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?

Triton [30.08.2010 16:40:20]

#

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ä...

Grez [30.08.2010 16:46:08]

#

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.


Sivun alkuun

Vastaus

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

Tietoa sivustosta