Autor Zpráva
jan.rok
Profil *
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
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
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
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 *
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 *
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
jan.rok:
Hlaviciek mozes poslat kolko chces, ale predtym nemoze byt ziadny znak, ani len medzera.
jan.rok
Profil *
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 *
Prohoď to, ten if dej úplně nahoru, až pak ten form.
jan.rok
Profil *
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
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 *
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
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();.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0