Koodailen vieraskirjaa, ja törmäsin ongelmaan, ettei ohjelmalla muka ole oikeuksia poistaa rivejä tietokannasta. PhpMyAdmin-hallintapaneelissa samaisella tunnuksella onnistuu poistaminen, mutta ohjelmassa tunnus suostuu suorittamaan vain komennot select, insert ja update.
Allaolevassa koodissa on poistettavat taulukkoon kerätty poistettavien rivien id-numerot. Ohjelman pitäisi poistaa rivit yksitellen tietokannasta ja ilmoittaa sitten poistojen onnistuneen. Id-numerot toimivat oikein.
<?php for ($i = 0; $i < count($_POST["poistettavat"]); $i++) { $id = $_POST["poistettavat"][$i]; $lause = "DELETE FROM kwikspell WHERE id = " . $id . ";"; mysql_query($lause) or die(mysql_error()); } print("Valitut viestit poistettu!"); ?>
Koodi ei toimi, vaan ohjelma kaatuu ja antaa virheilmoituksen:
DELETE command denied to user 'vieraskirja'@'dyn3-235.adsl.mpynet.fi' for table 'kwikspell'
Onko ongelmani koodissa vai käyttäjän oikeuksissa? Käsin poistaminen siis onnistuu, ohjelmallisesti ei.
Danae kirjoitti:
Käsin poistaminen siis onnistuu, ohjelmallisesti ei.
Käytätkö tietokantaa "käsin" tuolla samaisella 'vieraskirja'-käyttäjällä? Oikeuksista tuo aika selkeesti kyllä johtuu.
Kyllä, käytän tietokantaa käsin tuolla vieraskirja-käyttäjällä ja pystyn poistamaan rivejä. Voisiko oikeuksissa silti olla jotain häikkää?
Saattaa olla, että puhun soopaa, mutta muistaakseni MySQL:ssä pystyi erikseen määrittelemään oikeuksia tuon domainin perusteella. Tällöin toimivuus "käsin" ja tuo virheilmoitus voisi viitata siihen, että DELETE-käskyt ovat sallittuja vain localhostista (sulla domain jostain syystä dyn3-235.adsl.mpynet.fi).
Tuota mietin itsekin, mutta luulen sallineeni oikeudet sekä localhostille että muille domaineille.
Et usko että koodissani olisi mitään vikaa? Pitää sitten tutkailla hallintapaneelia ja tuon käyttäjän oikeuksia. Kiitos vastauksistasi.
Auttaisiko tällainen muutos:
$lause = "DELETE FROM kwikspell WHERE id = '$id'";
Ei auta. Id:n tyyppi on integer. Kokeilin kyllä tuotakin, mutta oikeudet ei vieläkään riitä.
vaihtoehto kaksi:
"DELETE FROM kwikspell WHERE id = '".$_POST["poistettavat"][$i]."'";
Pekka Mansikka kirjoitti:
vaihtoehto kaksi:
"DELETE FROM kwikspell WHERE id = '".$_POST["poistettavat"][$i]."'";
Eihän tässä nyt ole kyse tuon lauseen toimivuudesta, vaan tietokannan oikeuksista... Ja kuten Danae sanoi, kyseessä on numeerinen kenttä, joten ei mitään hipsuja!
Edit:
Tuossa, kuten alkuperäisessäkin koodissa on reikä SQL-injektiolle... Oma lomake, jonka yhden poistettavat-checkboksin arvoksi "5 OR 1=1". Tosin tämä taitaa olla admin toiminto, joten periaatessa jos luottaa itseensä sen verran, ettei joskun humalapäissään hakkeroi omaa vieraskirjaansa, niin menköön mun puolesta :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.