Ongelmani on seuraavanlainen: olen tekemässä tietokantaohjelmaa PHP:llä. Minulla on pääohjelmassa oliotaulukko, jossa metodi tietojen lukua varten. Metodi lukee vuorovaikutteisilta lomakkeilta tietoa. Eli, edellinen kysymys vaikuttaa seuraavaan, ja metodi ohjaa, miltä lomakkeelta milloinkin kysytään tietoa. Mutta entiset tiedot katoavat aina kun aukaisen uuden lomakkeen. Tarkoitus olisi lukea tiedot vuorotellen kaikilta lomakkeilta, siirtää ne oliotaulukkoon, ja tallentaa sitten tiedot, kun kaikki lomakkeet on luettu. Soveltuisivatko istuntofunktiot tarkoitukseeni? Olen yrittänyt käyttää niitä, mutta epäonnistunut. Olen kokeillut seuraavaa:
pääohjelman alkuun kohta:
<?php session_start(); print session_encode(); ?>
Sitten:
Olen kokeillut myös ilman isset funktiota, mutta ei toimi.
Metodissa:
$_SESSION["p"]=4; print "<br>Muuttuja: $p <br>";
Ohjelma ei anna mitään virheilmoitusta, mutta ei myöskään tulosta mitään arvoa $p :lle, vaan tulostaa vain "Muuttuja:". Missähän on vika?
Onko jokaisen lomakkeen alussa toi session_start();
en nyt ihan varma oo kyllä tästä, mut muistaakseni toi piti olla aina...
Kun minulla on tarkoitus, että pidän tiedot muistissa ainoastaan pääohjelman metodissa, joka käsittelee lomakkeita. En ole siksi laittanut lomakkeisiin ollenkaan tuota session_start() funktiota. Lomakkeet palauttavat virheettömästi tiedon pääohjelmaan, ja minulla olisi tarkoitus pitää ne siellä muistissa niin kauan, kunnes tallennan ne.
kokeiles laittaa ton $p:n tilalle tuo $_SESSION["p"] tai sitten määrittää
$p = $_SESSION["p"];
Jos käyttää tuota "kenkun" vihjettä, niin $p :n arvon saa kyllä sijoitettua ja tulostettua, mutta sama ongelma: arvo ei pysy muistissa. Eli jos laitan tuon sijoituksen if lauseen taakse niin, että se sijoitetaan vain kerran ohjelman ajon aikana, niin $p :n arvo nollautuu aina, kun esitän uuden kysymyksen, eli aukaisen uuden lomakkeen.
$_SESSION['p'] = 4; print $_SESSION['p'];
Käytä muuttujaa aina tuon $_SESSION-taulun kautta, pitäisi toimia. Ja tuo session_register-funktio on jo aikalailla vanhentunut, eli arvon voi suoraan sijoittaa tuonne $_SESSION-tauluun.
Muuttujan arvot eivät vain säily. Minua vaivaa myös virheilmoitus "Warning: session_start(): Cannot send session cookie - headers already sent by ...", josta välillä pääsin jo eroon. En tiedä mistä syystä tuo jälleen tuli.
pistä session_start(); ihan sivun alkuun heti php-tagin jälkeen niin vältyt tolta.
Minulla on session_start(); aivan sivun alussa omassa php tagissaan. Ei silti toimi. Olen kokeillut laittaa samoihin tageihin pääohjelman kanssakin (alkuun), mutta ei onnistu.
Olenkohan ilmaissut tarkoitukseni riittävän selvästi. Minulla ei ole tarkoitusta istuntojen avulla siirtää tietoa toiselle lomakkeelle, vaan saada tiedot säilymään pääohjelmassa, vaikka aukaisenkin useita lomakkeita. Onkohan tietojen tallennus välillä ainoa tapa selvittää ongelma?
Onkohan mahdollista, että käyttämäni internet palvelin (Baana) ei tuekaan istuntoja, tai vaatii jotain erityisiä toimenpiteitä toimiakseen? Onko joku käyttänyt Baanalla istuntoja, ja kuinka onnistui.
Onkohan mahdollista saada esimerkkisivua? Aina jaksan niitä pyydellä, mutta se selvittää jo aika paljon sitä, mihin pyrit ja näin ollen ongelmakin vosi ratketa helpommin.
Lähetänpä tässä esimerkkisivun. Jätän kuitenkin oliot pois, ettei tulisi hirveän pitkää esimerkkiä.
Pääohjelma:
<?php session_start(); ?> <?php include ("Kysy1.php"); include ("Kysy2.php"); include ("Kysy3.php"); include ("Kysy4.php"); Kysy1(); $x=$_POST[xx]; if ($x!=0) Kysy2(); $k=$_POST[jj]; $_SESSION['p']=$_POST[jj]; print "<br>Muuttuja p:n arvo on "; print $_SESSION['p']; if ($k!=0) Kysy3(); $l=$_POST[ll]; if ($l!=0) Kysy4(); ?>
Ja Kysy1.php
<?php function Kysy1() { print "<form action=\"Koe1.php\" method =\"POST\">"; print "<br>Anna jokin luku:"; print "<input type=\"text\" size=\"2\" maxlength=\"2\" name=\"xx\">"; print "<input type=\"submit\" value=\"Seuraava\"></form></br>"; } ?>
Functiot Kysy2(), Kysy3() ja Kysy4() ovat samanlaisia, kuin Kysy1(), paitsi että name arvot ovat jj (2), ll (3) ja yy (4). Kysymykseen voi laittaa lisäksi selvennöksen, mistä funktiosta on kyse (esim. anna toinen luku). Muuttuja $p tulostuu oikein Kysy2 :sen jälkeen, mutta katoaa sitten. Tuntuisi lisäksi loogiselta ohjelmoida seuraavasti:
if ($x!=0) { Kysy2(); $k=$_POST[jj]; $_SESSION['p']=$_POST[jj]; }
eli laittaa tuo ohjelman pätkä aaltosulkuihin, mutta jos näin menettelee, niin jostain syystä ohjelma ei sijoita $k :lle mitään arvoa, eikä myöskään p :lle. Tietääkö joku ratkaisun miksi?
En tiedä ratkaiseeko tämä mitään, mutta oikea tapa lienee pistää myös nuo $_POST-taulun merkkijonoindeksit hipsujen sisään.
Muutama asia, mitkä laittoi vähän silmään: Miksi includetat neljä eri Kysy.php:tä. Parempi idea voisi olla laittaa kaikki functiot yhteen tiedostoon, tai näin ainakin ite tekisin. Ja syy siihen miksi $p:n arvo katoaa on luultavasti siinä, että sijoitat sille arvon joka kerta:
<?php $k=$_POST[jj]; $_SESSION['p']=$_POST[jj]; //laita vaikka seuraavasti if($k=$_POST[jj]) $_SESSION['p']=$_POST[jj]; ?>
Siis eihän tuolla $_POST[jj]:ssä ole kuin tyhjää, paitsi tuon kysy2:n jälkeen.
Loistavaa. Kiitos ajv vinkistä. Nyt istunto toimii. Mietin itsekin tuota samaa sijoitusongelmaa, ja yritin tuota kaarisulkuhommaa, joka ei toiminut. Tuollainen if lause ei tullut mieleen. Aiheellinen huomautus myös tuo include asia. En ole hoksannutkaan, että funktiot voi laittaa samaankin tiedostoon.
Aihe on jo aika vanha, joten et voi enää vastata siihen.