• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Frage User bestimmte Seite nur einmal öffnen lassen

360rulez

Neues Mitglied
Hallo Leute,

gibt es Möglichkeiten, wie ich einem User erlaube, dass er eine Seite nur einmal gleichzeitig öffnen kann, also z.B. test.php nicht in zwei Tabs/Fenstern öffnet? Welche Methoden gibt es? Ich finde wohl keinen passenden Suchbegriff... denn ich finde einfach nichts vernünftiges!

Lieben Gruß,
Marco
 
Werbung:
Wenn du nicht von eingeloggten Usern redest, wirst du keine 100% sichere Lösung finden
 
Werbung:
Es gibt diese Möglichkeit, ist ja auch nicht so schwer! Wenn die Seite das 1. Mal gestartet wird schaffst du einen Cookie, wie etwa test_aktiv = 1. Wenn die Seite nochmal aufgemacht wird, wird überprüft, ob der Cookie existiert und dann ggf. die Ausführung des Skripts sofort beendet (evtl. mit dem Hinweis darauf, dass die Seite bereits woanders geöffnet ist).

Wenn du sie Seite verlässt, solltest du mit dem JavaScript - Event "onunload" ein Skript starten, welches den besagten Cookie wieder killt, so dass einer erneuten Öffnung der Seite nichts im Wege steht. Reicht dir das oder brauchst du mehr Details?
 
Klingt schonmal sehr gut. Weisst du zufällig, wo ich ein Beispiel finden könnte, bzw. gibt es womöglich eine Anleitung? Kann zwar ein wenig HTML u.s.w. aber das war's dann auch wieder :/
 
Werbung:
O.k., ist sicher auch möglich, hier kenne ich mich nicht aus. Und falls du trotzdem wissen möchtest wie Cookies oder Sessions funktionieren, empfehle ich zum absoluten Einstieg in PHP die Seite www.php-einfach.de

Und sonst - mit "onunload" habe ich bisher auch keine Erfahrung, du findest aber bestimmt paar Beispiele im Netz. "Onunload" wird dann eine javascript - Funktion öffnen, du solltest also den elementaren Aufbau von JavaScript kennen. Ganz ohne Literatur und Basiswissen über PHP / JavaScript wird es leider nicht gehen!
 
O.k., jetzt doch ein kleines Bsp. Die PHP -Seite öffnet einen Cookie:
Code:
<?php
if (isset($_COOKIE["seite_offen"])) {
  $seite_offen = $_COOKIE["seite_offen"];
  if ($seite_offen == 1) {
// Die Seite ist bereits offen, also Ende
  exit;
  }
}
setcookie("seite_offen",1,0);

// Wenn das Script hier noch durchgeführt wird, gibt es scheinbar keinen Cookie, also ist die Seite woanders nicht offen (oder dem Browser sind Cookies egal)  - um auszuschliessen, dass Cookies einfach nur deaktiviert sind, wird das Script jetzt wiederum unterbrochen, wenn du keinen Cookie hast

if (!isset($_COOKIE["seite_offen"])) {exit;}
?>

<html>
<body onunload="f_close()">
<!-- viel HTML Code -->

<script>
function f_close() {
  myWindow = window.location.href = "cookie_killer.php";
}
</script>
</body>
</html>

In der Seite cookie_killer.php müsste dann etwa so etwas stehen:

Code:
<?php
setcookie("seite_offen",0,time ()-3600)

?>
Dadurch dass du die Gültigkeit des Cookies um 3600 Sekunden in der Vergangenheit festlegst, killst du ihn. Es ist etwa so als ob du ihm sagen würdest: "Seit einer Stunde gibts dich nicht mehr".

Das also in Kürze und ohne Gewähr - habe das Skript jetzt schnell zusammengeschustert und selber nicht ausprobiert! :-) Gib einfach Bescheid, falls es nicht funktioniert!
 
Werbung:
Noch was - das garantiert aber nur, dass das Fenster innerhalb eines Browsers höchstens 1 x geöffnet wird. Mit einem anderen Browser kannst du die Seite dann trotzdem parallel öffnen - hier sind die Cookies des ersten Browsers nicht gültig.
 
