PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Code zeitversetzt ausführen


win-tipps
17.08.2004, 00:03:03
Hallo,
ich muss ein Stück Code ausführen, allerdings erst nach 20 Sekunden Aufenthalt auf der Seite. Kann mir jemand helfen? Danke!

Oliver

LordFuture
17.08.2004, 00:12:25
Also mit PHP geht dass nicht weil PHP bereits vorbei ist wenn du die seite siehst.

Einzige Möglichkeit bietet JavaScript. Eine Art Sleep-Befehl (Warte 20 Sekunden und mach dann des) gibt es nicht, jedoch gibt es einen JS-Befehl, der eine JS-Funktion erst nach einem gewissen Zeitraum ausführt. Dass heist im Klartext du könntest mit JS auf dass Event OnLoad reagieren und die Funktion aktion() mit 20 Sekunden verzögerung ausführen. Weis aber net ob dass des gelbe vom Ei für dich ist, ich konnte damals auf jeden Fall nichts damit anfangen.

Welche Art von Aktionen willst du nach 20 Sekunden ausführen? Ein Popup starten? Eine Verarbeiten bzw. SQL-Abfrage starten? Userdaten auslesen? Meldung "Du bist seit über 20 Sekunden auf der Seite" ausgeben ;-) ?

win-tipps
17.08.2004, 00:14:56
Ich habe ein Script, welches Usern beim anklicken eines Werbebanners einige Punkte gutschreibt (MySQL). Dies soll aber erst nach 20 Sekunden passieren. Gibt's da keine Möglichkeiten?

LordFuture
17.08.2004, 00:30:01
Also nach den 20 Sekunden die Aktion zu starten mit PHP nein, JavaScript kein Thema. Ich würd sagen am nähsten liegen würde bescheißen!

Beispiel bzw. Möglichkeit: Du machst deinene Seite mit 2 Frames, einen Sichtbaren und einen mit größe 0.

Auf deiner Hauptseite bastelst du eine JS-Funktion die nach 20 Sekunden nach laden der Seite einen link im Zweiten Frame ausführt. Von mir aus:
punkteverteiler.php?user=hans&punkte=99
Als Target des links (welchen du mit deiner JS-Funktion nach 20 sekunden ausführst) gibst du den Namen deines versteckten Frames an (dass verarbeitungsscript soll ja nicht im Hauptfenster sondern versteckt im anderen Frame ablaufen).

In deinem versteckten Frame wird die verrbeitungsseite geladen und macht ihren Job. Wenn du keine Frame magst könntest du es im Prinzip auch mit einem Popup machen (Schlecht bei Blockern).

Nach 20 Sekunden passieren.
Ich nehme an du meinst wenn er sich 20 Sekunden auf der durch den Banner verlinkten seite aufhällt. Da würde ich sagen diese Seite in einem neuen Fenster oder in einem PopUp öffnen und deine JS-Funktion soll zunächst überprüfen ob dass geöffnete Fenster noch offen ist bevor es sagt OK, schreibe ihm die Punkte gut.

PS: Die JS-Funktion punktevergabe() Zeitversetzt aufrufen:

<body onload="setTimeout('punktevergabe()',20000);">


Ist halt alles a weng umständlich, aber mir fällt im Moment keine Alternative ein die nicht so ähnlich wie diese wäre und bei der der User nichts merkt (Ich nehme an der soll in aller Ruhe surfen können. Wenn du deinen Aktuelle Seite mit dem Banner neu laden lassen willst merkt er dies weil die Seite ja neu läd, aber dann kannst du dies alles mit der Seite selbst ohne Frames und Popups machen).

