Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Ongelma datan poisto tietokannasta

sheba [06.08.2015 13:58:59]

#

Näin aloittelijana tarttis neuvoa kokeneimmilta guruilta missä mättää.
Mul on sivu index.php, jossa on taulukko, jonka tiedot haetaan tietokannasta. Taulukon jokaisella rivillä on poista-nappi, jota klikattaessa aukeaa bootstrap modal, jossa varmistetaan poisto. Kun modalissa olevaa poista-nappia on klikattu javascript nappaa poistettavan id muuttujan arvon ja ohjaa poista.php-tiedostoon. Javascript pelittää, mutta jostain syystä poisto ei onnistu. Poiston jälkeen antaa error-viestin "Tapahtui virhe". Jotain puuttuu tai jokin on väärin poista.php-tiedostossa. Saisko neuvoa, kiitos.

Tulostettaessa poistettavan id muuttujan arvo on oikea(poista.php).

<php echo $id; ?>

MODAL

<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
...
 <div class="modal-body">
 <p>Haluatko varmasti poistaa nämä tiedot?</p>
 <span id="showID"></span>
 </div>
 <div class="modal-footer">
 <button type="button" class="btn btn-default" data-dismiss="modal">Peruuta</button>
 <button type="button" class="btn btn-danger poista">Poista</button>
 </div>
</div>

Javascript-koodi

$('#myModal').on('show.bs.modal', function(e) {
var id = $(e.relatedTarget).data('id');
$('#showID').html('ID: ' + id);
$('.poista').on('click', function() {
$.ajax({
  type: "GET",
  url: "poista.php?poistaID=" + id
  }).done(function( data ) {
  $('#alert').html(data);
  $('.modal').modal('hide')
  });
 });
});

poista.php-tiedosto

<?php
$db = new DatabaseConnect();
if(isset($_GET['poistaID'])){
 $stmt = $db->prepare("DELETE * FROM taulukko where id=:id");
 $stmt->bindParam(':id', $id);
 $id = (int)$_GET['poistaID'];
 if($stmt->execute()){
  //Tiedot poistettu!
 }else{
  //Tapahtui virhe!
 }
}else{
  //Poisto ei ole mahdollista.
}

Grez [06.08.2015 14:06:14]

#

(Edit: upsis se ei ollutkaan bindvalue niinkuin nopeasti katsoin)

Itse muuten käyttäisin tuossa GETin asemesta POSTia, koska GET-pyynnön ei pitäisi aiheuttaa muutoksia.

Lebe80 [06.08.2015 14:29:39]

#

Itse en ehkä oikeasti poistaisi riviä kannasta, vaan "merkitsisin" sen vain poistetuksi (oma kenttä rivissä).

Näin tarpeen tullen on nopea ja helppo rakentaa poistotoiminnoille "Undo"-ominaisuus, eikä haittaisi, vaikka poistettuun id-numeroon viitattaisiin myöhemminkin.

sheba [06.08.2015 20:19:10]

#

$id siirtäminen ei auttanut. Ilmoittaa yhä "Tapahtui virhe". POST-toiminnolla ilmoittaa puolestaan "Poisto ei ole mahdollista". Oisko muita neuvoja?

Lebe80 kirjoitti:

Itse en ehkä oikeasti poistaisi riviä kannasta, vaan "merkitsisin" sen vain poistetuksi...

Täytyy kokeilla tätä vaihtoehtoa, kunhan saisi ensin nykyisen koodin pelittää.

Metabolix [06.08.2015 20:26:15]

#

Kyselyssäsi on virhe: DELETE-kyselyyn ei kuulu *-merkkiä.

Kannattaa virhetilanteissa lukea virheilmoitukset. Helpointa on laittaa PDO tuottamaan virhetilanteissa poikkeuksia, niin ei jää mitään huomaamatta.

// $db = new PDO(...);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try {
 // toimintoja tänne
} catch (PDOException $e) {
 echo htmlspecialchars($e->getMessage());
}

Grez kirjoitti:

Eli aseta $id ensin ja vasta sitten käytä sitä bindParam:ssa.

Itse asiassa bindParam sitoo viittauksen, ja muuttujan arvo luetaan vasta execute-kutsussa. Tuolla metodilla voi siis tehdä hyvinkin sekavaa koodia. Minustakin olisi selvempää tehdä sijoitus ensin (tai peräti jättää tekemättä) ja virheiden välttämiseksi käyttää bindValue-metodia, joka lukee arvon saman tien.

sheba [06.08.2015 21:02:48]

#

Kiitos Metabolix! Koodi pelittää, kun poistin *-merkin. Nyt kohti seuraavaa ongelmaa :)

Metabolix kirjoitti:

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Virheilmoitus on käytössä. Löytyy config.php-tiedostosta.

Vastaus

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

Tietoa sivustosta