PHP probleme Session in iframe

Hanni2k

Commander
Registriert
Apr. 2006
Beiträge
2.866
Ich hab nen problem mit meinen Iframes. Ich muss sie leider nutzen da ich keine aktiven elemente benutzen darf, aber nen countdown von 30 auf 0 machen muss. Problem hierbei ist das ich auf die session nicht zugreifen kann.

require('include/includer.inc.php');
In dieser datei steht session_start();

Auf der Index kein problem. schreibe ich diese includer jedoch mit ins iframe, kommt eine Fehlermeldung das die Session nicht gestartet werden kann weil schon eine ausgabe kam (header already send). Auf der index.php gibt es allerdings erst am ende der datei ein echo wo alle html teile drin sind.

Ich denke durch das refreshen über die meta informationen des iframes gibt es nen problem, die restliche seite ist ausgegeben und es wird versucht im iframe die session zu übernehmen. Wie kann ich denn auf die session daten nun drauf zugreifen=?
 
Hi,
das hat mit dem Include eigentlich nichts am Hut, es klappt. Vielleicht wird aber vorher noch ein Fehler ausgegeben? Und anschließend kann dann der Header nicht gesendet werden - weil der Fehler 'ausgegeben' wurde. - Das problem hat ich mal.

Ah zu den iFrames, ich rate dringend davon ab. Eine einfache CSS Lösung klappt dafür überall, ist dafür ideal. So wie hier SomeLiving. Das benutz ich immer bei 'gefixten' Design.
 
Was ergibt die Ausgabe des Fehlerreportings?
PHP:
error_reporting( E_ALL );

Über die Verwendung von iframes wurde schon was gesagt

Warum wird session_start() nicht vor dem include initialisiert?
Was passiert genau in Deiner includer.inc.php?
Wird Dein include mehrmals verwendet? Und wenn ja, warum?
 
Hiho,

in der includer.inc.php wird meine lib.inc.php eingebunden mit einem require_once (dort stehen alle meine functionen drinne). Zudem wird dort die verbindung zur datenbank aufgebaut und die session gestartet.

aber es ist im iframe egal ob ich direkt session_start(); eingebe oder es über die include mache, es kommt jedesmal der fehler. Aber es erfolgt vorher keine ausgabe, ich speicher nämlich den ganzen html code in einer variable die erst ganz am ende ausgegeben wird.

Wenn ihr mir sagt wie ich ohne java und iframes nen countdown hinkriege der nich jedesmal die seite neu lädt kann ich auch gerne drauf verzichten >)


error_reporting( E_ALL );
macht auf der index.php keine fehlerausgabe. (waren nur ein paar fehler bei meiner date('') aufruf.).
in dem iframe selber:

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at D:\programme\xampp\htdocs\projekt\countdown.php:1) in D:\programme\xampp\htdocs\projekt\include\includer.inc.php on line 16

Warning: Cannot modify header information - headers already sent by (output started at D:\programme\xampp\htdocs\projekt\countdown.php:1) in D:\programme\xampp\htdocs\projekt\include\includer.inc.php on line 17

Zeile 1 in der countdown.php ist: <?php

zeile 16 und 17 in der includer.inc.php ist:
PHP:
session_start();
SetCookie(session_name(),session_id(),(time()+3600*24*30));
 
Zuletzt bearbeitet:
Poste bitte die zeile oder vlt. den Inhalt von countdown.php nochmal, der fehlt.
Zudem, was hat ein Countdown mit iframe zu tun? Java - klar; iframe -hä?.

Du solltest den Ihnalt des Frames in einem <div>-container ausgeben der, eine bestimmte größe hat und eine scrollleiste.

includer.inc.php scheint sauber zu sein.

Was mit Sessions (PHP) und iframe bocken kann, ist die Tatsache dass der Inhalt der Frame absolut eigenstädig ist. Theoretisch könnte sogar die Seite selbst und der iFrame inhalt einer anderen ID angehören.
 
Zuletzt bearbeitet:
Man kann ein iframe automatisch neu laden lassen ->
<meta http-equiv="refresh" content="1" URL="countdown.php">

meine idee war das nu in dem iframe in der session nen zähler mitgezählt wird und wenn der >30 ist zb. ne aktion passiert.

der iframe:

PHP:
<?php
session_start();

$body='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
 <title>Countdown</title> 
 <link type="text/css" rel="stylesheet" href="style.css"> 
 		 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
	</head>
 <body style="text-align:center; padding:0; margin:0 background-color:orange;">';
$body.='<p>Hier steht lustiger Text</p>;
$body.='</body></html>';


echo $body;
?>
 
