Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Istuntofunktiot

Sivun loppuun

PaavoR [27.03.2004 11:37:34]

#

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:

Sitten:

if (isset ($p));
{
session_register ("p");
$p=4;
}

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?

kirkhammett [27.03.2004 11:50:40]

#

Onko jokaisen lomakkeen alussa toi session_start();
en nyt ihan varma oo kyllä tästä, mut muistaakseni toi piti olla aina...

PaavoR [27.03.2004 12:00:02]

#

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.

kenkku [27.03.2004 12:13:44]

#

kokeiles laittaa ton $p:n tilalle tuo $_SESSION["p"] tai sitten määrittää

$p = $_SESSION["p"];

PaavoR [27.03.2004 12:49:54]

#

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.

Olga [27.03.2004 15:31:12]

#

$_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.

PaavoR [27.03.2004 16:13:47]

#

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.

sooda [27.03.2004 16:15:29]

#

pistä session_start(); ihan sivun alkuun heti php-tagin jälkeen niin vältyt tolta.

PaavoR [27.03.2004 17:09:41]

#

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.

ajv [27.03.2004 19:11:06]

#

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.

PaavoR [27.03.2004 23:23:03]

#

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?

Olga [28.03.2004 01:02:43]

#

En tiedä ratkaiseeko tämä mitään, mutta oikea tapa lienee pistää myös nuo $_POST-taulun merkkijonoindeksit hipsujen sisään.

ajv [28.03.2004 12:51:20]

#

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.

PaavoR [29.03.2004 00:37:35]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta