Download teller
In mijn MariaDB heb ik een tabel met maar 2 kolommen. Namelijk bestandsnaam (uniek) en downloads.
De bedoeling is dat telkens een bestand wordt gedownload er ofwel de bestandsnaam in de database wordt gezet of als er het reeds in staat de teller met 1 omhoog gaat.
Ik krijg wel de betreffende bestanden op mijn scherm maar mijn database wordt niet bijgewerkt of aangevuld.Hieronder de code. Als er iemand ziet waar ik in de fout ga dan hoor ik het graag. Maar ik zie het momenteel niet.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?php
// Including the connection file:
//Inladen van de instellingen.
include '../instellingen.php';
$conn = new mysqli($database_adres, $database_login_naam, $database_login_wachtwoord, $database_naam);
//connectie testen
if ($conn->connect_error)
{
die("verbinding mislukt: ".$conn->connect_error);
}
if(!$_GET['file']) error('Missing parameter!');
if($_GET['file'][0]=='.') error('Wrong file!');
if(file_exists("../".$_GET['file']))
{
/* If the visitor is not a search engine, count the downoad: */
if(!is_bot())
$sql = " INSERT INTO download_manager (bestandsnaam)
VALUES ('".mysqli_real_escape_string($conn,$_GET['file'])."')
ON DUPLICATE KEY UPDATE downloads=downloads+1";
$bsn=$_GET['file'];
header("Location: https://fv-??-?????nen.be/$bsn");
exit();
}
else {
echo "This file does not exist!";
}
/* Helper functions: */
function error($str)
{
die($str);
}
function is_bot()
{
/* This function will check whether the visitor is a search engine robot */
$botlist = array("Teoma", "alexa", "froogle", "Gigabot", "inktomi",
"looksmart", "URL_Spider_SQL", "Firefly", "NationalDirectory",
"Ask Jeeves", "TECNOSEEK", "InfoSeek", "WebFindBot", "girafabot",
"crawler", "www.galaxy.com", "Googlebot", "Scooter", "Slurp",
"msnbot", "appie", "FAST", "WebBug", "Spade", "ZyBorg", "rabaz",
"Baiduspider", "Feedfetcher-Google", "TechnoratiSnoop", "Rankivabot",
"Mediapartners-Google", "Sogou web spider", "WebAlta Crawler","TweetmemeBot",
"Butterfly","Twitturls","Me.dium","Twiceler","Bingbot","DuckDuckBot","YandexBot","facebot", "ia_archiver");
foreach($botlist as $bot)
{
if(strpos($_SERVER['HTTP_USER_AGENT'],$bot)!==false)
return true; // Is a bot
}
return false; // Not a bot
}
?>
// Including the connection file:
//Inladen van de instellingen.
include '../instellingen.php';
$conn = new mysqli($database_adres, $database_login_naam, $database_login_wachtwoord, $database_naam);
//connectie testen
if ($conn->connect_error)
{
die("verbinding mislukt: ".$conn->connect_error);
}
if(!$_GET['file']) error('Missing parameter!');
if($_GET['file'][0]=='.') error('Wrong file!');
if(file_exists("../".$_GET['file']))
{
/* If the visitor is not a search engine, count the downoad: */
if(!is_bot())
$sql = " INSERT INTO download_manager (bestandsnaam)
VALUES ('".mysqli_real_escape_string($conn,$_GET['file'])."')
ON DUPLICATE KEY UPDATE downloads=downloads+1";
$bsn=$_GET['file'];
header("Location: https://fv-??-?????nen.be/$bsn");
exit();
}
else {
echo "This file does not exist!";
}
/* Helper functions: */
function error($str)
{
die($str);
}
function is_bot()
{
/* This function will check whether the visitor is a search engine robot */
$botlist = array("Teoma", "alexa", "froogle", "Gigabot", "inktomi",
"looksmart", "URL_Spider_SQL", "Firefly", "NationalDirectory",
"Ask Jeeves", "TECNOSEEK", "InfoSeek", "WebFindBot", "girafabot",
"crawler", "www.galaxy.com", "Googlebot", "Scooter", "Slurp",
"msnbot", "appie", "FAST", "WebBug", "Spade", "ZyBorg", "rabaz",
"Baiduspider", "Feedfetcher-Google", "TechnoratiSnoop", "Rankivabot",
"Mediapartners-Google", "Sogou web spider", "WebAlta Crawler","TweetmemeBot",
"Butterfly","Twitturls","Me.dium","Twiceler","Bingbot","DuckDuckBot","YandexBot","facebot", "ia_archiver");
foreach($botlist as $bot)
{
if(strpos($_SERVER['HTTP_USER_AGENT'],$bot)!==false)
return true; // Is a bot
}
return false; // Not a bot
}
?>
Maar je voert de query niet uit.
Hoe bedoel je? Waar mankeert wat?
Zoals ik het zeg ... je maakt een query (een opdracht) aan, maar je voert 'm nergens uit. Bekijk maar eens een voorbeeldje via Google.
Het enige wat je doet is een string aanmaken met de opdracht, maar niet het commando (de query) geven dat het moet worden uitgevoerd. Dat laatste moet je uiteraard ook doen.
en hoe goed laat mysql_real_escape_string (procedureel) zich mengen met OO $conn = new mysqli() ?
Volgens mij kan dat gewoon. Al raad ik het niet aan.
Mochten jullie nu eens een voorbeeldje geven dan ben ik al heel wat geholpen.
$conn->query() neerzetten om die query uit te kunnen voeren.
Verder: je redirect daarna de browser naar het bestand.
Je realiseert je dat iemand dus ook rechtstreeks daarheen kan gaan? Niet erg als de download dan niet geteld wordt, maar je kunt hier zo dus geen beveiliging "mag hij dit bestand downloaden?" aan toe voegen.
Verder kan iemand hier dus ook
index.php?file=instellingen.php aanroepen.
(dat doet dan uiteindelijk weinig omdat je de browser redirect, maar met file_get_contents() of fpassthru() kun je dan een issue krijgen
Regel 22 :
https://www.phphulp.nl/php/forum/topic/exporteren-naar-csv-met-php/104154/
Regel 51
https://www.phphulp.nl/php/forum/topic/foutmelding-bij-insert/104143/
Regel 26 :
https://www.phphulp.nl/php/forum/topic/foutmelding-bij-update/104137/
Regel 4 :
https://www.phphulp.nl/php/forum/topic/variabele-doorgeven/103964/#753221
zit je wel in het juiste topic Adoptive?
Ivo P op 22/12/2021 15:24:41:
zit je wel in het juiste topic Adoptive?
Ja hoor, hij zit volledig in het juiste topic :-)
Ze zoeken een bepaalde naam. Dan krijgen ze een lijst met mogelijke matches en met meer details en een downloadlink die verwijst naar de pagina met dit PHP script waardoor de teller bijgewerkt wordt en ze doorverwezen worden naar het downloadbare bestand.
Een beetje moeten zoeken naar de juiste volgorde van de code lijnen maar nu werkt het.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
if(file_exists("../".$_GET['file']))
{
/* If the visitor is not a search engine, count the downoad: */
if(!is_bot())
$sql = "INSERT INTO downloads_manager (bestandsnaam)
VALUES ('".mysqli_real_escape_string($conn,$_GET['file'])."')
ON DUPLICATE KEY UPDATE downloads=downloads+1";
$bsn=$_GET['file'];
header("Location: https://fv-??-????nen.be/$bsn");
if (mysqli_query($conn, $sql)) {
echo "Record met succes geupdated"."<br/>";
} else {
echo "Fout updating record: " . mysqli_error($conn)."<br/>";
}
exit();
}
else {
echo "This file does not exist!";
}
{
/* If the visitor is not a search engine, count the downoad: */
if(!is_bot())
$sql = "INSERT INTO downloads_manager (bestandsnaam)
VALUES ('".mysqli_real_escape_string($conn,$_GET['file'])."')
ON DUPLICATE KEY UPDATE downloads=downloads+1";
$bsn=$_GET['file'];
header("Location: https://fv-??-????nen.be/$bsn");
if (mysqli_query($conn, $sql)) {
echo "Record met succes geupdated"."<br/>";
} else {
echo "Fout updating record: " . mysqli_error($conn)."<br/>";
}
exit();
}
else {
echo "This file does not exist!";
}
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
$filename = filter_input(INPUT_GET, 'file');
if(strpos($filename, '/') !== false || is_bot()) {
// de filename bevat een path, en dat wil je niet!
header('HTTP/1.0 403 Forbidden');
exit();
}
if(file_exists("../".$filename))
{
/* If the visitor is not a search engine, count the downoad: */
$sql = "INSERT INTO downloads_manager (bestandsnaam)
VALUES ('".mysqli_real_escape_string($conn,$_GET['file'])."')
ON DUPLICATE KEY UPDATE downloads=downloads+1";
$conn->query($sql);
fp = fopen('../'.$filename, 'rb');
header("Content-Type: application/pdf");
fpassthru($fp);
exit();
}
else {
header("HTTP/1.0 404 Not Found");
exit();
}
?>
$filename = filter_input(INPUT_GET, 'file');
if(strpos($filename, '/') !== false || is_bot()) {
// de filename bevat een path, en dat wil je niet!
header('HTTP/1.0 403 Forbidden');
exit();
}
if(file_exists("../".$filename))
{
/* If the visitor is not a search engine, count the downoad: */
$sql = "INSERT INTO downloads_manager (bestandsnaam)
VALUES ('".mysqli_real_escape_string($conn,$_GET['file'])."')
ON DUPLICATE KEY UPDATE downloads=downloads+1";
$conn->query($sql);
fp = fopen('../'.$filename, 'rb');
header("Content-Type: application/pdf");
fpassthru($fp);
exit();
}
else {
header("HTTP/1.0 404 Not Found");
exit();
}
?>
en je directory ../ mag dan helemaal onbereikbaar gemaakt worden voor browsers (buiten de documentroot, of via .htaccess rules forbidden gemaakt)
edit:
is_bot() miste een {}set,maar doet het beter in de eerste if.
Gewijzigd op 22/12/2021 18:39:46 door Ivo P
Dan ben je safe dat er niemand zomaar bij komt zonder eerst jouw script te passeren.
We gaan het eens bekijken die suggesties. Het zijn wel telkens verschillende directories en zelfs verschillende sites waarop die bestanden staan. Dus ga ik dat moeten uittesten.