Hi,
ja mir sind die Meta Tags bekannt. Aber einen frame durch eine Meta angabe ständig aktualisieren zu lassen... Da würde ich auf jedenfall zu JavaScripts tendieren.

Ich bin mir eigentlich sicher das der Fehler was mit PHP+Frames zu tun hat.

Für dein Problem solltest du einen JavaScript suchen der 30 sekunden nach dem besuch dich umleitet (aktion).

EDIT: Entweder hast du falsch kopiert hier hier sind gleich 2 fehler drin.
( Parse error: syntax error, unexpected '/' in D:\XAMPP\htdocs\test.php on line 13)

PHP:
$body.='<p>Hier steht lustiger Text'</p>;
$body.='</body></html>';
-du musst die Strings natürlich auch schließen, aber ansonsten funktioniert es wieder fehlerfrei.
 
Zuletzt bearbeitet:
war nen fehler von mir mit dem string, habe da paar infos rausgenommen fürs kopieren und das </p> dann falsch gesetzt. Tja dann muss ich wohl nochmal mit meinem "auftraggeber" reden, der hat mir ausdrücklioch gesagt kein javascript zu benutzen und da sind mir nur iframe eingefallen.
 
Sorry für doppelpost aber hab den fehler gefunden und will ihn der nachwelt nicht vorenthalten:

Gemeine Falle:
Mancher Editor klebt, im Unicode Modus, eine BOM an den Anfang des Scriptes. Diese "Byte Order Mark" ist leider nicht in jedem Editor sichtbar.

Ich habe nu die zeichenkodierung auf UTF-8 OHNE BOM gestellt und tadaaa es geht! schöne scheiße! danke für all eure mühe!
 
:-) Das kenn ich. Krieg es bei meinem RSS (ohne Bom) nicht weg(!) Habs aber versteckt dorthin positioniert wo es nicht mehr stört^^

PS: Du hättest es auch ohne Session's und mit den GET URl machen können (immer eine andere Zahl dranhängen), fällt mir grad so ein^^.
 
Jo,

nochmal zu Thema IFRAME, Counter und dem Reload:
so sollte es trotz reload weiterzählen, ohne IFRAME

if($_SESSION['firstvisit'] != 1) {
$_SESSION['timestamp'] = date("U");
$_SESSION['firstvisit'] = 1;
}

$now = date("U");
$bereits_verstrichen = $now-$_SESSION['timestamp'];
$counterstart = 30-$bereits_verstrichen; // z.B. 30 Sekunden
if($counterstart <= 0) { $counter = 0; }

jetzt den Counter initialisieren

$counterstart // enthält den STARTwert deines Counters

Jetzt kann man F5 drücken und trotzdem zählt er an der Sekunde weiter wo man Reload gedrückt hat!

UNTESTET!!!!!
 
Zuletzt bearbeitet:
Danke das da noch ideen kommen,
leider nicht das was ich mir gewünscht habe. Das Runterzählen soll automatisch angezeigt werden, deswegen bin ich auf den Iframe gestoßen. Ich mags auch nicht, aber ist so erwünscht.
 
ich hab da mal nen Tipp, du musst - wenn du einen i-frame verwendest- bei jeder Datei ganz oben, vor einer ausgabe das session_start(); machen.
Probiers einmal...
 
counter.php
PHP:
		if ($this->_request->reset == 1) {
			//delete cookie
			setcookie("counter", "30", time() - 3600, "/");
			echo '<meta http-equiv="refresh" content="1; URL=/core/index/counter">';
		} 
		else if (!isset($_COOKIE["counter"])) {
			setcookie("counter", "30", 0, "/");
			echo '<meta http-equiv="refresh" content="1; URL=/core/index/counter">';
		}	
		else if ($_COOKIE["counter"] <= 0) {
			echo "ALARM! ";
			echo '<a href="/core/index/counter/reset/1">reset</a>';
		}
		else {
			setcookie("counter", $_COOKIE["counter"] - 1, 0, "/");
			echo $_COOKIE["counter"];
			echo '<meta http-equiv="refresh" content="1; URL=/core/index/counter">';
		}

test.html
HTML:
<iframe src="http://pw-toxic.de/core/index/counter" frameborder="0" style="width: 100px; height: 50px"></iframe>

http://pw-toxic.de/core/index/test

da du wahrschienlich nicht mit dem zend framework arbeitest, musst du natürlich das $this->request->reset mit $_GET["reset"] austauschen, sowie die links im meta tag anpassen.
Davon abgesehn macht es imho keinen sinn, so etwas nicht mit javascript zu machen...
Desweiteren ist dieser "counter" nicht zeit-treu. (kann man aber mit den php time funktionen verbessern)
 
Zuletzt bearbeitet:
Zurück
Oben