Tässä yksinkertaistettuna sivu, jolla käyttäjä syöttää lukuja lomakkeeseen ja submit-painikkeen painamisen jälkeen syötetty tieto tarkastetaan ja talletaan MySQL-tietokantaan:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=windows-1252"> <TITLE>Otsikko</TITLE> <LINK rel=stylesheet type="text/css" href="perus.css"> </HEAD> <BODY> <FORM action="<?php print "check.php" ?>" method="POST"> <TABLE width="800" cellspacing="0" cellpadding="0" border="0"> <TBODY> <TR> <TD> <INPUT type="text" name="eka" size="2" maxlength="2"> </TD> <TD> <INPUT type="text" name="toka" size="2" maxlength="2"> </TD> </TR> <TR> <TD> <INPUT type="submit" name="tulokset" value="Lähetä"> </TD> </TR> </TBODY> </TABLE> </FORM>
<?php $dbserver = "localhost"; $dbuser = "eka"; $dbpass = "toka"; $db = "database"; $table = "table"; // Muodostetaan yhteys MySQL-palvelimeen $connect = @mysql_connect($dbserver, $dbuser, $dbpass); if (!$connect) { die("VIRHE! Palvelimeen ei saatu yhteyttä."); } // Valitaan käytettävä tietokanta mysql_select_db($db); if (!@mysql_select_db($db)) { die("VIRHE! Tietokantaan ".$db." ei saatu yhteyttä."); } // Suoritetaan submit-painikkeen painamisen jälkeen if (isset($_POST["tulokset"])) { $check_input = $_POST["eka"]; if (ereg ("([0-9]{1,2})", $check_input)) { $checked[] = $check_input; } else { $checked[] = -1; } $check_input = $_POST["toka"]; if (ereg ("([0-9]{1,2})", $check_input)) { $checked[] = $check_input; } else { $checked[] = -1; } $update = "UPDATE ".$table." SET eka_arvo = '$$checked[0]', toka_arvo = '$$checked[1]' WHERE ID = '1'"; if (@mysql_query($update)) { echo ("Tiedot lähetetty. ". mysql_affected_rows() ." riviä muutettu."); } else { echo ("Virhe tietojen päivittämisessä: ". mysql_error()); } } mysql_close($connect); ?>
Ongelmana on se, ettei tässä tapauksessa tiedot päivity tietokantaan. Jos määritän actioniksi esim. $PHP_SELF, niin tietokanta päivittyy aivan oikein. Pitäisikö minun viedä nuo tiedot tietokantaan vasta check.php scriptissä?
Voi olla hieman sekava selitys, mutta kysykää jos tuosta puuttuu jotain olennaista tai tarvitsette tarkennusta johonkin.
<FORM action="<?php print "check.php" ?>" method="POST">
Tuossa printtauksen jälkeen puuttuu ; -puolipiste.
ei siihen tarvita puolipistettä, koska viimeiseen riviin ei tarvita sitä, muistaakseni. mut en kylläkään tajua miksi toi check.php pitää tulostaa PHP:llä tonne tuolla tavalla....
Ei tuota tarvitsekaan tulostaa, jäi vain tuohon koska korvasin $PHP_SELF:in sillä. Mutta lyhyesti ja ytimekkäästi kaikki tapahtuisi seuraavasti:
1. Käyttäjä syöttää jonkun luvun välillä 1-99
2. Syöte tarkistetaan ja talletetaan tietokantaan
3. Talletettu tieto tarkistetaan tietokannasta
4. Jos syötettiin virheellistä tietoa, ohjataan korjaussivulle
5. Jos kaikki kunnossa, jatketaan eteenpäin
En vain tiedä, pitäisikö tuo tieto lähettää ensin POST:in avulla tuolle check.php skriptille ja vasta siellä tarkistaa ja tallettaa tietokantaan. Tällöin ei myöskään tarvitsisi hakea tietokannasta juuri sinne talletettua tietoa vertailua varten, vaan vertailu voitaisiin tehdä tallennusvaiheessa.
Kannattaisiko tuo siis tehdä siten, että määrittää tuohon formin actioniin tuon check.php:n tiedot käsitteleväksi skriptiksi ja jättää tältä syöttösivulta kaikki php- ja sql-komennot pois ja suorittaa ne vasta check.php:ssa?
Tein tuon nyt seuraavasti:
Sivu, jolla syötetään tieto:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=windows-1252"> <TITLE>Otsikko</TITLE> <LINK rel=stylesheet type="text/css" href="perus.css"> </HEAD> <BODY> <FORM action="check.php" method="POST"> <TABLE width="800" cellspacing="0" cellpadding="0" border="0"> <TBODY> <TR> <TD> <INPUT type="text" name="eka" size="2" maxlength="2"> </TD> <TD> <INPUT type="text" name="toka" size="2" maxlength="2"> </TD> </TR> <TR> <TD> <INPUT type="submit" name="tulokset" value="Lähetä"> </TD> </TR> </TBODY> </TABLE> </FORM> </BODY> </HTML>
Ja check.php näyttää tältä:
<?php $dbserver = "localhost"; $dbuser = "eka"; $dbpass = "toka"; $db = "database"; $table = "table"; // Muodostetaan yhteys MySQL-palvelimeen $connect = @mysql_connect($dbserver, $dbuser, $dbpass); if (!$connect) { die("VIRHE! Palvelimeen ei saatu yhteyttä."); } // Valitaan käytettävä tietokanta mysql_select_db($db); if (!@mysql_select_db($db)) { die("VIRHE! Tietokantaan ".$db." ei saatu yhteyttä."); } // Suoritetaan submit-painikkeen painamisen jälkeen if (isset($_POST["tulokset"])) { $check_input = $_POST["eka"]; if (ereg ("([0-9]{1,2})", $check_input)) { $checked[] = $check_input; } else { $checked[] = -1; } $check_input = $_POST["toka"]; if (ereg ("([0-9]{1,2})", $check_input)) { $checked[] = $check_input; } else { $checked[] = -1; } $update = "UPDATE ".$table." SET eka_arvo = '$$checked[0]', toka_arvo = '$$checked[1]' WHERE ID = '1'"; if (@mysql_query($update)) { echo ("Tiedot lähetetty. ". mysql_affected_rows() ." riviä muutettu."); } else { echo ("Virhe tietojen päivittämisessä: ". mysql_error()); } } mysql_close($connect); for ($i = 0; $i < count($checked); $i++) { if ($checked[$i] == -1) { $check = 1; } } if ($check == 1) { header("Location: fix.php"); } else { header("Location: results.php"); } ?>
Kai tuohon loppuun kävisi myös foreach, pitää katsella. Onko tuossa nyt joitain ongelmia, joita tällainen ratkaisu aiheuttaa?
Aihe on jo aika vanha, joten et voi enää vastata siihen.