Так же файл считает количество загрузок.
download.php
<?php
// Проверка ошибок:
error_reporting(E_ALL^E_NOTICE);
//$user = $_GET['u'];
$filename = $_GET['file'];
// Дирректория файлов
$directory=$filename;
if(file_exists($directory))
{
// Если посетитель не поисковой бот, засчитываем скачивание:
if(!is_bot())
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
// Подключения к ДБ:
$db_host = "localhost";
$db_user = "****";
$db_pass = "****";
$db_database = "****";
$link = mysql_connect($db_host,$db_user,$db_pass) or die('Невозможно соедениться с базой данных');
mysql_select_db($db_database,$link);
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
// Увеличиваем колличесво загрузок на 1, и заносим в базу
mysql_query('INSERT INTO files SET filename="'.$filename.'" ON DUPLICATE KEY UPDATE downloads=downloads+1');
header('Content-Type: audio/mpeg');
header('Content-Disposition: attachment; filename='.$filename.'');
exit;
}
else error("Этот файл не существует! ".$directory."");
// функции помощники:
function error($str)
{
die($str);
}
function is_bot()
{
// Эта функция проверки на робота
$botlist = array("...массив имен ботов...");
foreach($botlist as $bot)
{
if(strpos($_SERVER['HTTP_USER_AGENT'],$bot)!==false)
return true; // Если бот
}
return false; // Если не бот
}
?>
Загружает все как надо, только пара недостатков:
1. Загружает только те файлы где лежит сам скрипт.
2. Счетчик не обновляет, а создает новую строку в таблице и вносит туда только имя файла(прикрепил скрин)
Подскажите пожалуйста, как сделать чтоб можно было указывать путь к файлу, и в чем ошибка счетчика загрузок?
Спустя 11 минут, 21 секунда (28.01.2012 - 16:43) Winston написал(а):
Цитата (You_Help_Me? @ 28.01.2012 - 15:32) |
Загружает только те файлы где лежит сам скрипт |
Потому что ты указываешь путь к файлу относительно своего скрипта.
header('Content-Disposition: attachment; filename='.$filename.'');
Пропиши полный путь
header('Content-Disposition: attachment; filename='.$_SERVER['DOCUMENT_ROOT'] . '/downloads/' . $filename.'');
А если запрос переписать
mysql_query("INSERT INTO `files`
SET `filename` = '" . mysql_real_escape_string($filename) . "'
ON DUPLICATE KEY UPDATE
`filename` = '" . mysql_real_escape_string($filename) . "',
`downloads` = `downloads` + 1") or die(mysql_error());
Спустя 9 минут, 5 секунд (28.01.2012 - 16:52) You_Help_Me? написал(а):
Цитата |
Потому что ты указываешь путь к файлу относительно своего скрипта. header('Content-Disposition: attachment; filename='.$filename.''); Пропиши полный путь header('Content-Disposition: attachment; filename='.$_SERVER['DOCUMENT_ROOT'] . '/downloads/' . $filename.''); |
Подумал над этим, но смутило "filename=" думал только название сюда, а за путь там какой-нибудь path... Но не важно, Спасибо с этим разобрался.
Запрос подставил ваш
Цитата |
mysql_query("INSERT INTO `files` SET `filename` = '" . mysql_real_escape_string($filename) . "' ON DUPLICATE KEY UPDATE `filename` = '" . mysql_real_escape_string($filename) . "', `downloads` = `downloads` + 1"); |
Все тоже самое, добавило новую строчку.
Спустя 10 минут, 33 секунды (28.01.2012 - 17:03) You_Help_Me? написал(а):
А вот еще такой вопросик появился, когда путь указываю, он в название файла добавляет название папок в пути к файлу, от них можно как-нибудь избавиться?
Спустя 4 минуты, 5 секунд (28.01.2012 - 17:07) Winston написал(а):
You_Help_Me?
Пропиши в базе такой запрос
Спустя 1 минута, 51 секунда Winston написал(а):
Пропиши в базе такой запрос
alter table `files` add unique (`filename`)
Спустя 1 минута, 51 секунда Winston написал(а):
Цитата (You_Help_Me? @ 28.01.2012 - 16:03) |
когда путь указываю, он в название файла добавляет название папок в пути к файлу, от них можно как-нибудь избавиться? |
Можно. Используй http://ua.php.net/manual/ru/function.pathinfo.php
Спустя 3 минуты, 43 секунды (28.01.2012 - 17:11) You_Help_Me? написал(а):
Цитата |
Пропиши в базе такой запрос alter table `files` add unique (`filename`) |
Спасибо! Теперь все правильно.
Цитата |
Можно. Используй http://ua.php.net/manual/ru/function.pathinfo.php |
Спасибо еще раз!
Спустя 1 день, 1 час, 6 минут, 25 секунд (29.01.2012 - 18:17) You_Help_Me? написал(а):
Winston
A после этого запроса
Можно выводить значения поля downloads?
У меня выводит что-то типа Resource id #323, вместо числа.
A после этого запроса
alter table `files` add unique (`filename`)
Можно выводить значения поля downloads?
У меня выводит что-то типа Resource id #323, вместо числа.
Спустя 1 минута, 2 секунды (29.01.2012 - 18:18) Winston написал(а):
Цитата (You_Help_Me? @ 29.01.2012 - 17:17) |
У меня выводит что-то типа Resource id #323, вместо числа. |
Покажи как пишешь.
Спустя 1 минута, 19 секунд (29.01.2012 - 18:19) You_Help_Me? написал(а):
<?
$downloads = mysql_query("SELECT downloads FROM files WHERE filename='".$explode[1]."'"); //вывод числа загрузок
?>
$explode[1] - точно правильный, проверял
Спустя 1 минута, 7 секунд (29.01.2012 - 18:20) Winston написал(а):
$downloads = mysql_query("SELECT downloads FROM files WHERE filename='".$explode[1]."'"); //вывод числа загрузок
echo mysql_result($downloads, 0);
Спустя 3 минуты (29.01.2012 - 18:23) You_Help_Me? написал(а):
Цитата |
$downloads = mysql_query("SELECT downloads FROM files WHERE filename='".$explode[1]."'"); //вывод числа загрузок |
Помогло, благодарю.
Спустя 1 час, 38 минут, 55 секунд (29.01.2012 - 20:02) bob marley написал(а):
Цитата (You_Help_Me? @ 29.01.2012 - 15:19) |
<? |
на тему твою ответили,а вот это ни кто почему-то не прокомментировал!
You_Help_Me?
Пиши полностью <?php т.к. некоторые хостера это не поддерживают или сначала поддерживают,а потом отключают.
Спустя 9 дней, 17 часов, 44 минуты, 21 секунда (9.02.2012 - 13:47) You_Help_Me? написал(а):
Цитата (bob marley @ 29.01.2012 - 17:02) |
на тему твою ответили,а вот это ни кто почему-то не прокомментировал! You_Help_Me? Пиши полностью <?php т.к. некоторые хостера это не поддерживают или сначала поддерживают,а потом отключают. |
Учту
У меня опять траблы с таблицами, я не понимаю почему он все время добавляет новую строку вместо обновления
if($array_select_ip['IP'] = $_SERVER['REMOTE_ADDR'] and $array_select_ip['filename'] = mysql_real_escape_string($filename))
{
mysql_query("UPDATE `users_ip` SET `counter`=`counter`+1 WHERE `IP`= '".$array_select_ip['IP']."' AND `filename` = '".$array_select_ip['filename']."'");
break;
}
Подскажите как подправить :unsure:
Спустя 1 час, 26 минут, 6 секунд (9.02.2012 - 15:13) Winston написал(а):
Что за бред?
Цитата (You_Help_Me? @ 9.02.2012 - 12:47) |
$array_select_ip['IP'] = $_SERVER['REMOTE_ADDR'] |
Нужно сравнивать, а не присваивать
$array_select_ip['IP'] == $_SERVER['REMOTE_ADDR']
Спустя 4 минуты, 26 секунд (9.02.2012 - 15:17) You_Help_Me? написал(а):
Цитата (Winston @ 9.02.2012 - 12:13) |
Что за бред? Цитата (You_Help_Me? @ 9.02.2012 - 12:47) $array_select_ip['IP'] = $_SERVER['REMOTE_ADDR'] Нужно сравнивать, а не присваивать $array_select_ip['IP'] == $_SERVER['REMOTE_ADDR'] |
Ой да... Вообще туплю

Но все равно добавляет строку, как тогда..
Спустя 1 минута, 29 секунд (9.02.2012 - 15:19) You_Help_Me? написал(а):
Просто здесь нету уникальных значений, ну кроме как id(PRIMARY), так бы давно сделал.
Спустя 8 секунд (9.02.2012 - 15:19) Winston написал(а):
Как это update может добавить строку в таблицу?
Покажи больше кода.

Покажи больше кода.
Спустя 1 минута, 41 секунда (9.02.2012 - 15:21) You_Help_Me? написал(а):
$select_ip = mysql_query("SELECT `IP`, `filename` FROM `users_ip`");
while($array_select_ip = mysql_fetch_array($select_ip))
{
if($array_select_ip['IP'] == $_SERVER['REMOTE_ADDR'] and $array_select_ip['filename'] == mysql_real_escape_string($filename))
{
mysql_query("UPDATE `users_ip` SET `counter`=`counter`+1 WHERE `IP`= '".$array_select_ip['IP']."' AND `filename` = '".$array_select_ip['filename']."'");
break;
}
}
mysql_query("INSERT INTO `users_ip`
SET `filename` = '".mysql_real_escape_string($filename)."',
`IP` = '".$_SERVER['REMOTE_ADDR']."',
`counter` = 1");
Я проверяю если строка существует ее обновляю, если ее нету создаю ее
Спустя 23 минуты, 39 секунд (9.02.2012 - 15:44) You_Help_Me? написал(а):
Создает новую строку только с `counter`+1
Спустя 2 минуты, 36 секунд (9.02.2012 - 15:47) Winston написал(а):
По логике, у тебя скрипт работает так: выбираются записи, в цикле проверяются, если условие
Цитата |
if($array_select_ip['IP'] == $_SERVER['REMOTE_ADDR'] and $array_select_ip['filename'] == mysql_real_escape_string($filename)) |
выполняется, то происходит обновление записи и цикл останавливается, но после цикла у тебя еще происходит запись в таблицу.
Спустя 2 минуты, 3 секунды (9.02.2012 - 15:49) You_Help_Me? написал(а):
Цитата (Winston @ 9.02.2012 - 12:47) |
По логике, у тебя скрипт работает так: выбираются записи, в цикле проверяются, если условие Цитата if($array_select_ip['IP'] == $_SERVER['REMOTE_ADDR'] and $array_select_ip['filename'] == mysql_real_escape_string($filename)) выполняется, то происходит обновление записи и цикл останавливается, но после цикла у тебя еще происходит запись в таблицу. |
А как сделать чтоб запись происходила только тогда когда нет записи с таким-то IP и файлом?
Спустя 1 минута, 15 секунд (9.02.2012 - 15:50) Winston написал(а):
Так попробуй
Свернутый текст
while($array_select_ip = mysql_fetch_assoc($select_ip))
{
if($array_select_ip['IP'] == $_SERVER['REMOTE_ADDR'] and $array_select_ip['filename'] == mysql_real_escape_string($filename))
{
mysql_query("UPDATE `users_ip` SET `counter`=`counter`+1 WHERE `IP`= '".$array_select_ip['IP']."' AND `filename` = '".$array_select_ip['filename']."'");
break;
}
else
mysql_query("INSERT INTO `users_ip`
SET `filename` = '".mysql_real_escape_string($filename)."',
`IP` = '".$_SERVER['REMOTE_ADDR']."',
`counter` = 1");
}
Спустя 3 минуты, 4 секунды (9.02.2012 - 15:53) You_Help_Me? написал(а):
А он не будет каждый раз идти по ветке else? Там же while.
Спустя 4 минуты, 46 секунд (9.02.2012 - 15:58) You_Help_Me? написал(а):
Работает. Спасибо который раз 
Но я не понимаю, по логике же если запись не подходит if'у раз 50, то он должен создавать запись 50 раз

Но я не понимаю, по логике же если запись не подходит if'у раз 50, то он должен создавать запись 50 раз
Спустя 3 минуты, 37 секунд (9.02.2012 - 16:02) Winston написал(а):
Ну у тебя же IP это первичный ключ. Потому и не вставляет.
Спустя 14 минут, 49 секунд (9.02.2012 - 16:16) You_Help_Me? написал(а):
Цитата (Winston @ 9.02.2012 - 13:02) |
Ну у тебя же IP это первичный ключ. Потому и не вставляет. |
Нет.. у меня id - первичный.
Все-таки добавляет, IP меняешь, он несколько записей добавляет из-за вайла. В таблице по идее могут повторяться и IP и filename.
