Autor | Zpráva | ||
---|---|---|---|
jan.rok Profil * |
#1 · Zasláno: 5. 9. 2011, 19:16:49
Jak by se dalo pomocí php a mysql zaznamenat datum, kdy bylo kliknuto na určitý odkaz?
Představa je taková: Na stránce jsou odkazy s pdf soubory a chtěl bych vědět, jestli na konkrétní pdfko někdo kliknul v určitý den (o víkendu). Představuju si, že po kliknutí se provede zápis do mysql databáze, zaznamená se datum, čas, id pdf souboru. Nevím ale, jak zajistit dohromady otevření pdfka v novém okně a zároveň vyvolání php skriptu. Zkouším to takhle: <a href="soubor.pdf" target="_blank" onclick="php_skript.php;">Zde je soubor PDF</a> PDF v novém okně se otevře, záznam se ale neprovede. Jdu správnou cestou, anebo se to řeší jinak? Díky za náměty. JR |
||
ninja Profil |
#2 · Zasláno: 5. 9. 2011, 20:03:15
V zásadě jdete správnou cestou, jen je komplikovanější. Hledejte magické slůvko AJAX.
Další možnost je odkazovat pouze na PHP skript, který provede zápis o stažení a následně pošle na výstup vlastní PDF soubor. |
||
Sir Tom Profil |
#3 · Zasláno: 5. 9. 2011, 20:05:02
jan.rok:
Kliknu na odkaz (s proměnnou nebo parametrem - např. skript.php?soubor=01) > dostanu se na stránku skript.php, kde do databáze se uloží čas s hodnotou glob. proměnné 'soubor' (01) > z této stránky se automaticky přesměruji na otevření PDFka (kam přesměrovávat si můžete vytáhnout z databáze dle proměnné (01))... |
||
Rellik Profil |
#4 · Zasláno: 5. 9. 2011, 21:09:04
Já mám něco podobného jako počitadlo abych zjistil počet stahnutí určitého souboru:
<?php /* CREATE TABLE `count` ( `file` VARCHAR( 128 ) NOT NULL , `count` INT NOT NULL ); volání scriptu: <a href="download.php?get=soubor.zip">soubor.zip</a> */ $FILES_DIR = "prog/"; // složka se soubory $MYSQL_USER = "root"; $MYSQL_PASS = "heslo"; $MYSQL_HOST = "localhost"; $MYSQL_DB = "db"; $cnt_sql = @mysql_connect($MYSQL_HOST, $MYSQL_USER, $MYSQL_PASS); @mysql_select_db($MYSQL_DB, $cnt_sql); if(isset($_GET['get'])) { $file = urlencode($_GET['get']); if(empty($file)) { echo "Soubor nebyl specifikován"; exit; } if(strpos($file, "..") !== FALSE) { echo "HACK!"; exit; } if(strpos($file, "://") !== FALSE) { echo "Špatný soubor"; exit; } $cookie = urlencode(str_replace(".", "_", $file)); $query = "SELECT * FROM count WHERE file = '".$file."'"; $result = mysql_query($query, $cnt_sql); if(!$result) { echo mysql_error(); exit; } if(mysql_num_rows($result) == 0) { $query = "INSERT INTO count VALUES('".$file."', 1)"; $result = mysql_query($query, $cnt_sql); setcookie("" . $cookie, "set", time() + 60*60*24*365); } else { if(!isset($_COOKIE['' . $cookie])) { $query = "UPDATE count SET count = count + 1 WHERE file = '".$file."'"; $result = mysql_query($query); setcookie("". $cookie, "set", time() + 60*60*24*365); } } header("Location: " . $FILES_DIR . $file); } function showCount($fileID) // funkce pro výpis { global $cnt_sql; $query = "SELECT count FROM count WHERE file = '".$fileID."'"; $result = mysql_query($query, $cnt_sql); if(mysql_num_rows($result) == 0) { return 0; } else { $count = mysql_fetch_row($result); return $count[0]; } } ?> stačí si to upravit aby to místo přičítání počtu stažení zapsalo datum a čas stažení... |
||
jan.rok Profil * |
#5 · Zasláno: 5. 9. 2011, 21:15:49
ninja:
vzhledem k mým znalostem bych se asi vydal druhou cestou - skript, který provede zápis. Ovšem tápu, jak následně poslat na výstup PDF. |
||
jan.rok Profil * |
#6 · Zasláno: 5. 9. 2011, 21:21:02
ninja, Sir Tom:
Přesnějí: používám k přesměrování header("location:soubor.pdf"); ale dostávám chybovou hlášku: Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\scripts\rotuj.php:45) in C:\xampp\htdocs\demo\scripts\ukaz_file.php on line 3 O této chybě je toho na webu spousta, ale myslím, že je špatně to, že posílám zase další hlavičku. Z toho nevím, jak ven. |
||
pcmanik Profil |
#7 · Zasláno: 5. 9. 2011, 21:30:41
jan.rok:
Hlaviciek mozes poslat kolko chces, ale predtym nemoze byt ziadny znak, ani len medzera. |
||
jan.rok Profil * |
#8 · Zasláno: 5. 9. 2011, 21:35:36
pcmanik:
Jak mám tedy rozumět třeba tomuto příkladu? <!--Stránka index.php--> <html> Zadejte heslo: <FORM action="index.php" method="POST"> <INPUT type="password" name="heslo"> </FORM> <? if($_POST["heslo"]=="Tajné heslo") header("location:Tajne.php"); else: echo "Špatné heslo!"; endif; ?> Vždyť zde přece před hlavičkou jde na výstup celý formulář? |
||
her-ur Profil * |
#9 · Zasláno: 5. 9. 2011, 22:11:39
Prohoď to, ten if dej úplně nahoru, až pak ten form.
|
||
jan.rok Profil * |
#10 · Zasláno: 6. 9. 2011, 12:35:52
Nakonec jsem použil pro otvírání/stahování PDF souboru toto:
<?php $pdfName='soubor.pdf'; $file = $pdfName; $path = "../cesta/".$pdfName; $fr = fopen($path, 'r'); $filedata = fread($fr, filesize($path)); fclose($fr); header ("'Content-Length: " . filesize ( $path ) ); header("Content-type: application/pdf"); header("Content-disposition: attachment; filename=$file"); readfile($path); ?> Stáhne se soubor správné velikosti, ale Acrobat nahlásí, že je poškozený. Originál uložený na webu otevřít jde. |
||
pcmanik Profil |
#11 · Zasláno: 6. 9. 2011, 12:47:41 · Upravil/a: pcmanik
jan.rok:
Citujem z dokumentacie, vidis tam rozdiel? A este hned pri pravej hlavicke mas jeden znak naviac. <?php header('Content-Disposition: attachment; filename='.basename($file)); ?> A pre oznacovanie kodu pouzivaj tlacitko. |
||
jan.rok Profil * |
#12 · Zasláno: 6. 9. 2011, 13:01:17
pcmanik:
Rozumím a díky. Zdá se, že tohle už funguje, teď mi ještě zbývá vyřešit záznam o stažení. |
||
Michel Profil |
#13 · Zasláno: 7. 9. 2011, 09:12:37
jan.rok:
„záznam o stažení“ Počítání stažení si vložíž před "header" a ten skriptík vložíš mezi funkce ob_start(); a ob_end_flush();. |
||
Časová prodleva: 13 let
|
0