Архив рубрики: ‘Ваши вопросы’

Создание собственных функций в PHP

В прошлых статьях я рассказывал о стандартных функциях PHP, но ни разу не упомянул о том, что функции может создавать сам программист. Те, кто знаком с другими языками воспримут это как само собой разумеющееся, тем же, кто не был знаком до этого ни с одним языком программирования будет интересно прочесть данную статью.
Подробнее »

Количество скачиваний файла на PHP

На одном из форумов мне задали вопрос: “Как реализовать подсчет количества скачиваний файла?”. Покумекав немного я решил написать пример подобной реализации с использованием не баз данных, но файлов. И так приступим. Прежде всего надо разбить задачу на более простые подзадачи.
1) Как подсчитывать;
2) Как хранить подсчитанные данные;
3) Как их выдергивать и преподносить пользователю.
Это-наш план реализации. Давайте теперь разбираться по пунктам, что и как надо сделать. Прежде всего подсчет. Понятно что напрямую файл отдавать нельзя прежде чем его отдать надо прибавить к счетчику +1. Значит это реализуем примерно вот так:


<?php

//код файла req.php

define('URL_DIR','http://phpbegun.ru/files_dir/');

define('ABS_DIR',$_SERVER['DOCUMENT_ROOT']);

//Определяем нужные нам константы

$namefile htmlspecialchars(str_replace("/","",$_GET['name'])); 

//Через гет передаем параметр-имя

if(!$namefile

{

    echo 
'Произошла ошибка! Файл с таким именем не найден.';

}

$array = array(); //массив данных

if(file_exists(ABS_DIR.'/schet.txt'))

{

    
$array unserialize(file_get_contents(ABS_DIR.'/schet.txt'));

    
//Файл который будет содержать данные о кол-ве скачиваний

    //в виде сериализованного массива

    
if(!$array[$namefile]) $array[$namefile] = 0;

    
$schet $array[$namefile]+1;

    
//$array[$namefile] содержит кол-во скачиванй этого файла

}

else 

{

    
$schet 1;

}

$array[$namefile] = $schet;

//присваиваем новое значение элементу массива

$array serialize($array);

//сериализуем данные

@file_put_contents(ABS_DIR.'/schet.txt',$array);

//пишем в файл причем не проверяем 

//записалось или нет ибо скачивание 

//должно начаться независимо от этого 

header("Location: ".URL_DIR."$namefile");

//Переадресуем запрос на скачиваемый файл

?>

Итак первая часть кода есть. Данный скрипт должен выполняться перед началом скачивания файла, т.е. на него должны вести все ссылки с вашего сайта для скачивания. Этот сценарий подразумевает что права на корневой дирректории и на самом файле будут таковы чтобы была возможна запись (cmod 0777). Так же хочу заметить, что для больших файлохранилищ даный алгоритм не лучшее решение и гораздо правильнее было бы использовать MySQL. Но для тех у кого небольшой сайт с малым количеством файлов это наиболее оптимальный вариант. Фактически мы решили задачи 1 и 2. Храним данныее в файле в сериализованном виде (настоятельно рекомендую почитать о функциях serialize и unserialize в официальном мануале, очень полезная штука). Кроме того сначала подсчитываем количество скачиваний, увеличиваем его, сохраняем в файл и потом выводим. как же теперь преподносить данные пользователю? При формировании страницы надо лишь считывать массив данных, и выдергивать с именем данного файла нужное нам число. Примерно вот так:


<?php

define
('URL_DIR','http://phpbegun.ru/files_dir/');

define('ABS_DIR',$_SERVER['DOCUMENT_ROOT']);

$data unserialize(file_get_contents(ABS_DIR.'/schet.txt'));

echo 
'Вот тут можно скачать файл '.

'<a href="/files_dir/req.php?name=name.txt">Names(',$data['name.txt'],')</a>';

?>

Простейший счетчик скачиваний файлов готов. Советую вам все define вынести в отдельный файл, чтобы не определять их и в файле скачивания и в файле вывода, и подключать через require_once. На этом пожалуй закончу данную статью, ибо пищу для размышлений я вам дал, а что-то более интересное и элегантное вы сможете конечно же написать и сами если постараетесь. Надеюсь, что вы поделитесь своими вариантами решений, будет интересно посмотреть.
Удачи в обучении :)

Динамические часы на сайте

В комментариях к одной из статей меня спросили как сделать динамические часы, с меняющимся временем, и чтобы данные были по гринвичу. На PHP легко получить данные гринвича (если конечно на сервере часы настроены правильно), но невозможно сделать чтобы часы обновлялись динамически без запроса к серверу (ведь PHP серверный язык). Но на javascript решение возможно, и хоть данный блог и не о javascript а о PHP все же постараюсь помочь читателю. Вот пример как можно реализовать часы на JavaScript:
<HTML>
<HEAD><TITLE></TITLE></HEAD>

<script language="JavaScript">
function time()
{
var vrem;
var vremya;
vrem=new Date();
//создаем экземпляр класса отвечающего за дату
vremya = document.getElementById('vremya');
//получаем элемент по айди
vremya.innerHTML=vrem.getUTCHours()+":"+vrem.getUTCMinutes()+":"+vrem.getUTCSeconds()+" "+vrem.getUTCDate()+"."+(vrem.getUTCMonth()+1)+"."+vrem.getUTCFullYear();
//Записываем часы, минуты, секунды по гринвичу в полученный элемент страницы.
setTimeout("time()",1000)
//Каждую тысячу милисекунд(одну секунду) выполняем данную функцию.
}
</script>

