Страница 1 из 1

phpbb3: выводим на страницу со ссылками на вложения число их скачиваний

Добавлено: 02 апр 2018, 20:09
mihas
В виде мода такую несложную задачку оформлять ни к чему, просто короткий скриптик общения с базой форума на PHP и SQL запросами.
Итак, обычная ссылка на вложение в форуме выглядит как-то так:

Код: Выделить всё

<a href="/forum/download/file.php?id=374">Link</a>
Дополним эту и другие нужные ссылки примерно таким образом:

Код: Выделить всё

<a href="/forum/download/file.php?id=374">Link</a> (<?php echo($downarr[374]);?> downloads)
Здесь в скобочках будет указано кол-во загрузок для указанного ID ссылки, в примере это 374.
Чтобы все это заработало - в начале страницы (или отдельном файле - об этом ниже) надо разместить следующий код PHP, создающий нам массив $downarr, в котором идентификатор элемента массива - ID-вложения, а значение элемента массива - кол-во загрузок этого вложения:

Код: Выделить всё

<?php
$host="localhost";
$user="user_bd";
$pass="pass";
$db_name="forum_bd";
$link=mysql_connect($host,$user,$pass);
mysql_select_db($db_name,$link);
mysql_query("SET NAMES 'utf8'",$link);
$results = mysql_query("SELECT `attach_id`, `download_count` FROM `table_prefix_attachments`",$link);
while ($resultq = mysql_fetch_array($results)) {
	$downarr[$resultq['attach_id']] = $resultq['download_count'];
}
mysql_free_result($results);
?>
Разберем по строкам, что мы сделали:

$host - указали хост, как в файле форума config.php. Если используется особый порт - пишем через двоеточие localhost:port.

$user, $pass, $db_name - логин, пароль и имя базы данных, как в файле форума config.php.

$link=mysql_connect($host,$user,$pass); - производим коннект к базе данных.

mysql_query("SET NAMES 'utf8'",$link); - устанавливаем кодировку чтения юникод. Строку можно пропустить, но пусть будет на всякий.

$results = mysql_query("SELECT `attach_id`, `download_count` FROM `table_prefix_attachments`",$link); - создаем SQL-запрос вот именно с такими необычными кавычками, где из таблицы `table_prefix_attachments` мы считываем данные по `attach_id` и `download_count`. Не забудьте в имени таблицы attachments указать префикс вашей таблицы в базе, чтобы не ошибиться - скачайте себе структуру базы через бэкап форума и найдите в ней attachments.

while ($resultq = mysql_fetch_array($results)) { - создаем цикл обработки полученных из базы данных в удобный вид массива PHP.

$downarr[$resultq['attach_id']] = $resultq['download_count']; - по циклу создаем элементы массива $downarr с идентификатором attach_id и значением download_count.

} - завершаем цикл.

mysql_free_result($results); - очищаем память от массива обращения к базе SQL. Необязательная строка, но не повредит.


Собственно, вот и все. Пример работы скрипта можно посмотреть на странице https://cielab.xyz/profiles/ где собраны ссылки на некоторые вложения в форум.
Я написал на английском "downloads" чтобы не склонять "загрузки" и "загрузок". Но никто не мешает вам усложнить скрипт и просклонять числительные если есть желание, мне лень.

Аналогично можно запросить у базы данных например количество посещений темы: опрашиваем таблицу `table_prefix_topics` для получения значений `topic_id` и `topic_views`. Снова не забываем заменить table_prefix на свой префикс таблицы в базе данных.

В форуме к файлу config.php установлены права 0644 для обеспечения безопасности базы данных. Проследите, чтобы и у вашего файла с представленным скриптом были права не выше 0644. Так же чтобы совсем попрятать все концы в воду рекомендуют ошибки PHP коли случатся не выводить на страницу, а выводить в отдельный хорошо запрятанный лог ошибок PHP на сайте (не забывайте его читать и исправлять ошибки).
Для этого в .htaccess сайта вносим примерно такой код:

Код: Выделить всё

# отключаем вывод ошибок пользователям
php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off
# заносим ошибки в журнал
php_flag log_errors on
php_value error_log /путь от корня/имя файла лога
И устанавливаем атрибуты для записи в файл лога например 0666.

Безопасности не бывает много. Если остаются опасения за файл с логином к базе данных - можно еще глубже запрятать файл только скрипта в отдельную папку и вызывать по месту функцией include или include_once. А для этого файла скрипта установить все возможные запреты через .htaccess как это сделано в форуме phpbb.
В примере файл скрипта с именем config.php дополнительно защищен .htaccess. Впишите свое имя скрипта и все:

Код: Выделить всё

<IfModule mod_version.c>
	<IfVersion < 2.4>
		<Files "config.php">
			Order Allow,Deny
			Deny from All
		</Files>
	</IfVersion>
	<IfVersion >= 2.4>
		<Files "config.php">
			Require all denied
		</Files>
	</IfVersion>
</IfModule>
<IfModule !mod_version.c>
	<IfModule !mod_authz_core.c>
		<Files "config.php">
			Order Allow,Deny
			Deny from All
		</Files>
	</IfModule>
	<IfModule mod_authz_core.c>
		<Files "config.php">
			Require all denied
		</Files>
	</IfModule>
</IfModule>
Но вообще прочитать файл php можно только реальным взломом, размещением своего скрипта на чужом сервере и так далее. И если про файл форума config.php известно всем хакерам, то название и размещение вашего файла скрипта с логином к базе вообще никому не известны и он соответственно будет еще менее уязвим, чем форумный config.php.