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
(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.
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.
$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ää.
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.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.