Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Закрытая темаСоздание новой темыСоздание опроса

> Скачивание файлов
You_Help_Me?  
 ۩  [x]    Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 32
Пользователь №: 31235
На форуме: 5 лет, 5 месяцев, 29 дней
Карма:




Есть файл с таблицей для загрузки файлов, от каждого файла идут ссылки на обработчик (download.php) через GET (download.php?file=...).
Так же файл считает количество загрузок.

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?
Пропиши в базе такой запрос
alter table `files` add unique (`filename`)




Спустя 1 минута, 51 секунда Winston написал(а):
Цитата (You_Help_Me? @ 28.01.2012 - 16:03)
когда путь указываю, он в название файла добавляет название папок в пути к файлу, от них можно как-нибудь избавиться?

Спустя 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 после этого запроса
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]."'");    //вывод числа загрузок
echo mysql_result($downloads, 0);

Помогло, благодарю.

Спустя 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']

Ой да... Вообще туплю biggrin.gif
Но все равно добавляет строку, как тогда..

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

Спустя 8 секунд (9.02.2012 - 15:19) Winston написал(а):
Как это update может добавить строку в таблицу? blink.gif
Покажи больше кода.

Спустя 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? написал(а):
Работает. Спасибо который раз smile.gif
Но я не понимаю, по логике же если запись не подходит 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. sad.gif


Присоединённое изображение
Присоединённое изображение
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Закрытая темаСоздание новой темыСоздание опроса