CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
PHP Grundlagen Hier kann über grundlegende Probleme oder Anfängerschwierigkeiten diskutiert werden |
24.04.2012, 11:43:53
|
Anfänger
|
|
Registriert seit: Mar 2005
Ort: Hannover
Beiträge: 3
|
|
SESSION-Variablen sind leer
Hallo,
es kann sein, das dieses Problem unter Umständen schon diskutiert wurde,
allerdings habe ich bis jetzt keine adäquate Lösung gefunden.
Auf Seite A habe ich folgendes stehen:
PHP-Code:
session_start();
$_SESSION['vid'] = getVID(...);
$_SESSION['year'] = getYear(...);
$_SESSION['vname'] = getGroup(...);
Die Funktionen geben auch das zurück, was sie sollen und die Session-Variablen werden mit Werten belegt. Diese benutze ich sogar auf der gleichen Seite, da ich diese nach dem
Absenden des Formulares nochmals aufrufe, um dann einen Datenbank-Eintrag vorzunehmen.
Daraufhin folgt ein header-Befehl, der mittels "Location:..." auf Seite B weiterleitet.
Dort beginnt die Seite ebenfalls mit
PHP-Code:
session_start();
Allerdings sind die Session-Variable $_SESSION['vid'], sowie die anderen Session-Variablen leer.
Ich habe bereits auf beiden Seiten die Session-ID ausgeben lassen und diese ist identisch.
Somit ist es ausgeschlossen, das die Session nicht vorhanden oder nicht gestartet ist.
|
24.04.2012, 14:12:33
|
|
Senior Member
|
|
Registriert seit: Feb 2006
Ort: Wallrabenstein
Alter: 55
Beiträge: 1.044
|
|
AW: SESSION-Variablen sind leer
Bei dem bischen Code, welcher uns hier zur Verfügung steht ist das mit dem orakeln immer so eine Sache. Grundsätzlich sehe ich 2 Möglichkeiten, wieso die Variablen leer sein könnten.
Variante 1
Die Session Variablen werden beim erneuten Abfragen auf Seite 1 mit leerem Inhalt überschrieben oder geleert bzw. entfernt.
Variante 2
Auf Seite 2 machst du das gleiche wie auf Seite 1.
PHP-Code:
session_start();
$_SESSION['vid'] = getVID(...);
$_SESSION['year'] = getYear(...);
$_SESSION['vname'] = getGroup(...);
Diesmal bringt getVID() etc. aber kein Ergenbis, weil sie zu diesem Zeitpunkt noch keinen Wert haben. Somit würdest du die Session Variablen überschreiben.
Doch wie gesagt, dass sind alles nur Vermutungen.
|
24.04.2012, 18:59:52
|
|
SELFPHP Guru
|
|
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
|
|
AW: SESSION-Variablen sind leer
Heiteres Session-raten Runde 4711:
Zitat:
Zitat von Re-Z
Auf Seite A habe ich folgendes stehen:
PHP-Code:
session_start();
$_SESSION['vid'] = getVID(...); $_SESSION['year'] = getYear(...); $_SESSION['vname'] = getGroup(...);
Die Funktionen geben auch das zurück, was sie sollen und die Session-Variablen werden mit Werten belegt. Diese benutze ich sogar auf der gleichen Seite, da ich diese nach dem
Absenden des Formulares nochmals aufrufe, um dann einen Datenbank-Eintrag vorzunehmen.
Daraufhin folgt ein header-Befehl, der mittels "Location:..." auf Seite B weiterleitet.
|
Äh... sollen wir jetzt raten, wie Deine Session- und Core-Config aussieht, ob Du sicherstellst, daß die Sessiondaten auch gespeichert werden, und wie der Location Header +/- 5 Zeilen aussieht?
Code:
session.use_cookies = ?
session.use_only_cookies = ?
session.use_trans_sid = ?
session.save_path = ?
register_globals = ?
open_basedir = ?
Steht vor dem header ein session_write_close()?
Beinhaltet der header einen absoluten URL und ist das Ziel dieselbe Cookie Domain?
Folgt dem header ein exit?
Zitat:
Ich habe bereits auf beiden Seiten die Session-ID ausgeben lassen und diese ist identisch.
Somit ist es ausgeschlossen, das die Session nicht vorhanden oder nicht gestartet ist.
|
Zeige lieber, wie Du auf Seite A die Session fütterst, sicherstellst, daß die Daten gespeichert werden, und ob Du auf Session-Keks setzt, weil Du beim Location header weder session_name noch session_id verwendest?
Und zeige, daß dem header ein exit folgt.
|
25.04.2012, 01:23:33
|
Anfänger
|
|
Registriert seit: Mar 2005
Ort: Hannover
Beiträge: 3
|
|
AW: SESSION-Variablen sind leer
Okay, zugegeben, meine Angaben waren sehr ungenau.
Bin davon ausgegangen, das es sich vielleicht um ein Prinzip-Fehler handelt.
Hier der relevante Quelltext der ersten Seite:
PHP-Code:
<?php session_start(); ?>
<?php
if(isset($_POST['insert']))
{
$criteria = array('vid' => $_POST['vid']);
$tempDate = getdate(time());
$insertDate = date('Y-m-d H:i:s');
$year = getActualYear();
$aValues = array( 'eingabedatum' => $insertDate,
'jahr' => $year,
'mg_vorjahr' => checkNumber($_POST['mg_vorjahr']),
'mg_zugaenge' => checkNumber($_POST['mg_zugaenge']),
'mg_abgaenge' => checkNumber($_POST['mg_abgaenge']),
'mg_bestand' => checkNumber($_POST['mg_bestand']),
'bis6_m' => checkNumber($_POST['bis6-m']),
'bis6_w' => checkNumber($_POST['bis6-w']),
'bis07_14_m' => checkNumber($_POST['bis07-14-m']),
'bis07_14_w' => checkNumber($_POST['bis07-14-w']),
'bis15_18_m' => checkNumber($_POST['bis15-18-m']),
'bis15_18_w' => checkNumber($_POST['bis15-18-w']),
'bis19_21_m' => checkNumber($_POST['bis19-21-m']),
'bis19_21_w' => checkNumber($_POST['bis19-21-w']),
'bis22_26_m' => checkNumber($_POST['bis22-26-m']),
'bis22_26_w' => checkNumber($_POST['bis22-26-w']),
'bis27_40_m' => checkNumber($_POST['bis27-40-m']),
'bis27_40_w' => checkNumber($_POST['bis27-40-w']),
'bis41_60_m' => checkNumber($_POST['bis41-60-m']),
'bis41_60_w' => checkNumber($_POST['bis41-60-w']),
'ueber_60_m' => checkNumber($_POST['ueber60-m']),
'ueber_60_w' => checkNumber($_POST['ueber60-w']),
'mgl_beitrag_6' => $_POST['bis6-beitrag'],
'mgl_beitrag_14' => $_POST['bis07-14-beitrag'],
'mgl_beitrag_18' => $_POST['bis15-18-beitrag'],
'mgl_beitrag_21' => $_POST['bis19-21-beitrag'],
'mgl_beitrag_26' => $_POST['bis22-26-beitrag'],
'mgl_beitrag_40' => $_POST['bis27-40-beitrag'],
'mgl_beitrag_60' => $_POST['bis41-60-beitrag'],
'mgl_beitrag_ue60' => $_POST['ueber60-beitrag'],
);
if(doInsert("dt4_statistik_mgl_web", $criteria))
{
$aValues['vid'] = $_SESSION['vid'];
$sTable = "dt4_statistik_mgl_web";
$sType = "insert";
$sQuery = queryBuilder($sTable, $aValues, $sType);
$cInsertQuery = new cDBInsertQuery();
$cInsertQuery->setQuery($sQuery);
$cInsertQuery->runQuery();
}
else
{
$sTable = "dt4_statistik_mgl_web";
$sType = "update";
$sQuery = queryBuilder($sTable, $aValues, $sType);
$cUpdateQuery = new cDBUpdateQuery();
$cUpdateQuery->setQuery($sQuery);
$cUpdateQuery->runQuery();
}
// auf die naechste Seite weiterleiten
// $_GET['vid'] wird mitgegeben
//header("Location: statistik-02.php?vid=".$_SESSION['vid']);
header("Location: statistik-02.php");
}
?>
<?php
$vid = getVID($_GET['op_id']);
$lsbnr = $_GET['op_id'];
$verein = getAssociationName($vid);
$year = getActualYear();
$yearBefore = getYearBefore(getActualYear());
$_SESSION['vid'] = $vid;
$_SESSION['lsbnr'] = $lsbnr;
$_SESSION['verein'] = $verein;
logVisit($_SESSION['lsbnr'], $_SESSION['vid']);
echo session_id();
?>
...
<form method="post" name="statistik" action="statistik-01.php" onSubmit="return sendMe">
...
<input name="op_id" type="hidden" value="<?php echo $lsbnr; ?>" />
<input name="vid" type="hidden" value="<?php echo $vid; ?>" />
<input name="insert" type="hidden" value="true" />
</form>
Nun folgend der relevante Quelltext der zweiten Seite:
PHP-Code:
<?php session_start(); ?>
<?php echo session_id(); ?>
<?php
if(isset($_POST['insert']))
{
$vid = $_SESSION['vid'];
$id = getMaxID($vid);
$anzahl = getMemberCount($id);
$criteria = array('vid' => $_SESSION['vid']);
$aValues = array( 'sonstigebeh_m' => checkNumber($_POST['sonstigebeh_m']),
'sonstigebeh_w' => checkNumber($_POST['sonstigebeh_w']),
'nb_m' => checkNumber($_POST['nb_m']),
'nb_w' => checkNumber($_POST['nb_w']),
'tn_kk_m' => checkNumber($_POST['tn_kk_m']),
'tn_kk_w' => checkNumber($_POST['tn_kk_w']),
'tn_bg_m' => checkNumber($_POST['tn_bg_m']),
'tn_bg_w' => checkNumber($_POST['tn_bg_w']),
'tn_bei_m' => checkNumber($_POST['tn_bei_m']),
'tn_bei_w' => checkNumber($_POST['tn_bei_w']),
'tn_ol_m' => checkNumber($_POST['tn_ol_m']),
'tn_ol_w' => checkNumber($_POST['tn_ol_w']),
'tn_nb' => checkNumber($_POST['tn_nb']),
'passive' => checkNumber($_POST['passive']),
'vereinsaerzte' => checkNumber($_POST['vereinsaerzte']),
'herzgruppenaerzte' => checkNumber($_POST['herzgruppenaerzte']),
'gemeldete_unf' => checkNumber($_POST['gemeldete_unf']),
'unf_jugendlicher' => checkNumber($_POST['unf_jugendlicher']),
'unf_uel' => checkNumber($_POST['unf_uel']),
'unf_aerzte' => checkNumber($_POST['unf_aerzte'])
);
$sTable = "dt4_statistik_mgl_web";
$sType = "update";
$sQuery = queryBuilder($sTable, $aValues, $sType);
echo "<br />";
echo $sQuery."<br />";
echo "<br />";
$cUpdateQuery = new cDBUpdateQuery();
$cUpdateQuery->setQuery($sQuery);
$cUpdateQuery->runQuery();
// auf die naechste Seite weiterleiten
// $_GET['vid'] wird mitgegeben
//header("Location: statistik-03.php?vid=".$vid);
}
?>
<?php
// uebergebene vereins-id
$vid = $_SESSION['vid'];
echo $_SESSION['vid']."vid: ".$vid."<br />";
$id = getMaxID($vid);
echo "id: ".$id."<br />";
$anzahl = getMemberCount($id);
$year = getActualYear();
$yearBefore = getYearBefore(getActualYear());
?>
...
<form name="statistik" method="post" action="statistik-02.php" onSubmit="return sendMe">
<input name="sendme" type="button" value="weiter" onClick="sendMe=true;submit()" />
<input name="vid" type="hidden" value="<?php echo $_SESSION['vid']; ?>" />
<input name="insert" type="hidden" value="true" />
...
</form>
Hier nochmal meine Session Infos
Code:
session
Session Support enabled
Registered save handlers files user
Registered serializer handlers php php_binary wddx
Directive Local Value Master Value
session.auto_start On On
session.bug_compat_42 Off Off
session.bug_compat_warn Off Off
session.cache_expire 180 180
session.cache_limiter nocache nocache
session.cookie_domain no value no value
session.cookie_httponly Off Off
session.cookie_lifetime 0 0
session.cookie_path / /
session.cookie_secure Off Off
session.entropy_file no value no value
session.entropy_length 0 0
session.gc_divisor 1000 1000
session.gc_maxlifetime 1440 1440
session.gc_probability 1 1
session.hash_bits_per_character 5 5
session.hash_function 0 0
session.name PHPSESSID PHPSESSID
session.referer_check no value no value
session.save_handler files files
session.save_path /var/www/php /var/www/php
session.serialize_handler php php
session.use_cookies On On
session.use_only_cookies On On
session.use_trans_sid 0 0
|
25.04.2012, 03:45:28
|
|
SELFPHP Guru
|
|
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
|
|
AW: SESSION-Variablen sind leer
1. teste bitte, ob das Script in /var/www/php schreiben darf.
2. die Angaben fehlen noch:
Code:
register_globals = ?
open_basedir = ?
register_gloabls muß auf Off stehen.
Falls open_basedir gesetzt ist, muß der Zugriff auf den session.save_path erlaubt sein, damit PHP dort das session file anlegen darf.
3. sowas:
PHP-Code:
<?php session_start(); ?> <?php
ist falsch, weil sich zwischen close tag und dem nächste open tag ein Zeilenumbruch befindet. Der ist dann schon HTTP Content. Eigentlich müßte der header ein paar Zeilen tiefer daran scheitern.
4. vor dem header fehlt das session_write_close();
5. der header beinhaltet keinen absoluten URL.
6. das exit nach dem header fehlt.
Sowas:
PHP-Code:
$vid = getVID($_GET['op_id']); # <-- $lsbnr = $_GET['op_id']; # <-- $verein = getAssociationName($vid);
$year = getActualYear(); $yearBefore = getYearBefore(getActualYear());
$_SESSION['vid'] = $vid; $_SESSION['lsbnr'] = $lsbnr; $_SESSION['verein'] = $verein;
ist sinnfrei, bei einem POST Request GET Variable zu suchen. Noch sinnfreier isses, weil der Client ja eigentlich nach Empfang des Location headers dem folgt und weg ist. Ob PHP dann das Script sozusagen "vor leeren Rängen" noch bis zum Ende ausführt, bezweifle ich, weil sich der Client ja eigentlich jeden weiteren Content ja verbitten müßte.
Das Füttern der Session muß also vor dem Location header erfolgen.
Sowas getVID($_GET['op_id']) müßte auch eine Warnung produzieren, wenn der Index op_id nicht existiert, aber wahrscheinlich verzichtest Du wohl auf die Fehlerausgabe und fragst lieber im Forum...
|
25.04.2012, 12:15:27
|
Anfänger
|
|
Registriert seit: Mar 2005
Ort: Hannover
Beiträge: 3
|
|
AW: SESSION-Variablen sind leer
Es ist nicht so, das ich auf eine Fehlerausgabe verzichte, ganz im Gegenteil, ich nutze Exception-Classes.
Die register_globals, open_basedir und session.save_path sind korrekt gesetzt.
An sowas:
PHP-Code:
<?php session_start(); ?>
<?php
scheitert der Header nicht, das wird großzügig toleriert.
PHP-Code:
<?php session_start(); ?>
<?php
hingegen führt tatschlich zum scheitern des Headers.
session_write_close() ist meines Erachtens nicht zwingend notwendig.
Führt zwar zu einem besseren Stil und ergibt auch Sinn, ist aber kei muss.
Nur weil der Header keine absolute URL hat, bedeutet das nicht, das die
SESSION-Variablen leer sind.
Sowas:
PHP-Code:
$vid = getVID($_GET['op_id']); # <--
$lsbnr = $_GET['op_id']; # <--
$verein = getAssociationName($vid);
$year = getActualYear();
$yearBefore = getYearBefore(getActualYear());
$_SESSION['vid'] = $vid;
$_SESSION['lsbnr'] = $lsbnr;
$_SESSION['verein'] = $verein;
ist alles andere als sinnfrei, da das POST mit einem
PHP-Code:
if(isset(...)){...}
versehen ist.
Die GET-Variable wird beim ersten Aufruf der Seite mitgegeben und
erfüllt durchaus seinen Zweck.
Ebenso ist die Kombination von POST und GET nicht unüblich.
Faktum ist, das ohne die exit-Funktion nach dem Header das Skript trotzdem weiter arbeitet und somit auf Grund der dann fehlenden GET-Variable die SESSION-Variablen mit leerem Inhalt überschreibt.
Somit verbittet sich, entgegen Deiner Meinung, der Client NICHT jeden weiteren Content.
Im Endeffekt hat schlicht und ergreifend das "exit()" gefehlt.
|
25.04.2012, 15:21:56
|
|
Senior Member
|
|
Registriert seit: Feb 2006
Ort: Wallrabenstein
Alter: 55
Beiträge: 1.044
|
|
AW: SESSION-Variablen sind leer
Nur weil etwas funktioniert solltest du gute Ratschläge auf korrektes bzw. sauberes Skripting nicht ausschlagen. Immerhin würde dir dies jegliche Fehlersuche ersparen, wenn sich bei dir systemseitig etwas ändern würde.
php.net
Zitat:
Hinweis:
HTTP/1.1 verlangt einen absoluten URI inklusive dem Schema, Hostnamen und absoluten Pfad als Argument von » Location:, aber manche Clients akzeptieren auch relative URIs. ....
|
Zitat:
Hinweis:
Die Session-ID wird nicht mit dem Location-Header übermittelt, selbst wenn session.use_trans_sid eingeschaltet ist. Sie muss daher manuell durch Verwendung der SID-Konstante hinzugefügt werden.
|
Auf das fermutete Fehler von exit; wurdest du schon hingewiesen bevor du dein Script gepostet hast.
|
25.04.2012, 16:17:49
|
|
SELFPHP Guru
|
|
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
|
|
AW: SESSION-Variablen sind leer
Zitat:
Zitat von Re-Z
Es ist nicht so, das ich auf eine Fehlerausgabe verzichte, ganz im Gegenteil, ich nutze Exception-Classes.
|
Wenn diese Klasse Dich nicht auf nicht initialisierte Variable hinweist, kannste den Kram in die Tonne latschen.
Zitat:
Die register_globals, open_basedir und session.save_path sind korrekt gesetzt.
|
Wenn Du meinst...
Zitat:
An sowas:
PHP-Code:
<?php session_start(); ?> <?php
scheitert der Header nicht, das wird großzügig toleriert.
|
Das wäre ein Bug, weil sich der Zeilenumbruch außerhalb der PHP Tags befindet. Der HTTP Header wird nach der ersten Leerzeile beendet und der Rest rangiert unter Body. Dem Apachen ist sowas Wurscht, weil der eh nur Text liefert. Offenbar toleriert Dein Browser solchen Mist.
Zitat:
session_write_close() ist meines Erachtens nicht zwingend notwendig.
Führt zwar zu einem besseren Stil und ergibt auch Sinn, ist aber kei muss.
|
Da es in der Vergangenheit PHP Versionen gab, die bei vorzeitigen Abbruch das Session file nicht komplettierten, war diese Funktion kriegsentscheidend. Und da ich faul bin, rufe ich diese Funktion auf, weil es für geregelte Verhältnisse sorgt.
Zitat:
Nur weil der Header keine absolute URL hat, bedeutet das nicht, das die
SESSION-Variablen leer sind.
|
Nö.
Zitat:
HTTP/1.1 verlangt einen absoluten URI inklusive dem Schema, Hostnamen und absoluten Pfad als Argument von » Location:, aber manche Clients akzeptieren auch relative URIs. Gewöhnlich können Sie mittels $_SERVER['HTTP_HOST'], $_SERVER['PHP_SELF'] und dirname() aus einem relativen Link einen absoluten URI selbst erstellen:
|
Daß sowas dem einen oder anderen Browser wohl egal ist, bdeutet noch lange nicht, daß man ungestraft darauf verzichten kann.
Zitat:
Sowas:
PHP-Code:
$vid = getVID($_GET['op_id']); # <-- $lsbnr = $_GET['op_id']; # <-- $verein = getAssociationName($vid);
$year = getActualYear(); $yearBefore = getYearBefore(getActualYear());
$_SESSION['vid'] = $vid; $_SESSION['lsbnr'] = $lsbnr; $_SESSION['verein'] = $verein;
ist alles andere als sinnfrei, da das POST mit einem
PHP-Code:
if(isset(...)){...}
versehen ist.
|
Falsch. Wenn $_GET['op_id'] nicht existiert, wirft der Aufruf der Funktion ne Warnung alá not defined index op_id. Wäre PHP ein ordentlicher Compiler, gäbs an der Stelle nen Abbruch mit ner Fehlermeldung.
Zitat:
Ebenso ist die Kombination von POST und GET nicht unüblich.
|
Ja leider. Manche sind so schlampig, bei einem POST Request einen Teil der Variablen an das Action Attribut dranzupappen.
Zitat:
Faktum ist, das ohne die exit-Funktion nach dem Header das Skript trotzdem weiter arbeitet und somit auf Grund der dann fehlenden GET-Variable die SESSION-Variablen mit leerem Inhalt überschreibt.
|
Fehlerhafte EVA Konstruktion.
Zitat:
Somit verbittet sich, entgegen Deiner Meinung, der Client NICHT jeden weiteren Content.
|
Das ist browserabhängig. Wenn der Browser im Protokoll nen Location Header bekommt, müßte er dem eigentlich folgen und den restlichen sinnfreien Sums des Servers abweisen, weil es bei diesem Header keinen Body geben darf.
Zitat:
Im Endeffekt hat schlicht und ergreifend das "exit()" gefehlt.
|
Genau. Mir fehlten allerdings noch die Zeilen, in denen VOR dem Header die Session gefüttert wird.
Mein restlicher Text sind lediglich Tips, sauber zu programmieren. Meine Scripte funktionieren nämlich auch mit error_reporting(-1).
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
Ansicht |
Linear-Darstellung
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 16:31:24 Uhr.
|