[GastForen Programmierung/Entwicklung PHP und MySQL PDF-Download – Zähler?

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

PDF-Download – Zähler?

Thobie
Beiträge gesamt: 4040

31. Jul 2013, 23:01
Beitrag # 1 von 28
Bewertung:
(14374 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Vielleicht bin ich nicht im richtigen Forum, dann bitte verschieben.

Ich will eine PDF-Datei auf meinem Server zur Verfügung stellen, möchte jedoch eine Möglichkeit haben zu prüfen, wie oft und wann sie downgeloaded wurde oder eben taglich informiert werden über die Downloads.

Lässt sich das realisieren?

Liebe Grüße


Thobie
X

PDF-Download – Zähler?

eymer
Beiträge gesamt: 468

1. Aug 2013, 10:03
Beitrag # 2 von 28
Beitrag ID: #515738
Bewertung:
(14320 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Thobie

Was für ein Server?

Falls es ein Web-Server ist, kann unter Umständen die Statistik helfen, anhand derer man sieht, welche Dateien wie oft aufgerufen wurden. -> Provider fragen, ob so was vorhanden ist. (Bei meinem Hoster ist eine einfache Statistik gratis dabei.)

Oder eine Lösung per PHP: Du veröffentlichst den Link auf eine PHP-Seite ("download.php"), diese schickt dem Anfragenden das PDF. Ausserdem wird der Zugriff in eine Datenbank geschrieben, oder es wird eine E-Mail an dich ausgelöst.

Hoffe es hilft.

Gruss vom eymer


als Antwort auf: [#515731]

PDF-Download – Zähler?

Thobie
Beiträge gesamt: 4040

1. Aug 2013, 20:57
Beitrag # 3 von 28
Beitrag ID: #515772
Bewertung:
(14272 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Moin,

kann bitte der Moderator dieses Forums dieses Posting in das PHP-Forum verschieben? Ich habe mich nun für die zweite Lösung, die eymer vorschlug, entschieden und somit ist dies eine reine PHP-Frage.

Antwort auf [ eymer ] Falls es ein Web-Server ist, kann unter Umständen die Statistik helfen, anhand derer man sieht, welche Dateien wie oft aufgerufen wurden. -> Provider fragen, ob so was vorhanden ist. (Bei meinem Hoster ist eine einfache Statistik gratis dabei.)

Dazu müsste ich in einen höheren Tarif wechseln, was aber unnötig Kosten verursacht. Außerdem ist die Statistik des Providers nicht gerade glaubwürdig. Ich soll angeblich in meinem Foodblog an einem Tag im Juli etwa 40.000 Hits gehabt habe. *lol* *unsinnig*

Antwort auf: Oder eine Lösung per PHP: Du veröffentlichst den Link auf einer PHP-Seite ("download.php"), diese schickt dem Anfragenden das PDF. Ausserdem wird der Zugriff in eine Datenbank geschrieben, oder es wird eine E-Mail an Dich ausgelöst.

Dazu habe ich zwei Scripts, die ich im Internet gefunden habe, ausprobiert, sie funktionieren aber beide nicht. Vielleicht kann einer der PHP-Kenner mal kurz darüberschauen. Es geht um die PDF-Datei, die ich in meiner Signatur verlinkt habe.

---

Script 1:

Aufzurufen mit: http://www.kreativ-schmie.de/...e/art_und_design.pdf


<?php

// verzeichnis in dem die log-datei liegt, ohne schrägstriche
$dir = "db";

// name der log-datei
$db = "counts.db";

$newlink = 1;
$url = "";
$file = $dir."/".$db;


// hier wird versucht das verzeichnis zur zähler-datei zu erstellen. das könnte man aber auch per hand...
if (!file_exists($dir)){
mkdir($dir) or die ("can't create directory!");
}

// den zu zählenden link aus der GET-übergabe fischen...
$url = $_GET['to'];


// die auszuwertende url darf nicht leer sein und muss aus mindestens vier zeichen bestehen
if ((isset($www.kreativ-schmie.de)) && (!empty($www.kreativ-schmie.de)) && (strlen($www.kreativ-schmie.de)>4)){

// falls die übergebene url nicht mit http:// oder https:// oder ftp:// beginnt wird automatisch ein http:// davorgesetzt
if (!preg_match("(^(http://|https://|ftp://))i", $url)){
$url = "http://".$url;
}

// die zähler-datei wird geöffnet und gesperrt - zwei gleichzeitige zugriffe würden die sache nur durcheinanderbringen
$getstats = fopen($file, "r+");
flock($getstats, LOCK_EX);

// die zähler-datei wird eingelesen...
$filecontent = fread($getstats, filesize($file));
$fileline = explode("\n", $filecontent);
$lines = count($fileline)-1;
rewind($getstats);

// in jeder zeile ist der auszuwertende link und die klicksumme vermerkt. das wird hier getrennt und zeilenweise abgearbeitet
for ($n = 0; $n < $lines; $n++){
$entry = explode(" $ ", $fileline[$n]);

// falls der eintrag der aktuellen zeile mit der übergebenen url übereinstimmt wird der entsprechende klick-zähler erhöht...
if ($entry[0] == $www.kreativ-schmie.de){
$entry[1]++;
} else {
// ...andernfalls wird ein script-interner zähler zur ermittlung neuer links verwendet
$newlink++;
}
$writeline = "$entry[0] \$ $entry[1]\n";
fwrite($getstats, $writeline);
}

// falls bei allen einträgen keine übereinstimmung auftrat handelt es sich wohl um einen neuen link - dann wird dieser eben angehängt
if ($newlink > $lines){
$newline = "$www.kreativ-schmie.de \$ 1\n";
fwrite($getstats, $newline);
}

// abschließend geben wir die zähler-datei wieder frei...
flock($getstats, LOCK_UN);
fclose($getstats);

// ... und lotsen den besucher zur gewünschten ressource
header("Location:" .$www.kreativ-schmie.de/art_und_design.pdf);
exit;

// und für den fall dass wirklich alles schiefgeht:
} else {
header("Location: http://www.kreativ-schmie.de");
}
?>

Gespeichert als exit.php und auf den Server gelegt. Beim Aufruf mit oben genanntem Link erscheint der Inhalt der php-Datei im Browser, mit allen möglichen Hieroglyphen für z.B. Leerzeichen.

---

Script 2

Aufzurufen mit: <a href="download.php?get file=art_und_design.pdf">Imagebroschüre/a>"

<?php

$lines=file("counter.txt"); //File in Array einlesen
$ll = $lines[count($lines)-1]; //last-line
$pos=strpos($ll,'|'); //Position bis zur ersten Pipe
$anzahl=substr($ll,0,$pos)+1;//eins auf den Zähler addieren

$zeit = date("H:i:s");
$datum=date("d.m.Y:");
$ip = $_SERVER["REMOTE_ADDR"];
$eintrag="\n$anzahl|$datum|$zeit|$ip";

$file = fopen("counter.txt", "a");
fwrite($file, $eintrag);
fclose($file);

?>

Als download.php gespeichert und auf den Server gelegt. Es passiert das Gleiche wie bei Script 1, der Inhalt der php-Datei erscheint im Browser.

Hat jemand einen Lösungsvorschlag?

Liebe Grüße


Thobie


als Antwort auf: [#515738]

PDF-Download – Zähler?

Intermedia
Beiträge gesamt: 1287

2. Aug 2013, 09:02
Beitrag # 4 von 28
Beitrag ID: #515784
Bewertung:
(14220 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Moin,

die beiden Scripte haben aber nichts mit deinem Downloadzähler zu tun, da wird kein Download gestartet sondern nur gezählt.

Was hast du mit dem ersten Script gemacht? Das kann ja so garnicht funktionieren:

$www.kreativ-schmie.de das ist eine völlig unsinnige Variable die bei php zu Fehlern führt. Siehe hier: http://php.net/...operators.string.php

Da sind noch viel mehr mystische Dinge drin.

Der Quelltext aus dem Link sieht ja ziehmlich verkorkst aus, keine Ahnung was da passiert ist.

Das PHP nicht geparst wird kann den Grund haben das der Provider php nicht unterstützt. Da kann dir dann nur der Provider helfen.


Gruß Sven

P.S. Schreib nächstes mal bitte den Code auch in Code Tags.


als Antwort auf: [#515772]

PDF-Download – Zähler?

eymer
Beiträge gesamt: 468

2. Aug 2013, 09:08
Beitrag # 5 von 28
Beitrag ID: #515785
Bewertung:
(14220 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Thobie

Unterstützt dein Server PHP überhaupt?

Wenn eine Datei die Endung ".php" hat, dann dürfte der PHP-Code eigentlich nicht im Browser sichtbar sein.

Gruss vom eymer


als Antwort auf: [#515772]

PDF-Download – Zähler?

IngoUllrich
Beiträge gesamt: 47

2. Aug 2013, 10:10
Beitrag # 6 von 28
Beitrag ID: #515789
Bewertung:
(14195 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi Thobie,

eine einfache Möglichkeit, die Downloads zu zählen, ist der Event-Tracker von Google-Analytics. Voraussetzung ist allerdings, dass Du auf Deiner Seite mit Google-Analytics arbeitest.

Dann brauchst Du auf Deiner Seite auch kein PHP. Eine sehr schöne Anleitung, was der Event-Tracker von Google alles kann und wie man Links mit dem notwendigen Javascript-Befehlen auszeichnet, damit die Downloads gezählt werden, findest Du unter folgendem Link:

https://developers.google.com/...rackerGuide?hl=de-DE

Hoffe es hilft.

Viele Grüße
Ingo


als Antwort auf: [#515731]

PDF-Download – Zähler?

Thobie
Beiträge gesamt: 4040

2. Aug 2013, 16:47
Beitrag # 7 von 28
Beitrag ID: #515815
Bewertung:
(14116 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Moin, eymer, Ulrich,

da hätte ich natürlich selbst draufkommen können und da liegt der Fehler bei der Sache, der Server unterstützt bei dieser Domain gar kein PHP. Ich müsste auf eine höheres Paket upgraden, was natürlich mit Kosten verbunden ist.

Die Sache mit Google Analytics sieht ja noch komplizierter aus als mit dem PHP. ;–) Google Analytics ist bei dieser Website eingerichtet. Bevor ich mir das alles durchlese, wäre meine Frage: Ich will den Counter nicht für eine Datei, die ich auf meiner Website bereitstelle, einrichten, sondern für eine, die ich nur auf dem Webspace zur Verfügung stelle. Den Link stelle ich über Signaturen in E-Mails und in Foren bereit. Kann das auch gezählt werden?

Liebe Grüße


Thobie


als Antwort auf: [#515789]

PDF-Download – Zähler?

Thobie
Beiträge gesamt: 4040

2. Aug 2013, 23:59
Beitrag # 8 von 28
Beitrag ID: #515822
Bewertung:
(14075 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Moin, eymer,

Google Analytics erschien mir zu kompliziert, zumal ich nicht weiß, ob eine Datei direkt vom Webspace gezählt werden kann.

Ich habe meinen Vertrag bei meinem Provider upgegradet und habe jetzt PHP-Version 5.3.27.

Wenn ich jetzt beide Scripte im Browser aufrufe, werden sie nicht mehr im Browser angezeigt, aber das Browserfenster ist leer.

Was ist da noch falsch eingestellt?

Intermedia, Du hast natürlich recht, da habe ich einen Fehler gemacht. Ich kenne mich mit PHP nicht aus und habe das Wort url durch meine url ersetzt, weil ich dachte, dass das so sein muss. Aber das scheint ein Befehl in PHP zu sein, ich habe es wieder geändert bis auf den Punkt, wo direkt auf die downzuloadende Datei verwiesen wird.

Liebe Grüße


Thobie


als Antwort auf: [#515815]
(Dieser Beitrag wurde von Thobie am 3. Aug 2013, 00:00 geändert)

PDF-Download – Zähler?

Thobie
Beiträge gesamt: 4040

3. Aug 2013, 16:58
Beitrag # 9 von 28
Beitrag ID: #515827
Bewertung:
(14027 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Moin,

hat niemand eine Lösung für eines der beiden Scripte?

Liebe Grüße




Thobie


als Antwort auf: [#515822]

PDF-Download – Zähler?

eymer
Beiträge gesamt: 468

3. Aug 2013, 18:00
Beitrag # 10 von 28
Beitrag ID: #515828
Bewertung:
(14013 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Thobie

Bei mir hat das erste Skript fast funktioniert.
Ich musste lediglich das Verzeichnis "db" und die leere Datei "counts.db" auf dem Server von Hand erstellen. Ausserdem musste ich der Datei die Schreibrechte auf "666" stellen. Sonst kann mein Server nicht in die Datei schreiben.

Hier noch "mein" Skript, als "exit.php" auf dem Server:
Code
<?php 
// verzeichnis in dem die log-datei liegt, ohne schrägstriche
$dir = "db";

// name der log-datei
$db = "counts.db";

$newlink = 1;
$url = "";
$file = $dir."/".$db;

// den zu zählenden link aus der GET-übergabe fischen...
$url = $_GET['to'];

// die auszuwertende url darf nicht leer sein und muss aus mindestens vier zeichen bestehen
if ((isset($url)) && (!empty($url)) && (strlen($url)>4)){

// falls die übergebene url nicht mit http:// oder https:// oder ftp:// beginnt wird automatisch ein http:// davorgesetzt
if (!preg_match("(^(http://|https://|ftp://))i", $url)){
$url = "http://".$url;
}

// die zähler-datei wird geöffnet und gesperrt - zwei gleichzeitige zugriffe würden die sache nur durcheinanderbringen
$getstats = fopen($file, "r+");
flock($getstats, LOCK_EX);

// die zähler-datei wird eingelesen...
$filecontent = fread($getstats, filesize($file));
$fileline = explode("\n", $filecontent);
$lines = count($fileline)-1;
rewind($getstats);

// in jeder zeile ist der auszuwertende link und die klicksumme vermerkt. das wird hier getrennt und zeilenweise abgearbeitet
for ($n = 0; $n < $lines; $n++){
$entry = explode(" $ ", $fileline[$n]);

// falls der eintrag der aktuellen zeile mit der übergebenen url übereinstimmt wird der entsprechende klick-zähler erhöht...
if ($entry[0] == $url){
$entry[1]++;
} else {
// ...andernfalls wird ein script-interner zähler zur ermittlung neuer links verwendet
$newlink++;
}
$writeline = "$entry[0] \$ $entry[1]\n";
fwrite($getstats, $writeline);
}

// falls bei allen einträgen keine übereinstimmung auftrat handelt es sich wohl um einen neuen link - dann wird dieser eben angehängt
if ($newlink > $lines){
$newline = "$url \$ 1\n";
fwrite($getstats, $newline);
}

// abschließend geben wir die zähler-datei wieder frei...
flock($getstats, LOCK_UN);
fclose($getstats);

// ... und lotsen den besucher zur gewünschten ressource
header("Location:" .$url);
exit;
// und für den fall dass wirklich alles schiefgeht:
} else {
header("Location: http://www.kreativ-schmie.de");
}
?>


Aufrufen kann man dann dein PDF so:
http://www.kreativ-schmie.de/exit.php?to=www.kreativ-schmie.de/Art_und_Design.pdf

Wobei das PDF ja gar nicht auf dem Server ist ;-)

Hoffe es hilft.

Gruss vom eymer


als Antwort auf: [#515827]

PDF-Download – Zähler?

Thobie
Beiträge gesamt: 4040

3. Aug 2013, 18:51
Beitrag # 11 von 28
Beitrag ID: #515829
Bewertung:
(14003 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Moin, eymer,

klasse, das funktioniert. YMMD!

Das Verzeichnis db und die Datei counts.db habe ich erstellt und die entsprechenden Rechte freigegeben.

Die PDF-Datei ließ sich noch nicht aufrufen, weil ich den Dateinamen auf Kleinschrift umgeändert hatte.

Jetzt bekomme ich mit der counts.db aber nur eine Datei, die kontinuierlich einfach hochzählt, wenn die PDF downgeloaded wurde.

Meine Frage ist nun, geht das noch komfortabler?

1. E-Mail-Benachrichtigung bei einem Download, wie ich es von meinem Server kenne.
2. Kein Aufsummieren, sondern kontinuierliche Auflistung eines neuen Downloads mit Uhrzeit, IP ist nicht unbedingt notwendig.

Kann man das noch irgendwie einbinden?

Liebe Grüße


Thobie


als Antwort auf: [#515828]

PDF-Download – Zähler?

Thobie
Beiträge gesamt: 4040

4. Aug 2013, 18:53
Beitrag # 12 von 28
Beitrag ID: #515848
Bewertung:
(13925 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Moin,

ich habe es jetzt nochmal mit dem zweiten Script versucht, weil das ja nicht einfach aufsummiert, sondern pro Download den Zähler, das Datum und die Uhrzeit und die IP in die Textdatei schreibt.

Dwonload.php und counter.txt habe ich auf den Server geladen und der counter.txt auch Lese- und Schreibrechte freigegeben.

<?php

$lines=file("counter.txt"); //File in Array einlesen
$ll = $lines[count($lines)-1]; //last-line
$pos=strpos($ll,'|'); //Position bis zur ersten Pipe
$anzahl=substr($ll,0,$pos)+1;//eins auf den Zähler addieren

$zeit = date("H:i:s");
$datum=date("d.m.Y:");
$ip = $_SERVER["REMOTE_ADDR"];
$eintrag="\n$anzahl|$datum|$zeit|$ip";

$file = fopen("counter.txt", "a");
fwrite($file, $eintrag);
fclose($file);

?>

Leider passiert nichts beim Aufruf mit http://www.kreativ-schmie.de/...e=art_und_design.pdf.

Hat jemand eine Lösung dafür?

Thobie


als Antwort auf: [#515829]

PDF-Download – Zähler?

eymer
Beiträge gesamt: 468

5. Aug 2013, 08:22
Beitrag # 13 von 28
Beitrag ID: #515865
Bewertung:
(13884 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Thobie

Ohne mich jetzt auch noch mit dem zweiten Script näher zu befassen, ist es m.E. klar dass nix passiert:

1) Das Skript fragt nicht ab, welche Datei verlangt wird ("getfile=xxx")
2) …und daher kann es auch nicht auf diese Datei weiterleiten.

Es wird im besten Fall protokolliert, wann und von wem die Datei "download.php" aufgerufen wurde.

Gruss vom eymer


als Antwort auf: [#515848]

PDF-Download – Zähler?

ganesh
Beiträge gesamt: 1981

5. Aug 2013, 13:03
Beitrag # 14 von 28
Beitrag ID: #515875
Bewertung:
(13855 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Das PHP File, das für den Download verantwortlich ist, muss korrekte Headers ausgeben. Standard Header ist in Browsern text/html, nicht PDF oder ZIP.

z.B.

Code
header('Content-disposition: attachment; filename=my_document.pdf'); 
header('Content-type: application/pdf');
readfile('my_document.pdf');


Die Skripts, die du da hast, sind chaotisch und unnötig kompliziert.

Du brauchst einfach eine DB-Tabelle, die zwei Felder hat: Datei + counter.
Bei jedem Aufruf des Download PHP Skripts machst du einfach ein Query à la
Code
UPDATE pdf_counter SET counter = counter+1 WHERE filename='foo.pdf' 


Email Benachrichtigung ist auch easy. Musst dich halt schon mit den Basics von PHP auseinandersetzen, du findest alles im Web...
http://php.net/...en/function.mail.php
http://php.net/...en/function.date.php
http://php.net/...variables.server.php


als Antwort auf: [#515865]
(Dieser Beitrag wurde von ganesh am 5. Aug 2013, 13:05 geändert)

PDF-Download – Zähler?

Intermedia
Beiträge gesamt: 1287

5. Aug 2013, 14:07
Beitrag # 15 von 28
Beitrag ID: #515877
Bewertung:
(13835 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Na ja, ne DB braucht man nicht unbedingt, geht auch mit Textdateien.

Glaub er meint sowas in dieser Art: http://www.intermedia-bg.de/...oad.php?pdf=test.pdf

und die Auswertung: http://www.intermedia-bg.de/down/stat.php

Gruß Sven


als Antwort auf: [#515875]
X