PHP

Генерация XML файла средствами PHP

Генерация XML файла средствами PHP Добрый вечер! Сегодня я расскажу, как генерировать XML файл с данными с помощью PHP на примере специального  xml-файла в формате YMapsML. YMapsML — это формат файла с географическими данными, используюемый API Яндекс.Карт. В виде такого файла очень удобно передавать данные в Яндекс Карты, а если данные зависят от какого-либо параметра, то генерация такого файла с нужным набором данных Вам просто необходима.

(далее…)

PHP

Постраничный вывод записей из БД

Постраничный вывод записей из БД Невозможно представить себе сайт (не визитную карточку) с большим количеством информации и чтобы вся эта информация хранилась в виде отдельных статических страниц, а не выводилась из базы данных динамическим образом. Однако, бывает что необходимо вывести большое количество записей, но в таком случае страница становиться очееень большой в высоту, что как минимум неудобно.

Данную проблему решить очень просто — необходимо всего лишь сделать постраничный вывод записей, например, по 20 записей на страницу. Как это сделать — об этом я и хочу вам сейчас рассказать.

Предположим: нам надо вывести из таблицы «news» все записи, разбив их на страницы по 20 новостей на каждой, если это потребуется.

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

Добавлено: Итак, начнём с подключения к базе данных, ведь именно с ней мы и будем работать в дальнейшем.

$link=mysql_connect("localhost","user","password"); // Подключаемся к серверу БД расположенном по адресу localhost используя логин user и пароль password.
mysql_select_db("dbname"); // Подключаемся к базе данных с именем "dbname"

Для начала, нам необходимо проверить, запросил ли пользователь какую-либо определённую страницу или нет. Номер запрашиваемой страницы будет передаваться в переменной «page», передаваемой методом get.

if(isset($_GET['page'])) { $page=$_GET['page']; } else { $page="0"; }

Затем, мы делаем запрос в базу данных, где просим вернуть 20 записей, начиная с определённой записи. Этой самой определённой записью, будет запись, которая является первой записью на странице, и её номер будет определяться как: номер страницы минус единица и умноженный на количество записей на страницу. Например: первая запись на третьей странице будет иметь номер 2*20=40, при условии вывода по 20 записей на страницу.

$query=mysql_query("SELECT * FROM news ORDER BY id DESC LIMIT ".($page*20).",20");

Далее используя цикл while() выводим на экран необходимую нам информацию в необходимом виде. Эту часть кода я опишу кратко и очень условно.

while($news=mysql_fetch_array($query)) {
        echo "<strong>".$news['title']."</strong><p>".$news['messaage']."</p>";
}

Всё, часть задачи мы решили: вывели на экран определённое количество записей, начиная с определённой записи. Теперь осталась ещё одна задача: сделать возможность навигации по страницам. Для этого нам надо узнать, сколько всего записей имеется в таблице. Сделаем это таким образом.

$q=mysql_query("SELECT * FROM news");

Зная количество записей мы можем определить сколько страниц у нас будет. Для этого мы разделим общее количество записей на количество записей, выводимых на одной странице, а затем полученное число (скорее всего дробное) мы округлим до целого в бОльшую сторону.

$numpages=ceil(mysql_num_rows($q)/20);

Отлично, теперь мы знаем сколько у нас будет страниц, и остаётся самое простое — создать и вывести на экран элементы навигации по страницам. Очевидно, что всегда будет как минимум одна страница, при условии, если в базе есть хоть одна запись, однако, если страница всего одна, то нет смысла выводить элементы навигации, поэтому первым делом мы сделаем условие, которое будет проверять — является ли количество страниц более единицы. Именно это мы и делаем в первой строке следующего ниже кода.

if($numpages > 1) {
	if($page!=0) { echo "<a href=\"/index.php?page=0\">Первая</a> "; }
	for($i=0;$i<$numpages;$i++) {
		if($page != $i) { echo "<a href=\"/index.php?page=".$i."\">".($i+1)."</a> "; }
		else { echo "<strong><a href=\"/index.php?page=".$i."\">".($i+1)."</a></strong> "; }
	}
	if($page!=($numpages-1)) { echo "<a href=\"/index.php?page=".($numpages-1)."\">Последняя</a>"; }
}
	echo "<a href=\"/index.php?gotopage=$numpagess\">Последняя</a>";
}

