...takkuaa. Kopioin tässä häpeämättömästi Rami Heinisuon Php & MySQL -kirjasta myslipalvelimen php-pohjaisen hallintaenginen ja lähdin kustomoimaan sitä omiin tarpeisiini sopivaksi. Tietokantaan tallentaessa tuli sitten seinä vastaan. On filu joka listaa taulun sisällön, toinen joka poimii tietyn rivin solujen sisällöt tekstikenttiin ja kolmas joka päivittää tehdyt muutokset tietokantaan. Taulun sisältö listautuu kiltisti ja oikeat tiedot tulevat tekstikenttiin, mutta muutokset lähetettäessä ei muutosta tapahdu, editoitujen solujen sisällöt ovat edelleen samat. Tässä vähän evästä:
Tiedosto yllapitolomake.php
<?php require "funktiot.php"; $yhteys = AvaaTietokanta(); if (!$kysely = mysql_query("select * from arviot where id=$_GET[id] ",$yhteys)) { print "Haku epäonnistui!"; exit; } else { $linkki = mysql_fetch_row($kysely); } ?> <html> <head> <title>Linkkitietokannan ylläpitolomake</title> </head> <body bgcolor="#ffffff"> <H2>Linkkitietokannan ylläpitolomake</H2> <form method=post action="paivitetty.php"> <input type=hidden name="id" value="<?php print $linkki[0]; ?>"> Yhtye:<br> <input type=text name="yhtye" size=50 maxlength=255 value="<?php print $linkki[1]; ?>"><br> Levy:<br> <input type=text name="levy" size=50 maxlength=150 value="<?php print $linkki[2]; ?>"><br> Yhtiö:<br> <input type=text name="yhtio" size=50 maxlength=100 value="<?php print $linkki[3]; ?>"><br> Pisteet:<br> <input type=text name="pisteet" size=1 maxlength=1 value="<?php print $linkki[4]; ?>"><br> Teksti:<br> <textarea name="teksti" cols=50 rows=5><?php print $linkki[5]; ?></textarea><br> Raidat:<br> <textarea name="raidat" cols=50 rows=5><?php print $linkki[6]; ?></textarea><P><P> <input type=submit name="toiminto" value="Tallenna"> <input type=submit name="toiminto" value="Poista"> </form> </body> </html>
Tämän filun kaikki koodi toimii, samoin toimii Avaatietokanta()-funktio, joten en katsonut tarpeelliseksi sen laittamista tänne. Jos joku on sitä mieltä että ratkaisu voisi olla siellä, niin voin toki laittaa senkin. Ylläolevan koodin on tarkoitus havainnollistaa seuraavan tiedoston käyttäytymistä.
Tiedosto paivitetty.php:
<?php require "funktiot.php"; $yhteys = AvaaTietokanta(); if ($toiminto == "Tallenna") { $sql_lauseke = "update arviot set yhtye='$yhtye',levy='$levy', yhtio='$yhtio', teksti='$teksti', raidat='$raidat' where id=$id"; if (!$kysely = mysql_query($sql_lauseke,$yhteys)) { $sivunotsikko = "Tietojen muuttaminen epäonnistui! "; $teksti = "Virhe: " . mysql_error(); } else { $sivunotsikko = "Linkin tiedot päivitetty tietokantaan. "; $teksti = "Päivitys onnistui"; } } else if ($toiminto == "Poista") { $sql_lauseke = "delete from linkit where id=$id"; if (!$kysely = mysql_query($sql_lauseke,$yhteys)) { $sivunotsikko = "Poisto epäonnistui! "; $teksti = "Virhe: " . mysql_error(); } else { $sivunotsikko = "Linkin tiedot poistettu tietokannasta."; $teksti = "Poisto onnistui."; } } ?> <html> <head> <title><?php print "$sivunotsikko"; ?></title> </head> <body bgcolor="#ffffff"> <H2><?php print "$sivunotsikko"; ?></H2> <?php print "$teksti"; ?> <p> <a href="index.php">Takaisin etusivulle</A> </body> </html>
Paivitetty.php ei näytä mitään ilmoituksia onnistumisesta sen paremmin kuin virheestäkään.
Palvelimen asetukset saattavat olla niin, että lomakkeen kautta lähetetyt muuttujat pitää erikseen hakea $_GET- tai $_POST-taulukosta. Et voi siis tutkia $toiminto-muuttujan arvoa, vaan sen tilalle pitää kirjoittaa $_POST['toiminto']. Sama muutos täytyy tehdä kaikkiin lomakemuuttujien nimiin.
Tämmöisiä ongelmia kannattaa selvittää tulostamalla sivulle muuttujien arvoja. Jos esim. tulostat heti sivun alussa $toiminto-muuttujan arvon, näet, onko koko muuttujassa ylipäänsä mitään. Samalla tavalla voit myös tutkia, minne asti skriptin suoritus etenee.
En jaksa edes lukea koodia, mutta sanonpa vaan, että tuo kirja ei ole ajan tasalla. Se on kirjoitettu aikana, jollloin php:ssä oli oletuksena register_globals = on ja tietoturvasta ei jostain syystä välitetty. Lauseke "delete from linkit where id=$id" nostaa niskakarvat pystyyn. Ei näin.
Edit: Olen itsekkin tuon kirjan siis joskus lukenut.
Ajattelinkin jo vähän, että yksi syy saattaa olla kirjan ikä. :D
Antti, tuleeko minun siis soveltaa tuota yllapitolomake.php:hen vai paivitetty.php:hen?
Kaikkiin tiedostoihin, joissa viittaat getillä tai postilla tuleviin muuttujiin.
No plöh. Olisihan minun pitänyt tajuta kerralla miten se menee. Tyhmä mie.
<?php require "funktiot.php"; $yhteys = AvaaTietokanta(); if ($_POST['toiminto'] == "Tallenna") { $sql_lauseke = "update arviot set yhtye=$_POST['yhtye'], levy=$_POST['levy'], yhtio=$_POST['yhtio'], pistee=$POST['pisteet'], teksti=$_POST['teksti'], raidat=$_POST['raidat'] where id=$_POST['id']"; Ja bla bla bla...
Siis näinkö tuota pitää käytettämän? Ei vieläkään reagoi mitenkään, eikä tietokannassa tapahdu muutosta. :(
Tähän tyyliin:
<?php $sql_lauseke = "update arviot set yhtye='".$_POST['yhtye']."', levy='".$_POST['levy']."', yhtio='".$_POST['yhtio']."', pistee='".$POST['pisteet']."', teksti='".$_POST['teksti']."', raidat='".$_POST['raidat']."' where id=".$_POST['id']; ?>
Hipsut siis puuttuivat. Hipsuja tarvitaan, kun kantaan syötetään tekstiä. Numeerisissa kentissä niitä ei tartte käyttää.
Tuon merkkijonon sisällä joudut käsittääkseni pistämään vielä aaltosulut ympärille:
$sql_lauseke = "update arviot set yhtye={$_POST['yhtye']}, levy={$_POST['levy']}, yhtio={$_POST['yhtio']}, pistee={$_POST['pisteet']}
jne.
Edit: No ajv näyttikin jo toisen tavan, jolla tuo onnistuu. Ilmeisesti tuossa SQL:ssä oli sitten myös jotain vikaa.
Kokeile tulostaa muuttujien $_POST['toiminto'] ja $sql_lauseke arvo, niin näet heti, mistä kenkä puristaa.
Ainakin viittaukset taulukkoon pitää ympäröidä aaltosuluin ({ ja }) merkkijonon sisällä, jotta ne tunnistuvat oikein. Ja yhdestä $_POSTista on unohtunut alaviiva, sitä edeltävästä kentännimestä taas ilmeisesti t-kirjain. Lisäksi merkkijonot pitää ympäröidä heittomerkein SQL-kyselyssä.
muok: Muut olivat nopeampia...
Sain tuon ajv:n esimerkin toimimaan. Tuhannet kiitokset, mitä tekisinkään ilman teitä. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.