<BODY onload="time()">
Сейчас:
<font size="5" id="vremya"> </font>
</BODY>
</HTML>

Вот и все. Будет выводиться время по GMT+0. Единственное, т.к javascript должен выполняться на компе у пользователя у него должна быть правильно настроена временная зона и время данной зоны, в ином случае к сожалению будет выведен бред. При желании можно увязать javascript и PHP но это уже из области т.н. танцев с бубном)

ЗЫ Благодарю Константина за указания на ошибки и недочеты в данной статье. К сожалению еще раз убедился что JavaScript мне стоит еще учиться и учиться.

Переход между страницами для статического сайта.

На одном из форумов мне задали вопрос как сделать навигацию по страницам новостей для статического сайта, т.е. сайта полностью сделанного на html. Для такого сайта вариант, на мой вщгляд только один: читать файлы из директории (файлы в имени должны иметь цифру-страницу) и потом выводить. Либо сортировать по дате создания. Чтож приступим к написанию.


<?php

$conf_array 
= array(

'news' => 

array(
'filepath'=>'themes/','type'=>'time','ext'=>'php','pref'=>''),

'catalog'=> 

array(
'filepath'=>'rtop/','type'=>'name','ext'=>'php','pref'=>'cat'), 

//файлы в диррректории cat1.html,cat2.html  т.д.

); 

//Массив конфигов дирректорий 

//и типа сортировки имя или дата последнего изменения

//префикс нужен для сортировки исключительно по имени.

$cat $_GET['cat']; 

//Элемент массива GET соответствующий ключу массива $conf_array

if($cat)

{

    if(isset(
$conf_array[$cat])){ 

        
//Проверяем существует ли такой элемент массива

        
if(file_exists($conf_array[$cat]['filepath']))

        {

            
$dir opendir($conf_array[$cat]['filepath']); 

            
//Открываем дирректорию

            
while(($file readdir($dir))!==false

            
//В цикле читаем дирректорию получая 

            //все имена файлов в данной дирректории

            
{

                
$ext explode(".",$file);

                
$ext $ext[count($ext)-1]; //ext - расширение файла

                
if(!is_dir($conf_array[$cat]['filepath'].$file) &&

                 
$ext $conf_array[$cat]['ext']) 

                {
//Проверяем не дирректория ли файл и расширение дозволено ли

                    
if($conf_array[$cat]['type'] == 'time'){

                        
//Какой тип сортировки в зависимости от этого такие ключи массива

                        
$pages[filemtime($conf_array[$cat]['filepath'].$file)] = $conf_array[$cat]['filepath'].$file;

                    }

                    else 

                    {

                        
$str str_replace($ext,'',$file);

                        
$str str_replace($conf_array[$cat]['ext'],'',$file);

                         
//Получаем числа-номера страниц. В дальнейшем при переборке 

                         //и выводе можно не плюсовать переменную а использовать их

                        
$pages[$str] = $conf_array[$cat]['filepath'].$file;

                    }

                }

            }

            
ksort($pages); //Сортируем массив в обратном порядке по ключам

            
$i 0;

            foreach(
$pages as $k=>$v//Перебираем получившийся массив, и выводим ссылки

            
{

                
$i++;

                if(
basename($_SERVER['PHP_SELF']) != $file

                    echo 
'<a href="',$v,'?cat='.$cat.'">',$i,'</a>&nbsp;';

                else echo 
$i.'&nbsp;';

            }

        }

        else{

                echo 
'Произошла ошибка. Указанная дирректория не существует.';

        }

    }

    else {

        echo 
'Произошла ошибка. Запрошенная категория не существует.';

    }

}

?>

Представленная система далеко не идеальна и выполнена на скорую руку. Вы можете по своему модернизировать ее и привести в комментариях тут примеры как вы реализовывали это, дабы другие могли получить более широкое представление. Единственный плюс данной системы для новичка в том что она затрагивает не только работу с файлами, но и работу с массивами, которую, к сожалению, пока я не описывал у себя на ресурсе.

Как выделить код на странице.

Разместить код на html странице весьма нелегкая задача иногда, ведь очень часто тело страницы и код начинают перекликаться, т.е. код который должен выводиться как обычный текст выполняется браузером, что весьма неудобно например если вы поддерживаете ресурс о html или php. Вот тут то вам и поможет html тэг
code Данный тэг предназначен для отображения программного кода на странице. Таким образом можно добиться вывода любого кода не портя страницу. Но если вы выводите php для удобства чтения кода хорошо бы было его подсвечивать. Оказывается разработчики этого языка предусмотрели даже и такой вариант. Есть две функции рighlight_string и highlight_file. Как понятно из названия самих функций пеервая может аргументом получать строку вторая файл.
Приведу прример:


<?php

$string 
hightlight_string('<?php echo \'Hello world\';?>',true);

//Переменная стринг будет содержать подсвеченный текст.

hightlight_string('<?php echo \'Hello world\';?>');

//Текст будет сразу же выведен в браузер

?>

По аналогии работает и функция highlight_file единственное отличие в том что первый параметр в ней путь к файлу. Вот и все. Теперь вы знаете как подсвечивается текст на данном сайте.