Во второй и седьмой строках кода, представленного выше, мы выводим постоянные ссылки на первую и последнюю страницы соответственно. В третьей строке мы задаём цикл от единицы до n-1, где n — количество страниц. В теле данного цикла (4-5 строчки) мы выводим ссылку на каждую страницу, с указанием номера данной страницы, предварительно проверив, является ли ссылка, ссылкой на текущую страницу. Если условие выполняется, то ссылка выделяется жирным шрифтом. Проще говоря, мы выделяем жирным ссылку на ту страницу, на которой пользователь находиться в данный момент.

Добавлено: Теперь нам остаётся лишь закрыть соединение с базой данных и очистить память, от теперь уже ненужной информации. В первой строке представленного ниже кода, мы очищаем память от массива данных, содержащегося в переменной $query — это все наши записи из базы данных. Во второй строке, мы закрываем соединение с базой данных.

mysql_free_result($query);
mysql_close($link);

Вот и всё, как видите, ни чего сложного здесь нет. Требуется лишь немного смекалки и небольших знаний php.

Удачи вам, в ваших разработках!
________________
Отдохните от работы и потратьте пару часов своего свободного времени на лучшие игры различных жанров и направлений: от одиночных стрелялок и симуляторов, до многопользовательских ролевых и стратегических игр.

PHP

Что использовать: Session против Cookie

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

Что «сохранить» данные на странице, необходимо использовать следующие глобальные переменных: $_COOKIE или $_SESSION. Однако, не смотря на то, что в итоге вы достигните одну и ту же цель, эти переменные необходимо использовать только в определённых случаях. Целью данной статьи я ставлю задачу — дать краткий обзор различий Session (далее «сессии») и Cookie (далее «печеньки». Не надо говорить что я переводил промтом, мне просто действительно нравиться называть их «печеньками»), рассказать, когда надо использовать одно, а когда другое, а также рассказать об их «плюсах» и «минусах».

Их разница заключается лишь в способе хранения данных: Печеньки хранят данные в браузере пользователя, а Сессии на стороне сервера.

Основы сессий (кратко)

В двух словах, сессии — это механизм, который позволяет однозначно идентифицировать клиент (браузер) пользователя и созданный для этого клиента файл на стороне сервера, в котором будут храниться необходимые данные.

Плюсы сессий

  1. Легко можно хранить большие объёмы данных
  2. При каждой загрузке страницы, на сервер передаётся только ссылка на сессию, что позволяет экономить трафик, в отличии от «печенек», которые передают всю информацию.
  3. Данные храняться на веб-сервере, что делает сессии безопасными потому, что они не могут быть изменены или просмотрены на стороне клиента.

Минусы сессий

  1. Сессии прекращают свою жизнь при закрытии браузера или по истечению некоторого количества времени. Однако, срок жизни сессии можно изменить используя файл настроек — php.ini. Там же, вы можете сделать сессии вечными.

Основы «печенек»

«Печеньки» отправляются на сервер каждый раз, когда вы загружаете страницу. После создания «печеньки» ей задаётся срок жизни. По истечению этого срока — «печенька» прекращает своё существование.

Плюсы

  1. «Печенька» может существовать настолько долго, на сколько это необходимо сайту. Она будет существовать даже в том случае, если вы закроете и вновь отроете браузер.
  2. Позволяют использовать формы аля «входить автоматически».
  3. Можно хранить временную информацию,  различные пользовательские настройки, например, если пользователь просматривает список отсортированный особенном образом, то можно запомнить тип сортировки и использовать его автоматически для всех списков, просматриваемых этим пользователем.

Минусы

  1. Храняться на пользовательском компьютере, а следовательно, пользователь может просмотреть или изменить их.
  2. Можно хранить информацию, не превышающую определённого размера.
  3. Большее количество информации должно уйти на сервер, что требует больше трафика.

Использование печенек на практике

Создание печеньки.

Определение функции: bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, int secure]]]]])

Создание печеньки

<?php
    if (!isset($_COOKIE['Ordering'])) {
        setcookie("Ordering", $_POST['ChangeOrdering'], time() + 31536000);
    }
?>

Использование печенек

<?php
	echo (isset($_COOKIE[‘ordering’])) ? $_COOKIE[‘ordering’] : ‘cookie value not set’;
?>

Удаление печенек

<?php setcookie(‘favorite_color’); ?>  

Создание пустой печеньки равносильно её удалению, но, конечно, это действие не приведёт к удалению файла с компьютера пользователя. Однако, вы можете установить срок жизни печеньки, по истечению которого файл с информацией будет стёрт с пользовательского компьютера.

Использование сессий на практике

Создание сессии

<?php session_start(); ?>