Erstmal vielen Dank für den Code. Habe nun alles gemacht, wie ich soll - rufe ich jetzt die Seite auf bleibt diese einfach nur weis ohne irgendwas. Klappt also wohl nicht wie es soll :(

An die anderen Beiträge: Schaue ich mir heute, spätestens morgen auch mal an.
 
O.k. - habe es getestet.
Code:
<?php
if (isset($_COOKIE["seite_offen"])) {
  $seite_offen = $_COOKIE["seite_offen"];
  if ($seite_offen == 1) {
// Die Seite ist bereits offen, also Ende
  echo "Die Seite kann nicht nochmal geoeffnet werden";
  exit;
  }
}
setcookie("seite_offen",1,0);
?>
Soweit funktioniert es - es wird ein Cookie angelegt welcher verhindert, dass die Seite nochmal aufgemacht wird. Allerdings kann die Existenz des Cookie scheinbar nicht schon zwei Zeilen weiter unten geprüft werden, das geht erst beim neuen Laden der Seite.

Leider hat das Killen des Cookie beim Zumachen des Fensters auch nicht geklappt - denn der JavaScript-Befehl gibt eine ADresse an, welche iin einem Fenster aufgehen sollte, es ich habe ja kein Fenster mehr, wenn ich es zumache. Allei mit Java Script aber werde ich den Cookie nicht löschen können.

Ist noch ein bisschen bastelbedürftig! Ich mache mir mal den Tag über Gedanken darüber.
 
Werbung:
Sorry, dass ich gestern nicht mehr geantwortet habe - war'n harter Tag. Also ich hab's heute nach einigen Versuchen dann irgendwann erstmal aufgegeben und hoffe - da du ja meintest du würdest dir noch Gedanken drüber machen, ob du viellt. eine Möglichkeit gefunden hast?
 
Soweit funktioniert es - es wird ein Cookie angelegt welcher verhindert, dass die Seite nochmal aufgemacht wird. Allerdings kann die Existenz des Cookie scheinbar nicht schon zwei Zeilen weiter unten geprüft werden, das geht erst beim neuen Laden der Seite.

Cookie ist unnötig. Das geht rein mit JavaScript.

Code:
<a href="http://google.de">Link</a>

$(function() {
    $('a').on('click', function(event) {
        event.preventDefault();
        if (localStorage.getItem('foo')) {
            return false;
        } else {
            localStorage.setItem('foo', 'bar');
            window.open($(this).prop('href'), '_blank');
        }
    });
    $(window).on('unload', function() {
        localStorage.removeItem('foo');
    });
})

Der tricky Part ist allerdings, dass der DOM Storage für die jeweilige Session oder persistent belegt werden kann. D.h. entweder funktioniert der Link in einem neuen Tab oder nach dem ersten Klick gar nicht mehr. Dem zweiten Fall ließe sich mit einem unload begegnen, wobei der Redirect dann nicht mit location.href sondern window.open() (als Alterantive zu target='_blank') durchgeführt werden muss.
 
Cookie ist unnötig. Das geht rein mit JavaScript.

Code:
<a href="http://google.de">Link</a>

$(function() {
    $('a').on('click', function(event) {
        event.preventDefault();
        if (localStorage.getItem('foo')) {
            return false;
        } else {
            localStorage.setItem('foo', 'bar');
            window.open($(this).prop('href'), '_blank');
        }
    });
    $(window).on('unload', function() {
        localStorage.removeItem('foo');
    });
})

Der tricky Part ist allerdings, dass der DOM Storage für die jeweilige Session oder persistent belegt werden kann. D.h. entweder funktioniert der Link in einem neuen Tab oder nach dem ersten Klick gar nicht mehr. Dem zweiten Fall ließe sich mit einem unload begegnen, wobei der Redirect dann nicht mit location.href sondern window.open() (als Alterantive zu target='_blank') durchgeführt werden muss.

Danke dir schonmal, gebe das mal meinem Kumpel weiter, der Teil mit der Session oder persistent ist mir selbst noch etwas "zu hoch". Danke dir trotzdem schonmal für deine Bemühung und ich melde mich baldigst und sage obs zum Erfolg geführt hat :)
 
Werbung:
Das obige Beispiel leitet zu einer fremden Domain weiter. Bei Redirects innerhalb der eigenen Domain wäre die target='_blank' Simulation per window.open() überflüssig, weil sich der aufgerufenen Seite ein unload() Event mitgeben ließe.

Mir ging es hier in erster Linie darum, zu zeigen, wie sich die Aufgabe clientseitig ohne Cookies und Server-Requests lösen lässt.
 
So, habe vorhin etwas Zeit gehabt und mich nochmal dem Problem angenommen. Habe nun folgenden Code gefunden:

<script type="text/javascript">
var framekiller = true;
window.onbeforeunload = function() {
if(framekiller) {
return "place your message here"; // ..
}
};
</script>

Der return-Teil mit "hier deine Nachricht" greift zwar (zumindestens unter Firefox) nicht - aber an sich funktioniert der Code. Habe nun folgendes Problem. Setze ich ihn in den <head>-Bereich meiner Datei fragt er vonwegen Seite wirklich verlassen, evtl. nicht gespeichertes geht verloren und das soll er ja nicht, sodern nur wenn weitergeleitet werden soll.


Der User klickt einen Banner, verweilt dort X Sekunden und schließt die Seite wieder. Ziel ist es, dass der User auf der Seite bleibt und nicht durch Framebraker weitergeleitet wird. Bei Beispiel 1 fragt er aber auch nach dem schließen - wenn er nicht weiterleitet, sondern den Tab schließt.

Beispiel 1
<head>
<title><?=ucfirst($werbart);?> - <?=$settings['projektname'];?></title>
<script type="text/javascript">
if(top!=self) top.location=self.location;
</script>
<script type="text/javascript">
var framekiller = true;
window.onbeforeunload = function() {
if(framekiller) {
return "place your message here"; // ..
}
};
</script>

