Ongelmana on yksi sivu, joka sisältää linkin itseensä ja johon välitetään tietoa sekä GET- että POST -metodilla. Sivulle tulostetaan taulukko tietokannasta haettavalla datalla. Sivulla on hakukentät, joiden tiedot välitetään POST-metodilla sivulle itselleen Hae-painiketta painamalla.
Kun tiedot on haettu kannasta ja tulostettu taulukkoon, voi taulukon tulostusjärjestystä muuttaa klikkaamalla taulukon sarakkeiden otsikoita. Otsikot toimivat linkkinä sivuun itseensä ja linkeissä annetaan GET-metodilla tieto, minkä sarakkeen mukaan järjestettynä tieto haetaan kannasta.
Ongelmana on se, että POST-metodilla siirrettävä tieto, eli hakukenttien arvot, katoavat, kun sivulle siirrytään uudelleen taulukon otsikoita klikkaamalla.
Onko mahdollista saada lomakkeen tiedot säilymään siirryttäessä sivulle uudelleen taulukon otsikkolinkeillä? Olen yrittänyt toteuttaa taulukon otsikkolinkit seuraavastikin siinä toivossa, että sivulle voisi lähettää dataa samanaikaisesti sekä GET- että POST-metodilla, mutta tulos ei ole toivotunlainen:
<a href=\"sivu.php?orderBy=id\" onClick="document['lomake'].submit()>
lomakkeen action=sivu.php
Mitä teen väärin? Onko sivun toteuttamisessa jokin perustavaa laatua oleva virhe?
Piilota postilla ja getillä saadut halutut arvot hidden-kenttiin (jokaiselle saadulle arvolle tietenkin oma kenttä).
<input type="hidden" name="piilotettumuuttuja" value="esim_postista_tullut_arvo" />
Lisäksi sinun pitää koodista muuttaa sen verran, ettet tarkkailekaan $_GET ja $_POST -taulukkoja, vaan pelkästään $_REQUEST -taulukkoa, joka sisältää automaagisesti molempien arvot (lisäksi jokusen muunkin).
Onko tulostusjärjestyksen muuttaminen siis toteutettu siten, että se vaatii lomakkeen lähettämisen eli menee palvelimen kautta? Jos kyse on vain järjestyksestä, niin se olisi ainakin periaatteessa parempi tehdä selaimessa jos mahdollista.
Jos kierretään palvelimen kautta, niin kyseeseen tulee kai lähinnä neljä tapaa:
1) Lebe80:n mainitsemat piilokentät.
2) Datan vieminen linkkien URLeihin (eli kuljettaminen eteenpäin GET-metodin keinoin).
3) Evästeet (cookiet).
4) HTML5-muisti eli web-muisti, tässä riittäisi varmaan sessionStorage; tosin vielä lienee syytä rakentaa varmistus niin, että IE:n vanhat versiot, jotka eivät tue HTML5-muistia, käyttävät Microsoftin omaa useData-tekniikkaa.
Käytä sessioita, esim
$_SESSION['order_sarake'] = "nimi"; $_SESSION['order_suunta'] = "asc";
jne...
sitten tietoa haettaessa vaikka käytät
$kysely = "Select ......."; if ($_SESSION['order_sarake']) { $kysely .= " ORDER BY ". $_SESSION['order_sarake']; $kysely .= " ". $_SESSION['order_suunta']; }
...tai jotain tuohon tyyliin
Mod. lisäsi kooditagit.
Mä en kyl käyttäis oikeastaan ikinä lomakkeissa (jos on mahdollista, että lomakkeen arvot muuttuvat juuri session takia vääriksi) sessio-dataa, koska se estää saman lomakkeen käyttämisen useassa täbissä.
manninen: kenelles tuo sun linkkis on tarkoitettu, vai halusitko vain muistuttaa yleisesti html-lomakkeista...?
Itsehän en tajunnut, miten "php ja lomakkeet" liittyy siihen, että aloituspostaaja on jo ilmoittanut, että hänellä on toimiva lomake, josta haluaa lähettää tietoa vielä eteenpäin hävittämättä edellisen lomakkeen tietoja.
Sori, käsitin väärin ja ehkä vieläkin vai kaipasitko jotain tälläistä?
<?php $haku = $_REQUEST['etsi']; if(!empty($_REQUEST['nimi'])){ TallennaKantaan(); } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1250"> <meta name="generator" content="PSPad editor, www.pspad.com"> <title></title> </head> <body> <form name="henkilot" method="post" action="" > <input type="hidden" name="jarjestys" value=""> <table> <tr> <td>Nimi</td> <td>Sukunimi</td> </tr> <tr> <td><input type="text" name="nimi" value="" /></td> <td><input type="text" name="snimi" value="" /></td> </tr> <tr> <td><input type="submit" value="Tallenna" /></td> </tr> </table> <table> <tr> <td><input type="text" name="etsi" value="<?php echo $haku; ?>" /></td> </tr> <tr> <td><input type="submit" value="etsi" /></td> </tr> </table> <br > <?php HaeHenkilot($haku); ?> </form> </body> </html> <script type="text/javascript"> function MikaKentta(td, arvo) { var solu = new Array() solu[0]="snimi"; solu[1]="nimi"; document.forms.henkilot.jarjestys.value = (solu[arvo]); document.forms.henkilot.submit(); } </script> <?php function TallennaKantaan(){ $k = "INSERT INTO henkilot SET nimi = '$_REQUEST[nimi]', snimi ='$_REQUEST[snimi]'"; if(!($t = mysql_query($k))) return; header("location:lomake.php"); exit; } function HaeHenkilot($haku){ if(!empty($_REQUEST['jarjestys'])){ $ehto = 'ORDER BY '.$_REQUEST['jarjestys']; } if(!empty($haku)){ $etsi = "WHERE snimi LIKE '%$haku%'"; } $k = "SELECT snimi, nimi FROM henkilot $etsi $ehto"; if(!($t = mysql_query($k))) return; echo '<table border="1" width="25%">'; echo '<tr>'; echo "<td onclick='MikaKentta(this, 0)'; style='background:black; color:white;'>Sukunimi</td>"; echo "<td onclick='MikaKentta(this, 1)'; style='background:black; color:white;'>Nimi</td>"; echo '</tr>'; while($r = mysql_fetch_assoc($t)){ echo '<tr>'; echo '<td>'. htmlspecialchars($r['snimi']) .'</td>'; echo '<td>'. htmlspecialchars($r['nimi']) .'</td>'; echo '</tr>'; } } ?>
Kiitos aktiivisesta vastailusta!
Ratkaisin ongelman tallentamalla POST-metodilla lähetetyt arvot sessioon jemitsuun. Arvot voi hakea sessiosta sen jälkeen, kun sivulle on siirrytty uudelleen näpäyttämällä taulukon sarakeotsikoita ja POST-arvot on kadotettu.'
Jee!
Aihe on jo aika vanha, joten et voi enää vastata siihen.