Этот код должен находиться в верхней части кода, перед ним не должно быть сделано ни какого вывода (echo, print и т.д.). Эта функция проверяет, отправил ли пользовательский браузер печеньки или нет. Если они отправлены, то он загрузит данные из сессии, а если нет, то создаст новый файл сессии на сервере.

Присваиваем значение

<?php $_SESSION[‘first_name’] = ‘Brian’; ?>  

Считываем значение сессии

<?php echo $_SESSION[‘first_name’]; ?>

Удаляем (очищаем значение) сессию

<?php unset($_SESSION[‘first_name’]); ?>

Уничтожаем сессию сессию

<?php session_destroy(); ?> 

Краткий вывод

Сессии храняться на стороне сервера, а печеньки на стороне пользователя. Все они имеют свои преимущества и недостатки, но однажды, настанет день, когда вы сами поймёте, в какой ситуации лучше использовать сессии, а в какой печеньки.

Дополнение от Artem:

Да и в cookie хранить нужно только приватные настройки каждого клиента либо инфу, которая может быть утеряна после закрытия браузера, либо инфу, которая может понадобиться при переходе на другой сервер.

Вообще же лучше всего использовать клиентские способы хранения состояния + хранить состояния в базе данных и в крайнем случае (как пароли) хранить что-либо на сервере, то бишь в сессии. Иначе сервер просто не выдержит нагрузку.

PHP

Онлайн генератор паролей + подробное описание скрипта

замки Чтобы никто не смог войти в вашу квартиру, вы используете замок. Чем лучше этот замок, тем лучше защищена ваша квартира.

В современном мире очень много важной информации, а также электронных ценностей, храниться в сети Интернет и, чтобы защитить это от других или ограничить доступ, надо использовать хорошие «компьютерные замки» — пароли, взломать которые должно быть достаточно трудно. Трудным для взлома или «идеальным» паролем, считаются пароли, состоящие из символов двух раскладок или с применением букв обоих регистров (заглавных и строчных), сочетаний букв и цифр, количество символов в которых не менее 8 символов, а набор символов не имеет какого-либо порядка. (далее…)

PHP

Свежие данные о курсах валют у вас на сайте

Свежие данные о курсах валют у вас на сайте Недавно закончил работу над одним из веб-сервисов. Во время разработке у меня появилась необходимость всегда иметь на сайте информацию о курсах валют на сегодняшний день. Соответственно, вариант ежедневного обновления руками — сразу отпал. Вдруг, я заболею, не будет интернета, забуду обновить, буду всю ночь гулять и проснусь только в 17 часов, а информация о курсах валюты должна быть свежая всегда. Первая мысль была таковой — найти в сети ресурс, где необходимая мне информация всегда «свежая», написать простой грабер и грабить необходимые данные. Но потом я вспомнил о такой очень хорошей вещи для веб-мастеров, как API и «отправился на поиски». Немного поискав я нашёл подходящий мне вариант — скрипт отдающий информацию о курсах практически всех валют в xml. Для начала мне нужны были курсы валют в рублях — для этой цели мне прекрасно подошёл API предоставляемый Центральным Банком Российской Федерации. На сайте всё прекрасно расписано: как работать с данными, какие управлять необходимыми данными, даже есть скрипт для работы с их xml-данными. Немного отредактировав скрипт, я получал необходимую мне информацию не в виде картинки, как это делает скрипт, а в виде массива хранящегося в php-сессии.

Но позже, меня попросили сделать курсы валют в гривнах. Я опять принялся за поиски подобного API, но для Украины. Первым делом зашёл на сайт Национального Банка Украины, но нечего полезного я там не нашёл, в смысле API. Тогда я попросил помощи у Украинцев в твиттере и получил в ответ ссылку на филиал Приватбанка в Украине, где я без труда отыскал API.

Однако, потом я отказался от API Приватбанка, но не из-за плохого API, а по техническим причинам моего веб-сервиса.

Завтра или послезавтра запущу эстафету, поэтому прочитав данный пост «не уходите далеко» от блога. :mrgreen: Первым 5 блогерам, отписавшимся в комментариях к данному посту, передам эстафету.

PHP

PHP: пропорциональное уменьшение изображения

Фух. Наконец-то появилось свободное время — завершил все заказы по верстке, написал с нуля небольшой веб сервис (о нём я расскажу позже. В конце августа или в начале сентября), а теперь напишу небольшой урок по php. Хотя в дальнейшем я буду публиковать новые уроки по программированию. Буду рассматривать свои «старые» скрипты, а также делиться опытом в «прямом эфире» — т.е. научился чему-либо, попробую научить и вас.