</head>
<frameset rows="40,*,25" frameborder="1" border="1" framespacing="1" noresize>
<frame name="Navigationsframe" src="<?=$werbort;?>.php?id=<?=$kampagne['id'];?>&xset=waiting" scrolling="no" noresize>
<frame name="Hauptframe" src="<?=$werbort;?>.php?id=<?=$kampagne['id'];?>&xset=checking">
<frame name="Unterframe" src="unterframe.php?name=<?=$settings['projektname'];?>" scrolling="no" noresize>
</frameset>
<noframes>
<body>
</body>
</noframes>


Der fettmarkierte Code müsste eigentlich in den <frame-Bereich mit dem Namen "Hauptframe" - sodass nur dort das ungewollte weiterleiten unterdrückt wird, man aber ohne Meldung das Fenster/den Tab schließen kann.


Beispiel 2
<head>
<title><?=ucfirst($werbart);?> - <?=$settings['projektname'];?></title>
<script type="text/javascript">
if(top!=self) top.location=self.location;
</script>
</head>
<frameset rows="40,*,25" frameborder="1" border="1" framespacing="1" noresize>
<frame name="Navigationsframe" src="<?=$werbort;?>.php?id=<?=$kampagne['id'];?>&xset=waiting" scrolling="no" noresize>
<frame name="Hauptframe" src="<?=$werbort;?>.php?id=<?=$kampagne['id'];?>&xset=checking">
<script type="text/javascript">
var framekiller = true;
window.onbeforeunload = function() {
if(framekiller) {
return "place your message here"; // ..
}
};
</script>

<frame name="Unterframe" src="unterframe.php?name=<?=$settings['projektname'];?>" scrolling="no" noresize>
</frameset>
<noframes>
<body>
</body>
</noframes>

Bei Beispiel 2 passiert gleich null. Hat jemand eine IDee?
 
Warum kommst du jetzt mit diesem Frameset Zeug aus der Mottenkiste? Ich hatte dir einen leicht nachvollziehbaren und ausbaufähigen Ansatz geliefert. Aber wenn du die Antworten auf deine Fragen ignorierst, musst du dich nicht wundern, dass die Fragen zukünftig keine Beachtung mehr finden, und sollte es dir lediglich darum gehen, unter Vermeidung eigenen Lernaufwands kopierfähige Scripte von anderen Usern zu erhalten, bist du hier falsch. Dafür gibt es die Jobbörse.
 
Werbung:
Warum kommst du jetzt mit diesem Frameset Zeug aus der Mottenkiste? Ich hatte dir einen leicht nachvollziehbaren und ausbaufähigen Ansatz geliefert. Aber wenn du die Antworten auf deine Fragen ignorierst, musst du dich nicht wundern, dass die Fragen zukünftig keine Beachtung mehr finden, und sollte es dir lediglich darum gehen, unter Vermeidung eigenen Lernaufwands kopierfähige Scripte von anderen Usern zu erhalten, bist du hier falsch. Dafür gibt es die Jobbörse.


Ehm entschuldige... aber deine Vorwürfe sind jetzt doch etwas unpassend.

1.) Ich komme mit diesem Frameset-Zeug, weil die Datei, die ich bearbeiten möchte nun mal von Grund auf so gebaut ist. Vielleicht erkläre ich hierzu noch, dass ein Freund und Ich einen sog. Paidmailer führen. Dies ist ein komplettes Script, was wir uns ganz normal im Shop vom Hersteller gekauft haben und nun nach und nach unseren Wünschen anpassen.

2.) Ich lese jede Antwort und bin genauso dankbar über jede Antwort, jeder Ansatz der mir helfen könnte. Ich ignoriere sicherlich keine Antworten und versuche auch aus allem was man mir z.B. erklärt oder zeigt auch etwas sinnvolles hinzubekommen, bisher wohl leider nicht mit all so großem Erfolg.

3.) Es geht mir auch nicht darum, dass ich alles fix und fertig haben will, damit ich nichts lernen muss. Im Gegenteil - ich beschäftige mich schon einige Zeit mit HTML, CSS und seit kürzerer Zeit auch immer mehr mit PHP und werde auch sicherlich weiterhin versuchen mein Wissen auszubauen.

Ich hoffe ich konnte meine Sicht/Lage nun auch dir etwas besser rüberbringen. Ich bin dankbar über jede Hilfe die ich bekomme, über jeden der mir seine Zeit gibt, in dem er hier eine Antwort abgibt und möchte sicherlich nicht einfach irgendwas kopieren. Finde es echt mies, dass man mich nun hier anmacht, dass ich die Hilfen/Antworten ignoriere und womöglich sogar nichts selbst raffen will, sondern nur kopieren möchte.

Hat denn jemand evtl. eine wirkliche Hilfe/Tipp/Ansatz? Vermutungen und Vorurteile bekam ich ja nun leider schon - warum auch immer - vom lieben Tronjer.
 
Zurück
Oben