win-tipps
17.08.2004, 00:43:01
Hallo LordFuture,
deine Idee ist sehr gut. Danke schonmal dafür. Nur leider ist es mir für die Realisierung schon ziemlich spät und ich schlaf hier gleich ein. Du kannst dir aber mal das Script ansehen, wie es momentan aussieht und was für einen Mist ich eben grade gebaut habe :-(

Gehe auf die Seite http://points-for-you.win-tipps.de/login.php?user=Administrator&pwd=geaendert&login=1 um gleich drin zu sein. Klick oben auf Paidbanner und schau dir das mal an. Dort arbeite ich schon vorher mit Frames. Wenn du willst, kann ich dir morgen auch mal meinen chaotischen Quellcode schicken, falls du da was machen kannst.

Vielen Dank!

LordFuture
17.08.2004, 00:59:30
Hmh, bin zwar auch nur newbi hatte aber schon mit einer ähnlichen Problematik zu tun, weshalb ich da etwas im Bild bin. Ich nehme an du hast ein Script welches die Punkte hinzufügt wenn der Banner angeklickt wurde und es scheitert nur noch an dem aufrufen, oder?

Der Banner öffnet die Seite in einem neuen Fenster, sprich man müsste es abfragen können. Möglichkeit wäre auch durchaus des ganze komplett aus deiner Seite rauszuhalten und in dem _blank in dem die durch den Banner aufgerufte Seite dargestellt wird 2 Frames (1 Sichtbarer und ein Versteckter) zu erstellen. im Versteckten Frame sagst du onload aktion usw.

Brauchst quasi nur eine Datei mit 2 Frames, in einem Lädst du die Seite des Banners bei klick auf diesem und im anderen (versteckt) dein Punkte-Hinzufüge Script welches nach 20 Sekunden deine Prozdeur zum gutschreiben der Punkte aufruft.

Dein Punkte-Hinzufüge Script welches im Versteckten Frame gemeinsamt mit der Banner-Seite geöffnet wird.(hans.php):


.
.
.
<head>
<!-- Link in Übergeordneten Frame (Versteckt) ausführen
<script language="JavaScript">
function punktevergabe()
{
window.location.href = "hans.php?mode=addpoints";
}
</script>
</head>
<body onload="setTimeout('punktevergabe()',20000);">
.
.
.


Der Teil ruft dass Script neu auf.
Und nun nur noch auswerten in welchem Mode dass Script ist.

if ($_REQUEST["mode"] == "addpoints")
{
// Punkte dem User hinzufügen (Hinzufügescript aufrufen)
}
else
{
// Oben beschriebenen Code an Browser schicken und warten bis nach 20 Sekunden die Seite neu gelden wird und die IF-Schleife zutrifft.
}


Schließt der User dass neu aufgegangenen Fenster innerhalb von 20 Sekunden wird dementsprechend auch die Seite im versteckten Frame nicht neu geladen und somit auch nicht die Punkte hinzugeschrieben.

Wäre ne Möglichkeit des ganze extern zu handeln ohne was grpßartig an deinen Scripts machen zu müssen. Großartig mehr fällt mir dazu aber auch net ein. Ausprobiert hab ichs auch net, müsste aber funzen.

Gweilo
17.08.2004, 01:01:44
Ich habe jetzt nicht alles gelesen, aber ich hätte da eine idee:

du könntest die punkte in eine Tabelle temp_punkte oder so schreiben, mit dem timestamp und der user_id, dem die punkte gutgeschrieben würden. und dann beim seitenaufruf in der tabelle schauen, obs sachen drin hat, die älter als 20 sek sind und dann gutschreiben und aus der tabelle löschen. Die Punkte würden dann natürlich erst gutgeschrieben werden wenn die seite aufgerufen wird, was kein problem darstellen sollte, da die Daten des Users sowieso nicht gesehen werden in der zwischenzeit.

win-tipps
17.08.2004, 20:06:48
Hallo,
ich komm leider überhaupt nicht mit klar, diese ideale Lösung in das Script einzubauen. Ich habe es für euch mal als TXT-Datei hochgeladen, bitte (Bitte, bitte, bitte!) schaut es euch mal an und ändert es ggf. so, wie es sein soll. Danke!

Die if($verbraucht >= $gebucht) Abfrage kann erstmal egal sein, weil sie damit nichts zu tun hat.

http://points-for-you.win-tipps.de/members/extrapunkteklick.txt

LordFuture
19.08.2004, 13:43:32
Hmh, dies ist dass script welches ausgeführt wird wenn die Seite 20 Sekunden lang offen war und es schreibt dem User X Punkte gut (in SQL-DB), oder?

Wenn dem so ist dreht es sich nur darum dieses Script nach 20 Sekunden aufzurufen oder hast du Probleme mit dem Script selbst?

win-tipps
19.08.2004, 14:35:32
Hallo,
siehst du dieses Stück in den Script?

if(mysql_num_rows($mt_extrapunktereload) != 0){
echo"Reloadsperre aktiv";
}else{
$atime=time();
mysql_query("insert into mt_extrapunktereload (time,user,id) VALUES ('$atime','$user','$id')");
$mt_extrapunkte = mysql_query("SELECT * FROM mt_extrapunkte WHERE id='$id'");
while($row = mysql_fetch_array($mt_extrapunkte)) {
mysql_query("update mt_user set guthaben=(guthaben+$row[punkte]),extrapunkte=(extrapunkte+$row[punkte]) where user='$user'");
mysql_query("update mt_extrapunkte set verbraucht=(verbraucht+1) where id='$id'");
$url=$row[url];
}}

Das Überprüft, ob die Reloadsperre aktiv ist und wenn nicht, werden dem User die Punkte gutgeschrieben mysql_query("update mt_user set guthaben=(guthaben+$row[punkte]),extrapunkte=(extrapunkte+$row[punkte]) where user='$user'"); und andere Einträge vorgenommen. Dieses Stück darf erst nach 20 Sekunden aufgerufen werden.

Könnt ihr mir helfen?

meikel (†)
19.08.2004, 16:14:27
Original geschrieben von win-tipps
Ich habe ein Script, welches Usern beim anklicken eines Werbebanners einige Punkte gutschreibt (MySQL). Dies soll aber erst nach 20 Sekunden passieren. Gibt's da keine Möglichkeiten?
Na klar: speichere für jede Gutschrift zusätzlich die Zeit mit ab, ab der der Eintrag gültig sein soll. Bei der SELECT Abfrage berücksichtigst Du dann für die Summierung nur alle Einträge bis zur jeweils aktuellen Zeit.

win-tipps
19.08.2004, 18:00:11
Hallo meikel,
kannst du mir auch erklären, wie das geht bzw. mir was fertiges geben? Ich bin komplett neu bei PHP, das Script habe ich nur gekauft gehabt. :-(

LordFuture
19.08.2004, 18:17:03
Also wenn ich win-tipps richtig verstehe glaube ich net dass des Funzt. Er will es quasi als Check für Werbeaufrufe nehmen. Sprich auf seiner Seite klickt er auf einen Banner, welcher dann zu einer Seite wie z.B. E-Bay.de verweist. Sprich die ganze Prüfun und die verarbeitung muss auf seiner Seite stattfinden weil E-Bay kaum für ihn ihre Site umstrickt.

Sein Problem sehe ich darin zu Prüfen, ob die Seite 20 Sekunden lang offen war. Gut, er kann bei Aufruf sagen User X hat Seite Y um Z aufgerufen. Wie prüft man aber dann ob die Seite 20 Sekunden offen war? Ich nehme an er will die Seite in einerm neuen Fenster öffnen da seine eigene Seite nur der Werbeträger ist und der Banner nur nebensächlich. Und um die mit gespeicherte Zeit Z aus der SQL zu prüfen muss er nach 20 Sekunden eine Prüfung durchführen ob die Seite überhaupt noch offen ist und dann mittels SQL die Punkte gutschreiben.

Ich bin im Moment ziemlich mit meiner eigenen Seite beschäftigt aber ich werd ma sehen ob ich heute Abend schnell was zusammenschustern kann wie ich mir des vorstelle und du drauf aufbauen kannst.

Wenn jemand ne bessere Idee hat kein Thema, dann her damit. Bin ja leider auch nur Newbi (Stufe ich mich zumindest als einer ein.)

win-tipps
19.08.2004, 18:21:32
LordFuture, genau! Du hast jedenfalls verstanden, was ich brauche. Wie gesagt bin ich noch unerfahrener als ein Anfänger und werde demnach so eine "komplizierte" Situation kaum selber hinkriegen. Also bitte macht ein kleiens Stück Quellcode für mich, welches funktioniert. Danke!

xabbuh
19.08.2004, 20:20:50
Wenn ich das jetzt richtig verstanden habe, versuche es doch mal so:
Du hast eine index.php. In dieser ermittelst du die Zeit, zu der, der Benutzer die Seite betreten hat. Beim Klick auf den Banner öffnet sich eine neue Seite, die jedoch noch dir "gehört". An diese Seite übergibst du die Zeit, zu der der User die Seite index.php betreten hat und die Seite, die er anschließend sehen soll:

index.php
<?php
$zeit = time();
echo '<a href="seite2.php?zeit=' . $zeit . '&page=http://www.ebay.de"><img src="banner.jpg"></a>
?>

seite2.php:

<?php
$zeit = $_GET['zeit'];
if((time()-$zeit)>=20) {
// Punkte gutschreiben
}
header("Location: " . $_GET['page']);
?>

win-tipps
19.08.2004, 20:28:11
Hallo xabbuh,
hört sich ganz gut an, bin mir aber nicht sicher, ob es richtig funktioniert und kann es leider nicht testen. Mein Arbeitscomputer hat heute den Geist aufgegeben und am Ersatzrechner hab ich das alles nicht richtig eingerichtet. Das kann noch einige Wochen dauern, bis ich wieder voll da bin :-(

LordFuture
19.08.2004, 20:43:49
OK, hab ma schnell was zusammengebastelt.guckst du hier:
http://www.lodbb.de/files/wintipps/

Die Projektfiles findest du hier:
http://www.lodbb.de/files/wintipps/wintipps.zip

win-tipps
19.08.2004, 20:47:55
Danke, scheint das richtige zu sein. Kann es leider, wie gesagt, noch nicht testen. Melde mich irgendwann dann wieder :)

Gweilo
19.08.2004, 21:05:53
aufgepasst! Das ganze mit SetTimeOut ist ganz und gar nicht sicher, da kann ja jeder der ein bisschen ahnung hat gleich die neue url (http://www.lodbb.de/files/wintipps/pointmaker.php?var_pt=20&var_usr=Hans&var_status=1) aufrufen.

Und diese seite dann 10 mal reloaden, und jedes mal 20 punkte gutschreiben? nene.

Das geht nur serversided, wie meikel und ich bereits vorgeschlagen haben, musst du beim klicken die Seite neu laden, um die Zeit des drückens in der DB zu speichern, und dann halt wenn die zeit abgelaufen ist, gutschreiben (das kannst du dann wieder mit JS machen, ein reload nach 20 sekunden. Die punkte dürfen jedoch erst gutgeschrieben werden, wenn die Zeit in der Datenbank überschritten wird - was der fall sein sollte, wenn der user nicht vor den 20 sekunden reloadet)

Überlege dir immer, wie man das system ausnutzen könnte.

win-tipps
19.08.2004, 21:13:23
Also ist diese Lösung auch nicht optimal nutzbar für mich? Schade.

P.S.: Wenn es irgendwann funktioniert, gibt es für alle Mithelfer mindestens 1000 Punkte geschenkt, falls ihr euch bei mir anmeldet :)

win-tipps
19.08.2004, 21:18:24
Sag mal Gweilo, könntest du mir sowas "mal schnell" schreiben? Ich hab keine Ahnung, wie das gehen könnte. Die Anpassung an meine Datenbank / mein System kann ich selber vornehmen, nur leider den Rest nicht :-(

Gweilo
19.08.2004, 21:37:19
Original geschrieben von win-tipps
Also ist diese Lösung auch nicht optimal nutzbar für mich? Schade.

Das habe ich nicht gesagt, ich sage, bloss, das es noch nicht sicher genug ist.

Original geschrieben von win-tipps
Sag mal Gweilo, könntest du mir sowas "mal schnell" schreiben?

Ich würde dir gerne helfen, aber zur zeit habe ich echt viel zu tun. Aber wenn die bezahlung stimmt, lasse ich mich schon überreden ;c)

Komm schon, so schwer kanns doch nicht sein.
- Wie du etwas in die Datenbank schreibst und ausliest, weisst du ja.
- Wie du ein JavaScript redirect macht hast du bei lordfutures beispiel gesehen.
- Wie man Zeiten vergleicht hast du auch gesehen

Wo liegt das problem? Versuch's doch einfach mal, dann helfen wir dir, wenns dann hapert.

xabbuh
19.08.2004, 21:38:13
Gegen das Reloaden schützt mein Script natürlich nicht. Aber da könntest du ja, mit MySQL arbeiten.

Beispiel:

Tabelle page:
id int(11) auto_increment
url varchar(255)

Tabelle visited:
id int(11) auto_increment
page_id int(11)
user_id int(11)

index.php:


<?php
session_start();
$_SESSION['time'] = time();
echo '<a href="page2.php?page_id=' . $page_id . '"><img src="banner.jpg"></a>';
?>


Die Variable page_id enthält die id der Seite, die du aufrufen willst.

page2.php:

<?php
session_start();
$page_id = $_GET['page_id'];
if(($_SESSION['time']-time())>=20) {
$sql = "SELECT
COUNT(ID) AS anzahl
FROM
visited
WHERE
page_id = $page_id AND
user_id = $user_id";
$row = mysql_fetch_array(mysql_query($sql), MYSQL_ASSOC);

// User mit dieser Ip hat die Seite noch nicht aufgerufen
if($row['anzahl'] == 0) {
// Punkte gutschreiben, weiterleiten
}
?>


user_id ist die id, die der User in der Datenbanktabelle user hat.

Vorrausetzung ist natürlich, dass der Bereich nur für eingeloggte Benutzer verfügbar ist und jeder Benutzer eine eindeutige id hat. Aber davon bin ich ausgegangen, da es ansonsten auch schwer wird, die Punkte gutzuschreiben.

win-tipps
19.08.2004, 21:43:18
Tabelle page:
id int(11) auto_increment
url varchar(255)

Tabelle visited:
id int(11) auto_increment
page_id int(11)
user_id int(11)
Was bedeutet das? Ich hab keine Ahnung von Datenbanken, weiß nur wie man liest und schreibt.

xabbuh
19.08.2004, 21:46:02
Original geschrieben von win-tipps
[CODE]Tabelle page:
id int(11) auto_increment
url varchar(255)
Bedeutet:
1. Feldname: id
Feldtyp: integer bzw. int
Länge: 11
extra: auto_increment

2. Feldname: url
Feldtyp: varchar
Länge: 255


Jetzt sollte dir die zweite Tabelle auch klar werden. Wenn nicht meld dich einfach nochmal.

win-tipps
19.08.2004, 21:47:51
Was sind denn auto_increment und varchar? Und... wofür steht die Länge?

xabbuh
19.08.2004, 21:59:55
Original geschrieben von win-tipps
Was sind denn auto_increment und varchar? Und... wofür steht die Länge?

auto_increment: Dieses Feld wird beim Eintragen immer automatisch um 1 hochgezählt. Du brauchst (darfst) hier auch keinen Wert beim Eintragen angeben.

varchar: Beliebige Zeichen sind erlaubt. Bei int / integer wären zum Beispiel nur Zahlen erlaubt.

Länge: Ist die maximale Länge der Zeichenkette in diesem Feld. Alles was länger ist wird von MySQL automatisch gnadenlos abgeschnitten.



Es gibt aber noch viel mehr Typen. Schau einfach mal auf http://www.mysql.com bzw. http://www.mysql.de und such ein bisschen da herum.

win-tipps
19.08.2004, 22:03:46
Also ist auto_increment sowas wie die fortlaufende Zeilennummer in der Tabelle? Den Rest hab ich einigermaßen verstanden. Danke

win-tipps
19.08.2004, 22:16:05
Schaut doch mal rein, http://points-for-you.win-tipps.de , dort könnt ihr das System sehen, denn ich hab keine Ahnung von den "Fachgeschwätz", wovon ihr da redet. Benutzername zum Einloggen ist Administrator Passwort selfphp

Tut mir leid, dass ich euch nicht viele Auskünfte geben kann.

meikel (†)
20.08.2004, 06:29:49
Original geschrieben von win-tipps
>kannst du mir auch erklären, wie das geht

Das tat ich schon.

>bzw. mir was fertiges geben?

Nein: ich brauche sowas nicht und habe deshalb nix diesbezügliches auf Lager.

>Ich bin komplett neu bei PHP, das Script habe ich nur gekauft gehabt. :-(

Gekauft? Dann tausch es doch um oder verlange eine Nachbesserung.

LordFuture
20.08.2004, 11:18:55
Ich hab nie behauptet dass mein Script sicher wäre. Win-Tipps wollte wink mit dem Zaunpfahl wie er dies realisieren könne und ich hab ihn halt mal gepostet wie man es machen könnte. Im Script sind auch keinerlei Sicherheitsabfragen drin (Ist die Variable User gesetzt usw.) und wie Gweilo gesagt hat könnte man leicht sehr schnell zu viel Punkten kommen. (mist, hat jemand gemerkt ;-) )Wie gesagt, nur ein Beipsiel eben.

Wenn man dass Script bei sich einbindet könnte man ja wie vorgeschlagen noch zur Sicherheit vor Missbrauch die Zeit Serverseitig in der DB eintragen und dann mittels meinen Scriptvorschlages nicht die Punkte gutschreiben sondern erst Serverseitig prüfen ob die 20 Sekunden auch wirklich um sind (Wie Gweilo eben vorgeschlagen hat).

ich hab keine Ahnung von den "Fachgeschwätz"

Ich finde jedoch dass man etwas Ahnung schon haben sollte denn ich bin zu sehr mit meinen eigenen Sites beschäfftigt um hier fertige Projekte vorzulegen. Deshalb auch nur die die 0815-Version meines Vorschlages um zu verdeutlichen wie ich mir es Vorstellen könnte.