Сегодня я разберу скрипт своего старого музыкального портала, который я написал в далёком 2005 году, когда ещё никто и не мечтал о верстке дивами и все верстали таблицами. =) Тогда наверно и не существовало html-верстальщиков — ибо один человек мог написать с нуля статическую домашнюю страничку и гордиться этим. Следовательно, мой сайт был сверстан таблицами и у меня появилась проблема. Поскольку любой пользователь мог добавить в галерею сайта фотографии, то фотографий в галерее было много и они были разного размера, но фотогалерея сайта была задумана так, чтобы фотографии размещались по 4 штуки на строку и было 5 строк на странице. Естественно, в полный размер фото бы не уместились и появился бы горизонтальный скролл. Тогда я решил написать скрипт, который при загрузке фото на сервер, создавал бы уменьшенную копию фотографии с шириной 150 пикселей, не теряя при этом пропорций фотографии. Забыл сказать, данный скрипт расчитан на jpg изображения т.к. подавляющее большинство фотографий делаются в этом формате.

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

<?php
//Определяем размер фотографии — ширину и высоту
$size=GetImageSize ("photo.jpg");
//Создаём новое изображение из «старого»
$src=ImageCreateFromJPEG ("photo.jpg");
//Берём числовое значение ширины фотографии, которое мы получили в первой строке и записываем это число в переменную
$iw=$size[0];
//Проделываем ту же операцию, что и в предыдущей строке, но только уже с высотой.
$ih=$size[1];
//Ширину фотографии делим на 150 т.к. на выходе мы хотим получить фото шириной в 150 пикселей. В результате получаем коэфициент соотношения ширины оригинала с будущей превьюшкой.
$koe=$iw/150;
//Делим высоту изображения на коэфициент, полученный в предыдущей строке, и округляем число до целого в большую сторону — в результате получаем высоту нового изображения.
$new_h=ceil ($ih/$koe);
//Создаём пустое изображение шириной в 150 пикселей и высотой, которую мы вычислили в предыдущей строке.
$dst=ImageCreateTrueColor (150, $new_h);
//Данная функция копирует прямоугольную часть изображения в другое изображение, плавно интерполируя пикселные значения таким образом, что, в частности, уменьшение размера изображения сохранит его чёткость и яркость.
ImageCopyResampled ($dst, $src, 0, 0, 0, 0, 150, $new_h, $iw, $ih);
//Сохраняем полученное изображение в формате JPG
ImageJPEG ($dst, "small_photo.jpg", 100);
imagedestroy($src);
?>

Пример работы скрипта вы можете посмотреть здесь. Исходное изображение находится тут. Если хотите, то можете уменьшить любое другое изображение. Для этого передайте скрипту адрес изображения в виде http://www.zhitenev.ru/demo/img-resize/?photo=http://site.ru/1.jpg, где «http://site.ru/1.jpg» — путь к изображению.

Вот и всё. Для решения задачи нам потребовалось всего лишь 9 строк кода. Удачного вам кодинга и работающего кода. До следующего поста!

PHP

Создаем BBCode для WordPress

Wordpress logo WordPress — популярный блоговый движок. Кстати, сегодня (28 апреля 2009 года) wordpress’у исполняется 6 лет, как проекту. Поздравляем команду разработчиков нашей (по крайней мере для блогеров) любимой cms! Ну больше о нём я нечего вам не буду говорить т.к. сами знаете, а если не знаете, то без труда можете узнать на любом углу. Данная статья будет первой моей статьёй касаемо данной системы управления контентом (cms). Надеюсь, что помидорами не закидаете. Создаем BBCode для WordPress Итак, попробую начать.

На wordpress можно сделать практически любой сайт, если обладать некоторыми навыками. Я сделал сайт видео концертов (www.livevids.ru) используя wordpress. Как вы заметили, если конечно посетили мой видео сайта, что все записи на сайте имеют почти одинаковую структуру т.е. как-бы сделаны по одному шаблону (8 строк html кода). Запомнить такой шаблон очень трудно, поэтому мне приходилось держать его сохранённым в текстовом документе и каждый раз копировать его от туда, что заставляет совершать лишние действия. К тому же, это не слишком удобно в плане каких-либо изменений в этом шаблоне. Поэтому, я решил избавиться от этой проблемы и сразу вспомнил форумы, а именно их ббкоды (BBCode). Тогда я решил внедрить в шаблон для wordpress свой ббкод.

(далее…)

PHP

Проблемы с toobplayer или пишем парсер для youtube

