SESSION data verdwijnt.
ik heb 3 paginas. apache draait mysql draait, tabellen aangemaakt.
eerste pagina: form met een 10-tal input velden.
pagina twee leest de $POST waarden uit en plaatst die in $SESSION, geen probleem, lezen uit $SESSION gaat ook goed. derde pagina, kan niets meer zien van de waarden in $SESSION.
ander probleem: terug op pagina twee: INSERT statement in de tabel, of als die al bestaat UPDATE.
de statement wordt netjes op het scherm getoond als ik er een PRINT neerzet. De insert of update resulteert echter in een record met lege kolommen, m.u.v. de PK (id).
Als ik de statement van het scherm pluk en die in de MySQL console zet, wordt-ie gewoon goed in de database gezet.
Ik na veel zoeken dacht ik dat het een connectie probleem was en de verbinding geheel lokaal gehouden:
in een (1) blok: start connectie, voor statement uit, sluit connectie.
Ik kan nergens vinden of MySQL met PHP standaard autocommit uit heeft staan. Maar dat lijkt het probleem ook niet te zijn, dus ik ga ervan uit dat autocommit (zoals de standaard is) default aan staat.
anyone.... help .... please ... hear my dying voice begging..... .. ..
Toevoeging op 13/02/2012 23:07:26:
Ik heb uiteindelijk modulaire opzet gemaakt met een class voor database interactie en een voor $_SESSION handling. de code kopieren wordt nogal lang.
Heeft een van jullie misschien een hint? Komt mijn probleem bekend voor?
Gewijzigd op 16/02/2012 09:19:42 door Erik Rijk
Probeer eens wat relevante en concrete vragen te stellen. Niet alles tegelijk, maar stuk voor stuk. En plaats dan ook een stukje relevante code erbij. Op die manier wordt je waarschijnlijk een stuk beter geholpen.
$POST en $SESSION moeten een underscore hebben. Dus $_POST en $_SESSION
Freek jansen op 13/02/2012 23:06:13:
...
pagina twee leest de $POST waarden uit en plaatst die in $SESSION, geen probleem, lezen uit $SESSION gaat ook goed. derde pagina, kan niets meer zien van de waarden in $SESSION.
pagina twee leest de $POST waarden uit en plaatst die in $SESSION, geen probleem, lezen uit $SESSION gaat ook goed. derde pagina, kan niets meer zien van de waarden in $SESSION.
Heb je session_start() ook op pagina 3 staan?
Als het allemaal losse pagina's zijn, moet je op iedere losse pagina 'session_start()' aanroepen.
Freek jansen op 13/02/2012 23:06:13:
ander probleem: terug op pagina twee: INSERT statement in de tabel, of als die al bestaat UPDATE.
de statement wordt netjes op het scherm getoond als ik er een PRINT neerzet. De insert of update resulteert echter in een record met lege kolommen, m.u.v. de PK (id).
de statement wordt netjes op het scherm getoond als ik er een PRINT neerzet. De insert of update resulteert echter in een record met lege kolommen, m.u.v. de PK (id).
Controleer of de query werkelijk goed is uitgevoerd:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
if(mysql_query($sql_statement))
{
// doe je ding ...
} else {
print mysql_error();
}
?>
if(mysql_query($sql_statement))
{
// doe je ding ...
} else {
print mysql_error();
}
?>
Het stukje foutafhandeling.
Freek jansen op 13/02/2012 23:06:13:
...
Ik kan nergens vinden of MySQL met PHP standaard autocommit uit heeft staan. Maar dat lijkt het probleem ook niet te zijn, dus ik ga ervan uit dat autocommit (zoals de standaard is) default aan staat.
Ik kan nergens vinden of MySQL met PHP standaard autocommit uit heeft staan. Maar dat lijkt het probleem ook niet te zijn, dus ik ga ervan uit dat autocommit (zoals de standaard is) default aan staat.
CITE: "By default, autocommit mode is enabled in MySQL."
FROM: http://stackoverflow.com/questions/2950676/difference-between-set-autocommit-1-and-start-transaction-in-mysql-have-i-misse.
Freek jansen op 13/02/2012 23:06:13:
anyone.... help .... please ... hear my dying voice begging..... .. ..
I'm trying.... :p
Freek jansen op 13/02/2012 23:06:13:
....
de code kopieren wordt nogal lang.
...
de code kopieren wordt nogal lang.
...
Alle code willen we ook niet, alleen de relevante delen.
Hoe en waar query je??
Gebruik je foutafhandeling??
Ozzie: als je het bericht leest staan er heel concreet twee issues beschreven: $_SESSION content en MySQL mutatie probleem.
vereenvoudigde code heb ik in dit bericht bijgevoegd.
SanThe: Ja, ik weet het. mijn pink was denk ik een beetje lui, dat de _ niet doorkwam. In de code kwam die door. Ik gebruik ook een PHP editor die syntax fouten en (deels?) onbekende functies aangeeft.
Jim: ja, ik heb consequent session_start() gebruikt. ook geprobeerd of aan het eind van de pagina session_write_close() iets uitmaakt in deze situatie. Niet dus.
de foutafhandeling voor mysql query had ik ook al maar daar rolt-ie zonder probleem doorheen.
Dat autocommit default voor MySQL uitstaat is bekend, ik vroeg mij echter af of PHP bepaalde defaults wijzigd. Blijkbaar niet dus.
bedankt voor 'trying'.
de code. Ik heb zaken vereenvoudigd en uit de classen gehaald om mijn probleem overzichtelijker te houden op het forum.
t1.php is een form. deze wordt in t2.php uitgelezen.
------ t2: --------
<HTML>
<HEAD>
<TITLE></TITLE>
<META NAME="Generator" CONTENT="TextPad 4.6">
<META NAME="Author" CONTENT="?">
<META NAME="Keywords" CONTENT="?">
<META NAME="Description" CONTENT="?">
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#FF0000" VLINK="#800000" ALINK="#FF00FF" BACKGROUND="?">
<div align="center">
<form action="t3.php" method="post">
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$clientid = "9876787";
$_SESSION['id'] = $clientid;
$_SESSION["name"] = $_POST['tx_name'];
$_SESSION["initials"]= $_POST['tx_initials'];
$_SESSION["sex"] = $_POST['tx_sex'];
$_SESSION["address"] = $_POST['tx_address'];
$_SESSION["city"] = $_POST['tx_city'];
$_SESSION["zip"] = $_POST['tx_zip'];
$_SESSION["country"] = $_POST['tx_country'];
$_SESSION["phone1"] = $_POST['tx_phone1'];
$_SESSION["phone2"] = $_POST['tx_phone2'];
$_SESSION["email"] = $_POST['tx_email'];
print "<p> ";
print_r ($_SESSION);
print "</p>";
?>
$clientid = "9876787";
$_SESSION['id'] = $clientid;
$_SESSION["name"] = $_POST['tx_name'];
$_SESSION["initials"]= $_POST['tx_initials'];
$_SESSION["sex"] = $_POST['tx_sex'];
$_SESSION["address"] = $_POST['tx_address'];
$_SESSION["city"] = $_POST['tx_city'];
$_SESSION["zip"] = $_POST['tx_zip'];
$_SESSION["country"] = $_POST['tx_country'];
$_SESSION["phone1"] = $_POST['tx_phone1'];
$_SESSION["phone2"] = $_POST['tx_phone2'];
$_SESSION["email"] = $_POST['tx_email'];
print "<p> ";
print_r ($_SESSION);
print "</p>";
?>
<INPUT type='button' value='Back' onClick='javascript:history.go(-1)'>
<INPUT type='submit' value='Confirm'>
</form>
</div>
</BODY>
</HTML>
------ t2 end -------- (nee, deze en de bovenste staan niet in de file. ;)
t2 output:
Array ( [id] => 9876787 [name] => myname [initials] => init [sex] => Male [address] => myaddress [city] => city [zip] => zip [country] => Belgium [phone1] => 123456 [phone2] => 654321 => [email protected] )
---------- t3 ----------------
<?php
session_start();
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>NL-PhilBox Crating & Packing List Webpage</title>
</head>
<body>
<?php
print "<p> printing session data:<br>";
print_r($_SESSION);
print "<br> printing txname: {$_SESSION['name']} </p>";
?>
</body>
</html>
---------- t3 ----------------end
printing session data:
Array ( [id] => 9876787 [name] => [initials] => [sex] => [address] => [city] => [zip] => [country] => [phone1] => [phone2] => [email] => )
printing txname:
suggesties, ideeen en anderzins hulp wordt enorm gewaardeerd.
$_SESSION["address"] = $_POST['tx_address'];
Je geeft aan dat het resultaat van t3 dit is:
Array ( [id] => 9876787 [name] => [initials] => [sex] => [address] => [city] => [zip] => [country] => [phone1] => [phone2] => => )
Als je goed kijkt dan zie je dat alleen de id nog in de sessie staat. En laat id nou de enige waarde zijn die NIET uit een POST variabele komt. Je doet namelijk dit:
$clientid = "9876787";
$_SESSION['id'] = $clientid;
Mijn vermoeden is omdat je alle SESSIE waardes in een formulier hebt gezet, deze dus:
$_SESSION['id'] = $clientid;
$_SESSION["name"] = $_POST['tx_name'];
$_SESSION["initials"]= $_POST['tx_initials'];
$_SESSION["sex"] = $_POST['tx_sex'];
$_SESSION["address"] = $_POST['tx_address'];
$_SESSION["city"] = $_POST['tx_city'];
$_SESSION["zip"] = $_POST['tx_zip'];
$_SESSION["country"] = $_POST['tx_country'];
$_SESSION["phone1"] = $_POST['tx_phone1'];
$_SESSION["phone2"] = $_POST['tx_phone2'];
$_SESSION["email"] = $_POST['tx_email'];
Dat al die SESSIE waarden met een lege POST waarde worden gevuld omdat je niks POST in het formulier.
Zet in t2 deze regel:
$_SESSION["email"] = $_POST['tx_email'];
eens BUITEN het formulier (dus onder </form>) en kijk dan eens of deze waarde in t3 WEL zichtbaar is.
ik begin mij af te vragen of er iets fout zit in de WAMP installatie. Omdat er toch wel veel essentiele zaken als global variabelen en persistence fout gaan. En ik van jullie eigenlijk begrijp dat dat niet een algemeen voorkomende situatie is.
Ik zal LAMP eens proberen op mijn ubuntu. Wie weet. Mocht iemand toch nog het licht zie voor mijn situatie, dan hoor ik dat alsnog graag.
Gewijzigd op 14/02/2012 21:55:33 door freek jansen
Vermoedelijk verwacht je dat je uit $_POST['xyz'] waardes kunt halen om te posten, alsof dit een hidden-field is. In dit geval moet ik je teleurstellen.
In het formulier post je nl niets!
De namen van de velden in het formulier zijn niet gevuld, en er is dus geen referentie. De waardes die je aangeeft wel te hebben, komen mogelijk ergens anders uit de sessie.
Je zult een formulier moeten maken met daarin de namen van de velden die je in het POST-request wilt ontvangen:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<form action="" method="post">
<input type="hidden" name="tx_some_id" value="voorbeeld_tx_some_id" />
<input type="text" name="tx_name" value="voorbeeld_tx_name" />
<input type="text" name="tx_address" value="voorbeeld_tx_address" />
<input type="submit" name="submit" value="verstuur" />
</form>
<input type="hidden" name="tx_some_id" value="voorbeeld_tx_some_id" />
<input type="text" name="tx_name" value="voorbeeld_tx_name" />
<input type="text" name="tx_address" value="voorbeeld_tx_address" />
<input type="submit" name="submit" value="verstuur" />
</form>
in dit geval kunt je de waardes 'opvangen' en verwerken in een query:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
$tx_some_id = $_POST['tx_some_id'];
$tx_name = $_POST['tx_name'];
$tx_address = $_POST['tx_address'];
$query = "INSERT INTO `some_table` ( ....) VALUES ( ".intval($tx_some_id).", ".mysql_real_escape_string($tx_name)." ...);";
....
?>
$tx_some_id = $_POST['tx_some_id'];
$tx_name = $_POST['tx_name'];
$tx_address = $_POST['tx_address'];
$query = "INSERT INTO `some_table` ( ....) VALUES ( ".intval($tx_some_id).", ".mysql_real_escape_string($tx_name)." ...);";
....
?>
Succes, en laat even weten of het is gelukt!
Gewijzigd op 14/02/2012 21:57:39 door - Jim -
De waarden zijn wel degelijk gevuld uit t1.php, zoals ik beschrijf. Deze worden ook op het scherm getoond, zoals je kunt zien, door t2.php. Op gegeven moment in t2.php is session gevuld met de juiste waarden, maar blijkbaar verliest het de waarden of krijgt mijn pagina een andere instantie van session terug in t3.php. Ik ben het spoor na al dat zoeken nu compleet bijster. Ik ben nooit echt vaak of graag met web pages bezig geweest (ik werk altijd aan back-end, persistence, business rules, etc, en wel application GUI in C++ of Swing in Java), maar zelfs met Servlets en JSP, Struts, JSF, Wicket, etc, lukt dit soort elementaire dingen nog wel.
Misschien verduidelijkt dat een beetje meer mijn frustratie en toename in twijfel mbt de kwaliteit van PHP. Vooralsnog ligt het aan mijn beperkt inzicht, maar logica in de syntax en toepassing van PHP zijn toch op zijn zachts gezegd zeer ongebruikelijk.
Gewijzigd op 14/02/2012 22:04:21 door freek jansen
Freek, nu is PHP inderdaad en niet heel perfecte taal. Alles wordt een beetje lafjes geïmplementeerd en nergens wordt echt druk over gedaan. Maar qua syntax vind ik hem nog wel meevallen. Even uit interesse, welke taal vind je nou wel perfect qua syntax en logica?
De session is iets heel anders dan de post.
Verander in t3.php:
Code (php)
eens in:
Java heeft als uitgangspunt een sterke security opzet, en andere -fout voorkomende- voordelen, hoewel met de wijzigingen vanaf JEE en SE5 daar een en ander verloren is gegaan.
Toevoeging op 14/02/2012 22:17:55:
- Jim - op 14/02/2012 22:08:59:
In t3.php dump je de $_SESSION, daar moet je $_POST dumpen om te zien wat er is gepost.
De session is iets heel anders dan de post.
De session is iets heel anders dan de post.
ja, dat verschil zie ik wel, Jim. Maar ik heb SESSION gevuld met de waarden uit de POST. Dan moeten die waarden toch gewoon bewaard blijven?
Gewijzigd op 14/02/2012 22:17:23 door freek jansen
Ik herhaal mezelf weer even:
Zet in t2 deze regel:
$_SESSION["email"] = $_POST['tx_email'];
eens BUITEN het formulier (dus onder </form>) en kijk dan eens of deze waarde in t3 WEL zichtbaar is.
De waarden staan er immers in. Kijk naar de code, en de output. De juiste waarden worden gewoon geprint in t2 maar in t3 niet meer. In de form of uit de form maakt blijkbaar niets uit. geprobeerd, geen verschil.
Dus Session wordt niet gevuld met niks, maar met de waarden die ik wil, het wordt immers geprint. Kijk even naar de code en de output.
Gewijzigd op 14/02/2012 22:23:25 door freek jansen
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);
// rest
?>
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);
// rest
?>
Toevoeging op 14/02/2012 22:30:16:
Ozzie, die onthoud hij wel.
Jij gaat van pagina t2 naar pagina t3 door een formulier te versturen. Echter, bij het versturen van het formulier worden geen waardes gepost. Met andere woorden, je overschrijft de waardes uit de sessie met een lege waarde.
Verander t2 als volgt:
------ t2: --------
Code (php) 1
<HTML>
<HEAD>
<TITLE></TITLE>
<META NAME="Generator" CONTENT="TextPad 4.6">
<META NAME="Author" CONTENT="?">
<META NAME="Keywords" CONTENT="?">
<META NAME="Description" CONTENT="?">
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#FF0000" VLINK="#800000" ALINK="#FF00FF" BACKGROUND="?">
<div align="center">
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$clientid = "9876787";
$_SESSION['id'] = $clientid;
$_SESSION["name"] = $_POST['tx_name'];
$_SESSION["initials"]= $_POST['tx_initials'];
$_SESSION["sex"] = $_POST['tx_sex'];
$_SESSION["address"] = $_POST['tx_address'];
$_SESSION["city"] = $_POST['tx_city'];
$_SESSION["zip"] = $_POST['tx_zip'];
$_SESSION["country"] = $_POST['tx_country'];
$_SESSION["phone1"] = $_POST['tx_phone1'];
$_SESSION["phone2"] = $_POST['tx_phone2'];
$_SESSION["email"] = $_POST['tx_email'];
?>
$clientid = "9876787";
$_SESSION['id'] = $clientid;
$_SESSION["name"] = $_POST['tx_name'];
$_SESSION["initials"]= $_POST['tx_initials'];
$_SESSION["sex"] = $_POST['tx_sex'];
$_SESSION["address"] = $_POST['tx_address'];
$_SESSION["city"] = $_POST['tx_city'];
$_SESSION["zip"] = $_POST['tx_zip'];
$_SESSION["country"] = $_POST['tx_country'];
$_SESSION["phone1"] = $_POST['tx_phone1'];
$_SESSION["phone2"] = $_POST['tx_phone2'];
$_SESSION["email"] = $_POST['tx_email'];
?>
</div>
<a href="t3.php">ga naar t3</a>
</BODY>
</HTML>
------ t2 end -------- (nee, deze en de bovenste staan niet in de file. ;)
En laat je verrassen...
Gewijzigd op 14/02/2012 22:35:02 door Ozzie PHP
Quote:
de code. Ik heb zaken vereenvoudigd en uit de classen gehaald om mijn probleem overzichtelijker te houden op het forum.
En hoe ziet de daadwerkelijke code eruit?
code staat hierboven