28 марта, если тут имеются посетители моего сайта видео-концертов, то они (или вы:wink:) заметили, что большая часть видео перестала показываться. Вместо обычной буфферизации, за которые следовало воспроизведение видео, пользователи получали сообщение о пыпытке соедениться, а затем ужасную красную надпись «Не влезай, убьёт!» «error». Я написал разработчику плеера, он пообещал разобраться, но после двух суток проблема так и не была решена. К тому-же, общение с разработчиком было усложнено тем, что он иностранец и оно происходило на ломаном английском.

В итоге, я решил разбираться сам по двум причинам.

  1. Время шло, а большая часть видео не работало. Ппосетители пришедшие на сайт хотят смотреть видео прямо сейчас, а не ждать неопределённое время, следовательно я терял посетителей с каждым часом. К тому-же, как на зло, на вчера пришёлся рекорд посещаемости.
  2. Со временем всё сильнее и сильнее мне надоедало моё бессилие, к тому-же на сайте разработчика можно было скачать исходник данного скрипта. Да и php,можно сказать, родной мне язык т.к. многое я на нём сотворил, хотя на звание профи не претендую.

Скачав данный скрипт я начал разбиратся, но далеко я не ущёл т.к. увидел, что скрипт берёт данные из какого-то youtube‘овского url и проследовал по нему. Как оказалось, скрипт «высасывал» из данного url ключ сессии и путь к картинке-превью, а затем выводил их в удобном для флэш —  xml виде. Я проверил работу скрипта — ключ он выводит и картинку тоже, но т.к. этот ключ главная задача скрипта, то я стал разбираться почему видео не показываются. Я отправился на videosaver.ru и вставив туда адрес ролика получил ссылку на скачивание, которую я сравнил со ссылкой, в которую подставил данные «высосанные» скриптом. В результате ссылка полученная скриптом — не работает, а с помощью videosaver.ru — работает. Но тут мне стало жутко лень разбираться почему скрипт не работает и я решил написать свой скрипт, который берёт данные немного из другого источника, а затем выводит их в том-же, более понятном для флэша, xml виде. Суть скрипта очень проста. Скрипту передаётся id видео ролика. Например, страница с видео имеет адрес

http://www.youtube.com/watch?v=zrKO7ftQZm8

, а id данного видео будет

zrKO7ftQZm8

Используя этот id скрипт парсит (ранее «высасывает»http://www.zhitenev.ru/wp-includes/images/smilies/icon_mrgreen.gif) со страницы правильный, работающий ключ и возвращает его. Единственный минус моего скрипта в том, что он не возвращает адрес картинки-превьюшки, но это не критично, имхо. К тому-же, через 3 дня, когда сдам все зачёты, будет больше свободного времени и я доработаю свой скрипт. Тогда он не будет уступать своему со-брату, а именно: сделаю возможным выдачу адреса для картинки-превьюшки и возможность передачи ему, как id страницы, так и обычной ссылки на видео.

Вот сам скрипт.
Скрипт требует подключенную библиотеку curl.

<?php
header("Cache-Control: no-cache, must-revalidate");
header("Content-type: text/xml");
$cUrl = curl_init();
$ur=$_GET['id'];
$urlAddress = "http://www.youtube.com/watch?v=".$ur."";
if (($html = urlGetContents($cUrl, $urlAddress)) === false) {
    print "Адрес <b>".$urlAddress."</b> в данный момент недоступен";
} else {
    print $html;
}
curl_close($cUrl);
function urlGetContents(& $cUrl, $url, $port = 80, $timeout = 5, $errCount = 1)
{
    curl_setopt($cUrl, CURLOPT_URL, $url);
    curl_setopt($cUrl, CURLOPT_PORT, $port);
    curl_setopt($cUrl,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($cUrl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)");
    curl_setopt($cUrl, CURLOPT_TIMEOUT, $timeout);
    $content = curl_exec($cUrl);
    if (curl_getinfo($cUrl,CURLINFO_HTTP_CODE) != 200) {
        return (($errCount < 2) ? urlGetContents($cUrl, $url, $port, $timeout, ++$errCount) : false);
    } else {
        //return $content;
if(eregi("\"t\": \"(.*)\"", $content, $out)) {
$t=substr($out[1],0,44);
$iurl="";
$ur=$_GET['id'];
return '<xml><video video_id="'.$ur.'" iurl="'.$iurl.'" t="'.$t.'" /></xml>';
} else {
return '<xml><message error="Bad URL." /></xml>';
}
    }
}
?>

Если вы используете toobplayer, то в исходнике плеера, в параметрах компонента, укажите в поле youTubeProxy адрес к данному скрипту.