Все публикации

Околофутбол - Недопонимание. 0
Разное

Околофутбол - это нечто связывающее между поколениями. Эта «война» между футбольными клубами началась не вчера, и не сегодня. Это возрождения старых порядков и традиций и соединения его с более современными ведениями стилей боя, сюда входит пресловутая информационная война и уличные бои, и просто любая поддержка свой команды, будь это баннер или какая-либо кричалка. Сами околофутбольшики выделяют себя в субкультуру. Большинство ***ганов предпочитают одеваться у определённых фирм наиболее предпочитаемые: «Adidas», «Ben Sherman», «Stone Island», «Lacoste», «Nike», «Kappa» и т.д. На первый взгляд все выезды с командой и махачи незапланированные и тупые вылазки, но это не так. Несмотря не внешнюю простоту, околофутбол имеет сложную внутреннюю систему подготовки. И в последнее время это стало наиболее распространенное занятие приверженцев футбола, несмотря на опасность и запрет. Это эффективный способ выброса адреналина и для мужчин очень приемлем. Но и можно сказать, что это проявление мужества и стойкости характера, так как, несмотря на то, что есть трагичные последствия на стадионах и т.д., некого это не остановило, или не известны какие-либо массовые отхождения от околофутбола. Наоборот возможно именно эти случаи и привлекают всё больше людей на их сторону. И прежде всего это один из вариантов противостояния системе, в данном случае я имею в виду стычки с полицией. И возможно это единственные люди, которые видят в полиции не добрых защитников правопорядка, а палачей демократической системы. Одна дубинка «демократизатор» чего стоит. Не сомневаюсь, что большинство людей и не могут подумать, что их государство противник людей их же народа. И для околофутбольшиков полиция давно перестало быть безразличной, как погода или гравитация. Передними открывается реальное положение. И «нет ни одного умника с «более сложной» позицией, только мудаки с дубинками и ***ы с камнями. Это непередаваемо круто».
Для многих людей действия околофутбольщиков не понятны и ужасны - «Мне не ясно ради чего Белые ребята бьют Белых ребят», некоторым просто на это наплевать - «Мне просто пофиг. Думаю, они (околофутбольщики) могли бы найти своим кулакам лучшее применение». На всё это со стороны хулов ответом будет одна очень емкая фраза: «Мы этим живем!» и они готовы отстаивать своё мнение. И это делает околофутбольшиков более благородными, поскольку почти всем современным людям не хватает той самоотверженности, полной отдачи своим мыслям и идеям, а некоторым личностям даже просто своего мнения. И сразу задаешь себе вопрос: «Какое право они (личности) имеют критиковать ***ганов?!» Не могут понять, что не для всех людей жизнь ограничивается сиденьем на работе, а потом дома перед телевизором.
P.S. Эта небольшая статью не обсуждение какой-либо проблемы общества, не пропаганда, а просто хочу чтобы люди задумались хоть над чем то. Что может хоть кто-то поймет, что можно сидеть и плакать на крыше, не только от того что тебе бросил парень или ещё произошла какая-либо глупая ситуация, которую люди обычно принимают как конец света, но и ещё от того что мир-это борьба, и ты в ней постоянно проигрываешь. Потому что эта жизнь забирает тех, кто боролся с тобой, кто думал, как ты, кто мог понять тебя. И от этих мыслей появляется злобная ухмылка, «отомщу»- думаешь, но затем появляются слезы. И ты смотришь вдаль, и ветер треплет тебе волосы и одежду. Ветер-это они, они тебя не забудут и ты их тоже, вы всегда будете вместе. Только эти люди дают тебе силы бороться в одиночестве, несмотря на всю силу противника. И все мысли о них это не просто, оно санкционировано ими. И значит, ты должен о них помнить и думать. И значит, они тебе до сих пор доверяют…

Статья Ввята с сайта http://fkrus.info

Автор статьи Journalist_Jul

Суперглобальный массив $_SERVER +13
PHP

Одним из важнейших предопределённых массивов является массив $_SERVER — в него PHP-интерпретатор помещает переменные, полученные от сервера. Без данных переменных сложно организовать полноценную поддержку Web-приложений. Ниже приводится описание наиболее важных элементов суперглобального массива $_SERVER.

Замечание

Просмотреть полный список элементов массива $_SERVER можно либо при помощи функции print_r(), которая распечатывает дамп массива либо при помощи функции phpinfo(), которая выводит информацию о PHP-интерпретаторе.

Элемент $_SERVER['DOCUMENT_ROOT']

Элемент $_SERVER['DOCUMENT_ROOT'] содержит путь к корневой директории сервера, если скрипт выполняется в виртуальном хосте, в данном элементе указывается путь к корневой директории виртуального хоста. Т.е. в конфигурационном файле httpd.conf виртуальный хост имеет директиву DocumentRoot, которой присвоено значение "D:/main", элемент $_SERVER['DOCUMENT_ROOT'] будет содержать значение "D:main".

Элемент $_SERVER['HTTP_ACCEPT']

В элементе $_SERVER['HTTP_ACCEPT'] описываются предпочтения клиента относительно типа документа. Содержимое этого элемента извлекается из HTTP-заголовка Accept, который присылает клиент серверу. Содержимое данного заголовка может выглядеть следующим образом
image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, */*
Заголовок Accept позволяет уточнить медиа-тип, который предпочитает получить клиент в ответ на свой запрос. Этот заголовок позволяет сообщить серверу, что ответ ограничен небольшим множеством предпочитаемых типов.

Символ * используется для группирования типов в медиа-ряду. К примеру, символом */* задается использование всех типов, а обозначение type/* определяет использование всех подтипов выбранного типа type.

Замечание
Медиа-типы отделяются друг от друга запятыми.

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

Замечание
По умолчанию параметр q принимает значение 1. Кроме того, от медиа-типа он отделяется точкой с запятой.
Пример заголовка типа Accept:

Accept: audio/*; q=0.2, audio/basic
В данном заголовке первым идёт тип audio/* включающий в себя все музыкальные документы и характеризующийся коэффициентом предпочтения 0.2. Через запятую указан тип audio/basic, для которого коэффициент предпочтения не указан и принимает значение по умолчанию равное единице. Цитируя RFС2616 данный заголовок можно интерпретировать следующим образом: “Я предпочитаю тип audio/basic, но мне можно также слать документы любого другого audio-типа, если они будут доступны, после снижения коэффициента предпочтения более чем на 80 %”.

Пример может быть более сложным.

Accept: text/plain; q=0.5, text/html, 
        text/x-dvi; q=0.8, text/x-c

Замечание
Следует учитывать, что элемент $_SERVER['HTTP_ACCEPT'] содержит точно такую же информацию, но без начального заголовка Accept.

Этот заголовок интерпретируется следующим образом: Типы документов text/html и text/x-c являются предпочтительными, но если они недоступны, тогда клиент отсылающий данный запрос, предпочтёт text/x-dvi, а, если и его нет, то он может принять тип text/plain.

Элемент $_SERVER['HTTP_ACCEPT_LANGUAGE']

В элементе $_SERVER['HTTP_ACCEPT_LANGUAGE'] описываются предпочтения клиента относительно языка. Данная информация извлекается из HTTP-заголовка Accept-Language, который присылает клиент серверу. Можно привести следующий пример:
Accept-Language: ru, en; q=0.7 
Который можно интерпретировать следующим образом: клиент предпочитает русский язык, но в случае его отсутствия согласен принимать документы на английском. Элемент $_SERVER['HTTP_ACCEPT_LANGUAGE'] будет содержать точно такую же информацию, но без заголовка Accept-Language:
ru, en; q=0.7
Содержимое элемента $_SERVER['HTTP_ACCEPT_LANGUAGE'] можно использовать для определения национальной принадлежность посетителей. Однако результаты будут приблизительными, так как многие пользователи используют английские варианты браузеров, которые будут извещать сервер о том, что посетитель предпочитает лишь один язык — английский.

Элемент $_SERVER['HTTP_HOST']

В элементе $_SERVER['HTTP_HOST'] содержится имя сервера, которое, как правило, совпадает с доменным именем сайта, расположенного на сервере. Как правило, имя, указанное в данном параметре совпадает с именем $_SERVER['SERVER_NAME']. В параметре приводится лишь доменное имя без названия протокола (http://), т.е.
visavi.net

Элемент $_SERVER['HTTP_REFERER']

В элементе $_SERVER['HTTP_REFERER'] приводится адрес страницы, с которой посетитель пришёл на данную страницу. Переход должен осуществляться по ссылке. Создадим две страницы index.php и page.php.

Страница index.php

<?php 
  echo "<a href=page.php>Ссылка на страницу PHP</a><br />"; 
  echo "Содержимое $_SERVER['HTTP_REFERER'] - ". 
        $_SERVER['HTTP_REFERER'] 
?> 

Страница page.php будет аналогичного содержания, но ссылка будет указывать на страницу index.php.

Страница page.php

<?php 
  echo "<a href=index.php>Ссылка на страницу PHP</a><br />"; 
  echo "Содержимое $_SERVER['HTTP_REFERER'] - ". 
        $_SERVER['HTTP_REFERER'] 
?>
При переходе с одной страницы на другую, под ссылкой будет выводится адрес страницы, с которой был осуществлён переход.

Элемент $_SERVER['HTTP_USER_AGENT']

Элемент $_SERVER['HTTP_USER_AGENT'] содержит информацию о типе и версии браузера и операционной системы посетителя.

Вот типичное содержание этой строки: "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)". Наличие подстроки "MSIE 6.0" говорит о том, что посетитель просматривает страницу при помощи Internet Explorer версии 6.0. Строка "Windows NT 5.1" сообщает, что в качестве операционной системы используется Windows XP.

Замечание
Для Windows 2000 элемент $_SERVER['HTTP_USER_AGENT'] выглядит следующим образом: "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)')", в то время как для Windows XP — "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)".
Если посетитель воспользуется браузером Opera, то содержание $_SERVER['HTTP_USER_AGENT']может выглядеть следующим образом: "Mozilla/4.0 (compatible; MSIE 5.0; Windows 98) Opera 6.04 [ru]". Подстрока "MSIE 6.0" здесь так же присутствует, сообщая, что браузер Opera является совместимым с браузером Internet Explorer и использует те же динамические библиотеки Windows. Поэтому, при анализе строки, возвращаемой браузером, следует иметь в виду, что к Internet Explorer относится строка, содержащая подстроку "MSIE 6.0" и не содержащая подстроки "Opera". Кроме того, из данной строки можно заключить, что пользователь использует операционную систему Windows 98.

Замечание
Пользовательский агент браузера Firefox может выглядеть следующим образом Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20051111 Firefox/1.5.

При использовании браузера Netscape, содержание элемент $_SERVER['HTTP_USER_AGENT'] может выглядеть следующим образом: "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624 Netscape/7.1". Принадлежность к этому браузеру можно определить по наличию подстроки "Netscape". Кроме того, можно узнать, что посетитель выходит в Интернет, используя операционную версию Linux, с ядром, оптимизированным под Pentium IV, находясь в графической оболочке X-Window. Этот механизм удобно использовать для сбора статистической информации, которая позволяет дизайнерам оптимизировать страницы под наиболее распространенные браузеры.

Элемент $_SERVER['REMOTE_ADDR']

В элемент $_SERVER['REMOTE_ADDR'] помещается IP-адрес клиента. При тестировании на локальной машине — этот адрес будет равен 127.0.0.1. Однако при тестировании в сети переменная вернёт IP-адрес клиента или последнего прокси-сервера через который клиент попал на сервер. Если клиент использует прокси-сервер узнать его IP-адрес можно при помощи переменной окружения HTTP_X_FORWARDED_FOR, значение которой можно получить при помощи функции getenv().

Замечание
Прокси-сервера являются специальными промежуточными серверами, предоставляющими специальный вид услуг: сжатие трафика, кодирование данных, адаптация под мобильные устройства и т.п. Среди множества прокси-серверов различают так называемые анонимные прокси-сервера, которые позволяют скрывать истинный IP-адрес клиента, такие сервера не возвращают переменной окружения HTTP_X_FORWARDED_FOR.

Извлечение переменной окружения HTTP_X_FORWARDED_FOR

<?php 
  echo getenv(HTTP_X_FORWARDED_FOR); 
?>

Элемент $_SERVER['SCRIPT_FILENAME']

В элемент $_SERVER['SCRIPT_FILENAME'] помещается абсолютный путь к файлу от корня диска. Так, если сервер работает под управлением операционной системы Windows, то такой путь может выглядеть следующим образом "d:main estindex.php", т.е. путь указывается от диска, в UNIX-подобной операционной системы путь указывается от корневой директории /, например "/var/share/www/test/index.php".

Элемент $_SERVER['SERVER_NAME']

В элемент $_SERVER['SERVER_NAME'] помещается имя сервера, как правило, совпадающее с доменным именем сайта, расположенного на нём. Например,
visavi.net
Содержимое элемента $_SERVER['SERVER_NAME'] часто совпадает с содержимым элемента $_SERVER['HTTP_HOST']. Помимо имени сервера суперглобальный массив $_SERVER позволяет выяснить ещё ряд параметров сервера, например IP-адрес сервера, прослушиваемый порт, какой Web-сервер установлен и версию HTTP протокола. Эта информация помещается в элементы $_SERVER['SERVER_ADDR'], $_SERVER['SERVER_PORT'], $_SERVER['SERVER_SOFTWARE'] и $_SERVER['SERVER_PROTOCOL'], соответственно. Ниже приводится пример с использованием данных элементов.

Использование элементов массива $_SERVER

<?php 
  echo "Имя сервера - ".$_SERVER['SERVER_NAME']."<br />"; 
  echo "IP-адрес сервера - ".$_SERVER['SERVER_ADDR']."<br />"; 
  echo "Порт сервера - ".$_SERVER['SERVER_PORT']."<br />"; 
  echo "Web-сервер - ".$_SERVER['SERVER_SOFTWARE']."<br />"; 
  echo "Версия HTTP-протокола - ".$_SERVER['SERVER_PROTOCOL']."<br />"; 
?>

Элемент $_SERVER['REQUEST_METHOD']

В элемент $_SERVER['REQUEST_METHOD'] помещается метод запроса, который применяется для вызова скрипта: GET или POST.

<?php 
  echo $_SERVER['REQUEST_METHOD']; // GET 
?>

Элемент $_SERVER['QUERY_STRING']

В элемент $_SERVER['QUERY_STRING'] заносятся параметры, переданные скрипту, если строка запроса представляет собой адрес

http://www.mysite.ru/test/index.php?id=1&test=wet&id_theme=512

то в элемент $_SERVER['QUERY_STRING'] попадёт весь текст после знака "?". Например, при обращении к скрипту, представленному ниже, помещая в строке запроса произвольный текст после знака "?" получим страницу с введённым текстом.

<?php 
  echo $_SERVER['QUERY_STRING']; // id=1&test=wet&id_theme=512 
?>

Элемент $_SERVER['PHP_SELF']

В элемент $_SERVER['PHP_SELF'] помещается имя скрипта, начиная от корневой директории виртуального хоста, т.е. если строка запроса представляет собой адрес

http://www.mysite.ru/test/index.php?id=1&test=wet&id_theme=512
то элемент $_SERVER['PHP_SELF'] будет содержать фрагмент "/test/index.php". Как правило, этот же фрагмент помещается в элемент $_SERVER['SCRIPT_NAME'].

Элемент $_SERVER['REQUEST_URI']

В элемент $_SERVER['REQUEST_URI'] содержит имя скрипта, начиная от корневой директории виртуального хоста и параметры, т.е. если строка запроса представляет собой адрес:
http://www.mysite.ru/test/index.php?id=1&test=wet&id_theme=512

то элемент $_SERVER['REQUEST_URI'] будет содержать фрагмент "/test/index.php?id=1&test=wet&id_theme=512". Для того, чтобы восстановить в скрипте полный адрес, который помещён в строке запроса, достаточно использовать комбинацию элементов массива $_SERVER, представленную ниже

Полный адрес к скрипту

<?php 
  echo "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']; 
?>
Автор - Симдянов И.В.

Работа с SQLite +8
SQL

SQLite – это реляционная база данных, запросы к которой можно осуществлять при помощи языка запросов SQL. База данных не поддерживает все особенности SQL и уступает в функциональности другим развитым СУБД, но вполне подходит для хранения и извлечения информации.

Отличие SQLite от MySQL и аналогичных СУБД
Классические СУБД, такие как MySQL (а так же MS SQL, Oracle, PostgreeSQL) состоят из отдельного сервера, поддерживающего работу базы данных и прослушивающих определённый порт, на предмет обращения клиентов. В качестве клиента может выступать в том числе и расширение PHP, реализующего интерфейс, с помощью которого осуществляются запросы к базе. Движок SQLite и интерфейс к ней реализованы в одной библиотеке, что увеличивает скорость выполнения запросов. Такой сервер часто называют встроенным.

Замечание

Встроенный сервер имеется и у других баз данных, например, у MySQL, но его использование требует лицензионных отчислений, поэтому не получило широкое распространение в мире открытых исходных кодов.
SQLite является бестиповой базой данных. Точнее, есть только два типа – целочисленный "integer" и текстовый "text". Причём "integer" используется преимущественно для первичного ключа таблицы, а для остальных данных пойдёт "text". Длина строки, записываемой в текстовое поле, может быть любой.

Особенности SQLite
Все базы данных хранятся в файлах, по одному файлу на базу. Количество баз данных, а так же таблиц в них, ограниченно только свободным местом, имеющимся на сайте. А максимально возможный объём одной базы данных составляет 2 Тб.
Так как все данные хранятся в файлах, проблем с переносом базы данных с одного хостинга на другой не существует – достаточно лишь скопировать соответствующие файлы.

Установка SQLite
В PHP5 поддержка SQLite установлена и включена по умолчанию.
Установка под Windows: Для установки SQLite необходимо скачать и скопировать в папку с расширениями библиотеку "php_sqlite.dll", которую можно загрузить по ссылке: http://snaps.php.net/win32/PECL_STABLE/php_sqlite.dll. Затем необходимо раскомментировать (или добавить) строку "extension=php_sqlite.dll" в файле "php.ini". Для нормального функционирования SQLite также необходимо раскомментировать строку "extension=php_pdo.dll".

Замечание
Если используется полная версия PHP в zip-архиве, а не в виде инсталлятора, соответствующие библиотеки расширения должны находится в директории ext. Подробнее можно почитать в статье Установка Apache, PHP, MySQL.
Библиотека "php_pdo.dll" должна загружаться до загрузки "php_sqlite.dll". То есть в php.ini строка "extension=php_sqlite.dll" должна стоять после "extension=php_pdo.dll".
Установка под Unix: Скачайте свежую версию SQLite с официального сайта (http://sqlite.org/download.html). Прочтите файл "INSTALL", поставляемый с исходными тестами модуля. Или просто воспользуйтесь командой установки PEAR: "pear install sqlite".

Работа с SQLite
Создание базы данных: Для того чтобы создать новую базу данных необходимо воспользоваться функцией sqlite_open(). Если базы, имя которой указано в параметре "filename" не существует, то функция создаст новую базу данных с именем "filename" и вернёт идентификатор базы данных.
resource sqlite_open ( string filename [, int mode [, string &error_message]] )
В скрипте, преведённом ниже, демонстрируется создание новой базы данных:

<?php 
  // Создадим базу данных 
  $db = sqlite_open("my_database.db"); 
  if (!$db) exit("Не удалось создать базу данных!"); 
?>

В результате в папке со скриптом у нас появится файл с именем "my_database.db" – наша база данных.
Создание таблиц: Все запросы к базе данных выполняет функция sqlite_query(), которая имеет следующий синтаксис:
resource sqlite_query ( resource dbhandle, string query )

Замечание
Для работы с SQLite, как и любой реляционной базой данных используется язык запросов SQL. Поэтому создать таблицу данных можно при помощи традиционного запроса CREATE TABLE, вставить запись при помощи оператора INSERT, извлечь запись при помощи SELECT, а обновить существующую запись при помощи запроса UPDATE.

В приведённом ниже примере создаётся таблица table1, содержащая три поля: целочисленное поле id, которое выступает в качестве первичного ключа, и два текстовых поля field1 и field2.

<?php 
  // Создадим новую базу данных 
  $db = sqlite_open("my_database.db"); 
  if (!$db) exit("Невозможно создать базу данных!"); 
  // Создадим таблицу "table1" в базе 
  $query_table = sqlite_query($db, "CREATE TABLE table1 
                              (id INTEGER PRIMARY KEY, 
                              /* id автоматически станет автоинкрементным */ 
                               field1 TEXT, 
                               field2 TEXT); 
                              "); 
  if (!$query_table) exit("Невозможно создать таблицу в базе данных!"); 
  // Запишем что-нибудь в таблицу 
  $query_insert = sqlite_query($db, "INSERT INTO table1(field1, field2) VALUES ('PHP5', 'Apache');"); 
  if (!$query_insert) exit("Невозможно записать данные в таблицу!"); 
?>

После создания таблицы, в неё добавляется запись, содержащая строки 'PHP5' и 'Apache', поле id автоматически получает значение 1.

Вывод данных из базы: Для вывода данных из таблиц используется всё та же функция – sqlite_query(). Если выбирается несколько записей, результат выборки следует обработать при помощи цикла while() и функции sqlite_fetch_array(), которая имеет следующий синтаксис:
array sqlite_fetch_array ( resource result [, int result_type [, bool decode_binary]] )
Ниже приводится скрипт, демонстрирующий вывод нескольких записей из базы данных:

<?php 
  // Создадим новую базу данных 
  $db = sqlite_open("my_database.db"); 
  if (!$db) exit("Невозможно создать базу данных!"); 
  // Создадим таблицу "table1" в базе 
  $query_table = sqlite_query($db, "CREATE TABLE table1 
                              (id INTEGER PRIMARY KEY,  
                               /* id автоматически станет автоинкрементным */ 
                               field1 TEXT, 
                               field2 TEXT); 
                              "); 
  if (!$query_table) exit("Невозможно создать таблицу в базе данных!"); 
  // Запишем что-нибудь в таблицу 
  sqlite_query($db, "INSERT INTO table1(field1, field2) VALUES ('PHP5+', 'Apache');"); 
  sqlite_query($db, "INSERT INTO table1(field1, field2) VALUES ('SQLite – ', 'классная вещь');"); 
  sqlite_query($db, "INSERT INTO table1(field1, field2) VALUES ('Посетите ', 'sqlite.org');"); 
  // Сделаем выборку данных 
  $res = sqlite_query($db, "SELECT * FROM table1;"); 
  // В цикле выведем все полученные данные 
  while ($array = sqlite_fetch_array($res))  
  { 
    echo($array['field1'].$array['field2']." (id записи:".$array['id'].")<br />"); 
  } 
?>

В результате работы скрипта получим:
HP5+Apache (id записи:1) 
SQLite – классная вещь (id записи:2) 
посетите sqlite.org (id записи:3)

Редактрирование записи: Для изменения поля воспользуемся функцией sqlite_query() и передадим ей запрос на обновление (UPDATE).

<?php 
  // Создадим новую базу данных 
  $db = sqlite_open("my_database.db"); 
  if (!$db) exit("Невозможно создать базу данных!"); 
  // Создадим таблицу "table1" в базе 
  $query_table = sqlite_query($db, "CREATE TABLE table1 
                              (id INTEGER PRIMARY KEY,  
                               /* id автоматически станет автоинкрементным */ 
                               field1 TEXT, 
                               field2 TEXT); 
                              "); 
  if (!$query_table) exit("Невозможно создать таблицу в базе данных!"); 
  // Запишем что-нибудь в таблицу 
  sqlite_query($db, "INSERT INTO table1(field1, field2) VALUES ('PHP5+', 'Apache');"); 
  sqlite_query($db, "INSERT INTO table1(field1, field2) VALUES ('SQLite – ', 'классная вещь');"); 
  sqlite_query($db, "INSERT INTO table1(field1, field2) VALUES ('Посетите ', 'sqlite.org');"); 
  // Изменим поле с id=1 
  sqlite_query($db, "UPDATE table1 SET field2='Apache+Linux' WHERE id=1;"); 
  // Сделаем выборку данных 
  $query = sqlite_query($db, "SELECT * FROM table1;"); 
  // В цикле выведем все полученные данные 
  while ($array = sqlite_fetch_array($query))  
 { 
    echo($array['field1'].$array['field2']." (id записи:".$array['id'].")<br />"); 
  } 
?>

В результате получим:
PHP5+Apache+Linux (id записи:1) 
SQLite – классная вещь (id записи:2) 
посетите sqlite.org (id записи:3)
Удаление записи из таблицы: Чтобы удалить запись из таблицы, нужно передать функции sqlite_query() запрос на удаление (DELETE).

<?php 
  // Создадим новую базу данных 
  $db = sqlite_open("my_database.db"); 
  if (!$db) exit("Невозможно создать базу данных!"); 
  // Создадим таблицу "table1" в базе 
  $query_table = sqlite_query($db, "CREATE TABLE table1 
                              (id INTEGER PRIMARY KEY,  
                               /* id автоматически станет автоинкрементным */ 
                               field1 TEXT, 
                               field2 TEXT); 
                              "); 
  if (!$query_table) exit("Невозможно создать таблицу в базе данных!"); 
  // Запишем что-нибудь в таблицу 
  sqlite_query($db, "INSERT INTO table1(field1, field2) VALUES ('PHP5+', 'Apache');"); 
  sqlite_query($db, "INSERT INTO table1(field1, field2) VALUES ('SQLite – ', 'классная вещь');"); 
  sqlite_query($db, "INSERT INTO table1(field1, field2) VALUES ('Посетите ', 'sqlite.org');"); 
  // Удалим поле с id=2 
  sqlite_query($db, "DELETE FROM table1 WHERE id=2;"); 
  // Сделаем выборку данных 
  $query = sqlite_query($db, "SELECT * FROM table1;"); 
  // В цикле выведем все полученные данные 
  while ($array = sqlite_fetch_array($query))  
  { 
    echo($array['field1'].$array['field2']." (id записи:".$array['id'].")<br />"); 
  } 
?>

В результате получим:
PHP5+Apache (id записи:1) 
посетите sqlite.org (id записи:3)
Закрытие базы данных: Для закрытия базы данных используется функция sqlite_close(). В качестве единственного параметра функция принимает идентификатор открытой базы данных.
void sqlite_close ( resource dbhandle )

Схема использования данной функции представлена ниже
<?php 
  $db = sqlite_open("my_database.db"); 
  /* 
  ... Здесь происходит работа с БД ... 
  */ 
  sqlite_close($db); 
?>

Замечание
Закрывать базу данных данной функцией – необязательно. Все открытые базы данных автоматически закроются при завершении работы скрипта.
Автор - Гончаров А.Н.

История карандаша +2
Разное

Каранда́ш (тюрк.. «кара таш» — чёрный камень) — пишущий инструмент в виде деревянного стержня с графитовой сердцевиной (грифелем).
Карандаши принято делить на простые и цветные. Простой карандаш пишет, как правило, серым цветом. Бывают также цветные карандаши. Новый карандаш перед первым применением необходимо заточить. Помимо одноразовых деревянных карандашей существуют многоразовые механические карандаши со сменными грифелями.
Карандаши различаются по твёрдости грифеля, которая как правило указана на карандаше и обозначается буквами М (или B) — мягкий и Т (или H) — твёрдый. Стандартный (твёрдо-мягкий) карандаш помимо сочетаний ТМ и HB обозначается буквой F.
В отличие от Европы и России, в США для указания твёрдости используется числовая шкала.
Таблица соответствия шкал твердости
США
Европа
Россия
#1
B
М
#2
HB
ТМ
#2 1/2
F
-
#3
H
Т
#4
2H

История карандаша
Начиная с XIV века, художники, по большей части, использовали для рисования палочки, изготовленные из смеси свинца с цинком, которые иногда называли «серебряными карандашами». Для примера, подобным карандашом пользовался великий художник Ботичелли.
Однако графитные карандаши известны с XVI века. Английские пастухи из местности Камберленд нашли в земле темную массу, которой они воспользовались, чтобы метить овец. Из-за цвета, схожего с цветом свинца, месторождение приняли за залежи этого минерала. Но, определив непригодность нового материала для изготовления пуль, начали производить из него тонкие заостренные на конце палочки и использовали их для рисования. Эти палочки были мягкими, пачкали руки и подходили только для рисования, но не для письма.
В XVII веке графит продавали обычно на улицах. Художники, чтобы было удобнее и палочка не была такой мягкой, зажимали эти графитовые «карандаши» между кусочками дерева или веточками, обворачивали их в бумагу или обвязывали их бечёвкой.
Первый документ, в котором упоминается деревянный карандаш, датирован 1683 годом. В Германии производство графитных карандашей началось в Нюрнберге. Немцы, смешавая графит с серой и клеем, получили стержень не такого высокого качества, но по более низкой цене. Чтобы скрыть это, производители карандашей прибегали к разным хитростям. В деревянный корпус карандаша вначале и на конце вставляли кусочки чистого графита, в середине же находился низкокачественный искусственный стержень. Иногда внутренность карандаша и вовсе была пустой. Так называемый «Нюрнбергский товар» не пользовался хорошей репутацией.
Современный же карандаш изобрел в году талантливый французский ученый и изобретатель Николя Жак Контэ. В конце XVIII века английский парламент ввёл строжайший запрет на вывоз драгоценного графита из Камберленда. За нарушение этого запрета наказание было очень суровым, вплоть до смертной казни. Но, несмотря на это, графит продолжал попадать в континентальную Европу контрабандным путем, что привело к резкому увеличению его цены. По заданию французского конвента, Контэ разработал рецептуру смешивания графита с глиной и производства из этих материалов высококачественных стержней. С помощью обработки высокими температурами была достигнута высокая прочность, однако ещё более важным был тот факт, что изменение пропорции смеси давало возможность делать стержни различной твердости, что и послужило основой современной классификации карандашей по твёрдости.
В современных грифелях используются полимеры, которые позволяют добиваться нужного сочетания прочности и эластичности, дают возможность изготавливать очень тонкие грифели для механических карандашей (до 0.3 мм)..
Шестигранную форму корпуса карандаша предложил в конце XIX века граф Лотар фон Фаберкастл, заметив, что карандаши круглого сечения часто скатываются с наклонных поверхностей для письма.
Почти 2/3 материала, составляющего простой карандаш, уходит в отходы при его заточке. Это натолкнуло американца Алонсо Таунсенда Кросса на создание в 1869 году металлического карандаша. Графитный стержень размещался в металлической трубке и мог по необходимости выдвигаться на соответствующую длину.
Это изобретение повлияло на развитие целой группы товаров, использующихся сегодня повсеместно. Самой простой конструкцией является механический карандаш с грифелем 2 мм, где стержень удерживается металлическими прижимами (цангами) - цанговый карандаш. Открываются цанги при нажатии кнопки на конце карандаша, что приводит к выдвиганию на длину, регулируемую владельцем карандаша.
Современные механические карандаши более совершенны. При каждом нажатии кнопки происходит автоматическая подача небольшого участка грифеля. Такие карандаши не нужно затачивать, они снабжены встроенным (как правило, под кнопкой подачи грифеля) ластиком и имеют различную фиксированную толщину линии (0.3мм, 0.5мм, 0.7мм, 0.9мм, 1мм).
Источник http://ru.wikipedia.org/wiki/Карандаш

КИДАЛЫ +15
Разное

Ник: User и TRIGER aka User
ICQ: не известно
E-mail: hitman16@bk.ru
Причина добавления:
Кидает на написание скриптов и обманом берёт деньги в долг, и не возвращает
Дополнительная информация:
Имя: Вася
Дата рождения: 31.06.1991
Город: Иркутск
http://visavi.net/pages/anketa.php?uz=User
WMID: 341616007185

Ник: Vitaut
ICQ: 591576354
E-mail: не известен
Причина добавления:
Кидает на деньги, после исполнения и передачи ему работы
WMID: 293604297827

Ник: v1zor, vizor
ICQ: 858777
E-mail: box.razer@gmail.com
Причина добавления:
Кидала со стажем, своего промысла не стесняется и считает что кидать "лохов" это хорошо
Дополнительная информация:
http://visavi.net/pages/anketa.php?uz=Vizor&
WMID: не известно

Ник: Кошkод@в
ICQ: 6667994
E-mail: не известно
Причина добавления:
Продаёт ICQ-номера, отдаваю покупателям липовые пароли
Дополнительная информация:
Кошельки: R226123495667, R164744458385
WMID: 345520285557

Ник: Sasha
ICQ: 380613842
E-mail: colmex@bk.ru
Причина добавления:
Продал аккаунт waplog.net, после чего восстановил пароль по E-mail
WMID: 2147483647

Ник: Div
ICQ: 362239291
E-mail: не известно
Причина добавления:
Продаёт бесплатную программу накрутки на телефон, говорит что написал сам
WMID: 215162000441

Ник: absent, SiLVeR, Fuck
ICQ: 9444820
E-mail: payaloff@mail.ru
Причина добавления:
Кидает всех подряд, мутит с скриптом партнёрки
WMID: 328008914191

Ник: Repak, Чего надо, КИМО
ICQ: 67979796
E-mail: support@tokat.ru repak-hip-hop@mail.ru
Причина добавления:
Кинул на акк ваплога, не отдал деньги.
Дополнительная информация:
Сайт - TOkat.ru fanon.ru, Д/р - 6.9.1989, Город - Харьков
WMID: 381945178605

Ник: SLIVA
ICQ: 3604522
E-mail: slivered@mail.ru
Причина добавления:
Барыжит чужими скриптами, часто не отдаёт товар. Брал в долг, не отдал.
WMID: 768209380443

Ник: Xcondor
ICQ: 485991699
E-mail: xcondor@mail.ru
Причина добавления:
Кинул на акк ваплога. Кинул много народа, будте осторожней
WMID: не известно

Объектно-ориентированное программирование (часть2) +1
ООП

Основные понятия
В объектно-ориентированном программировании выделяют три основных элемента: инкапсуляция, наследование, полиморфизм. Статья не ставит своей целью всестороннее рассмотрение всех аспектов ООП. Здесь лишь кратко будет рассмотрена их суть.
Инкапсуляция. Инкапсуляция – это скрытие реализации. Для пользователей класса неважно как реализован класс, важено лишь какие методы доступны, т.е. какой интерфейс представляет класс. Мы уже дважды встречали инкапсуляцию. В первом случае мы объявили поля класса как закрытые (private), т.е. скрыли их от посторонних глаз. Методы также можно делать закрытыми (private), они не будут доступны для внешнего пользователя, однако их можно будет вызывать внути открытых (public) методов этого же класса. Закрытые методы необходимы для того, чтобы упростить открытый методы метод, разбив сложную задачу на несколько более простых. В первую очередь это необходимо для реорганизации кода, для более удобного его чтения и понимания. Во втором случае это также закрытое поле $db. Мы присвоили внутренней переменной соответствующий тип данных, скрыв не только реализацию, но и процесс создание объекта.
Замечание
Объект можно создать и внутри класса, например, в конструкторе.
Управление инкапсуляцие осуществляется при помощи модификаторов доступа – их три:
Public – поля и методы видны везде – в самом классе, в классе потомке, просто во внешнем участке кода, использующем класс.
Private – данные видны только в том классе, в котором они определены.
Protected – данные видны как в том классе, в котором они определены, так и в классе, который наследует первоначальный класс, однако для внешнего кода данные не доступны.
Наследование. В косвенной форме мы уже сталкивались со связью классов друг с другом, когда объявляли переменную типа DataBase. Мы неявно произвели связывание с помощью включения. Но что же такое наследование в более обычном его понимании? Под наследованием понимается расширение старого класса до нового путём расширения функциональности, т.е. новый класс будет содержать те же методы (которые, кстати, могут и изменить свою реализацию) и свойства прежнего класса.
Новый класс мы называем классом-потомком, а прежний, от которого происходит наследование, классом-предком или базовым классом. Наследование используется, в первую очередь, для построения иерархических систем, в котором классы-потомки развивают функциональность базовых классов. Наследование также может использоваться для изменения логики первоначальной реализации - т.е. для модификации уже существующего приложения.
Рассмотрим пример. Пусть необходимо расширить перечень параметров, которые может ввести пользователь в гостевой книге. Пусть помимо имени, email и сообщения пользователи получают возможность вводить адрес Web-сайта и номер ICQ. Для этого не требуется создавать новый класс, мы просто наследуем уже готовую реализацию от класса GuestBook.

<? 
class SharedGuestBook extends GuestBook 
{ 
    private $url; 
    private $icq; 
     
    public function __construct($name, $email, $msg, $url, $icq) 
    { 
        parent :: __construct($name, $email, $msg); 
        $this->url = $url; 
        $this->icq = $icq; 
    } 
    public function getUrl() 
    { 
        return $this->url; 
    } 
    public function getIcq() 
    { 
        return $this->icq; 
    } 
} 
?>
Как видно из листинга, старые методы не нужно реализовывать - именно так достигается одна из важнейших задач объектно-ориентированного подхода - повторное использование кода.
Обратите внимание на реализацию конструктора - parent :: __construct($name, $email, $msg); - обратимся к официальной документации (http://www.php.net/manual/ru/language.oop5.paamayim-nekudotayim.php): Когда дочерний класс перегружает методы, объявленные в классе-родителе, PHP не будет осуществлять автоматический вызов методов, принадлежащих классу-родителю. Этот функционал возлагается на метод, перегружаемый в дочернем классе. Данное правило распространяется на [url = http://www.php.net/manual/ru/language.oop5.decon.php]конструкторы и деструкторы[/url], перегруженные и "магические" методы.
С помощью ключевого слова extends как раз и осуществляется наследование. Теперь настало время изменить класс GuestBookDb для работы с новым типом данных.
<? 
class SharedGuestBookDb extends GuestBookDb 
{ 
    public function Select() 
    { 
        $sql = "SELECT name, email, msg, url, icq FROM new_guestbook"; 
        $dbArray = $this->db->Db2Array(); 
        foreach($dbArray as $rows) 
        { 
            $outPut[] = new SharedGuestBook($rows['name'], $rows['email'], $rows['msg'], $rows['url'], $rows['icq']); 
        } 
        return $outPut; 
    } 
    public function Insert($obj) 
    { 
        $name = $obj->getName(); 
        $email = $obj->getEmail(); 
        $msg = $obj->getMsg(); 
        $url = $obj->getUrl(); 
        $icq = $obj->getIcq(); 
         
        $sql = "INSERT INTO new_guestbook (name, email, msg, url, icq) VALUES('$name', '$email', '$msg', '$url', '$icq')"; 
        if($this->db->Insert($sql) === TRUE) 
            return TRUE; 
        return FALSE; 
    } 
} 
?>
В данном случае нет необходимости перегружать конструктор, т.к. он остался неизменным. Мы просто переопределили необходимые методы – изменили их функционал, оставив их предыдущие названия, а это уже полиморфизмом пахнет smile
При наследовании мы можем переопределить любой метод, но иногда нам надо запретить переопределение методов, оставив первоначальную реализацию. Для подобного случая необходимо использовать ключевое слово final. Рассмотрим пример.
<? 
class SomeClass 
{ 
    private $var; 
     
    final public function PrintVar() 
    { 
        echo $var; 
    } 
    public function SetVar() 
    { 
        $this->var = "From SomeClass"; 
    } 
} 
class SomeClassNew extends SomeClass 
{ 
    public function SetVar() 
    { 
        $this->var = "From SomeClassNew"; 
    } 
} 
?>
Если мы бы начали переопределять метод PrintVar(), то возникла бы ошибка.
Также мы можем объявлять и классы с ключевым словом final, если будет необходимость запретить наследование от данного класса.
Полиморфизм. Полиморфизмом называется возможность применения методов с одинаковыми именами в группе классов, связанных наследованием.
Конструкторы и деструкторы
Конструктор. Мы уже немного знакомы с конструкторами. Давайте познакомимся с ними поближе. И так, конструкторы, в сущности являющиеся специальными методами, вызываются каждый раз при создании объекта класса, в котором определен конструктор. В классе может и не быть конструктора, а также может быть только один конструктор. Обычно конструктор используют для инициализации какого-либо поля класса, т.е. для задания первоначального состояния объекта, например, с помощью вызова некоторых методов, как правило, приватных. Если конструктор содержит параметры, то и объект должен быть вызван с соответствующими параметрами. Естественно, если мы объявим метод с параметрами, то и вызвать его должны с тем же количеством параметров, а, как уже говорилось выше, конструктор – специальный метод, который вызывается при создании объекта. Поэтому и объект мы должны создавать с параметрами. Давайте создадим объект для нашего класса GuestBook
<? 
$guest_book = new GuestBook($name, $email, $msg); 
?>
Если бы не было конструктора или конструктор не содержал бы параметров, то мы создавали бы объект так:
<? 
$var = new SomeClass(); 
?>
Нам также известно из предыдущих примеров как вызывать конструкторы, объявленные в родительских классах – parent :: __construct();
Деструктор. Деструктор вызывается при уничтожении объекта. Деструктор не может содержать параметры. Как и конструктор, деструктор тоже специальный метод со специальным именем __destruct(). Обычно деструктор используется для очищения памяти от различного мусора: закрытие соединения с базой данных, закрытие файла, удаление ненужных переменных и т.д. Для вызова деструктора класса-предка, по аналогии с конструктором, - parent :: __destruct();
Моделирование на более высоком уровне абстракции. Абстрактные классы и интерфейсы.
Архитектор начинает свой проект с макета здания, с чертежа. Программист же начинает проект с абстрактной модели. Мы уже моделировали гостевую книгу, но на наименьшем уровне абстракции. Вспомним, что класс является абстрактным типом данных, поэтому абстракция имеет достаточно важное значение. Мы проектируем сущность, но мы еще не знаем или пока не хотим затрагивать реализацию, поэтому мы только делаем макеты методов, которые будут работать с данными. На первоначальном этапе нам надо только описать функциональность класса, оставляя детали реализации. Нам просто надо понять то, что мы хотим сделать над теми данными, которые мы включили в наш тип. Также мы заботимся о тех программистах, которые будут или разрабатывать логику методов, или использовать наши будущие методы, или как-то иначе использовать наш тип данных. Для организации вышесказанного на арену выходят абстрактные классы, их абстрактные методы, а также интерфейсы.
Если в классе объявлены абстрактные методы, то и класс тоже должен быть объявлен как абстрактный. Абстрактный класс может содержать и обычные методы и поля. Нельзя создавать объект абстрактного класса, но его нужно переопределять классами потомками. Т.е. абстрактные классы служат прототипами классов, которые наследуют их основу. Мы безоговорочно должны принять правила, диктуемые нам абстрактными классами. Если мы объявили абстрактный метод с двумя параметрами, то в последующих классах мы должны реализовать одноименный метод именно с тем же числом параметров.
Создадим абстрактный класс для класса GuestBookDb, а класс SharedGuestBookDb мы можем унаследовать как от абстрактного класса, так и от класса GuestBookDb.
<? 
abstract class GbDb 
{ 
    private $db; 
     
    public function __construct($db) 
    { 
        $this->db = $db; 
    } 
     
    abstract public function Select(); 
    abstract public function Insert($obj); 
} 
class GuestBookDb extends GbDb 
{ 
    public function Select() 
    { 
        // реализация 
    } 
    public function Insert($obj) 
    { 
        // реализация 
    } 
} 
class SgbDb extends GuestBookDb 
{ 
    public function Select() 
    { 
        // реализация 
    } 
    public function Insert($obj) 
    { 
        // реализация 
    } 
} 
?>
Абстрактные классы выгодны тогда, когда в них содержится менее абстрактная реализация, например, как в нашем примере. А если нам необходима только абстракция? И нужно унаследовать класс от нескольких абстрактных сущностей, мы же помним, что наследовать мы можем только от одного класса? И на сцену выходят интерфейсы. В интерфейсе можно объявлять без спецификаторов, в т.ч. и abstract. В интерфейсе можно определять только абстракцию действий, т.е. методы, которые могут быть только публичными. Действительно, мы же абстрагируем видимую реализацию. Нам надо показать не только себе, но и другим разработчикам работу нашего класса. Давайте рассмотрим интерфейс на практике. Немного изменим наш предыдущий код.
<? 
interface GbDb 
{ 
    function Select(); 
    function Insert($obj); 
} 
class GuestBookDb implements GbDb 
{ 
    public function Select() 
    { 
        // реализация 
    } 
    public function Insert($obj) 
    { 
        // реализация 
    } 
} 
class SgbDb extends GuestBookDb 
{ 
    public function Select() 
    { 
        // реализация 
    } 
    public function Insert($obj) 
    { 
        // реализация 
    } 
} 
?>
Мы можем наследовать сразу несколько интерфейсов. Усовершенствуем нашу гостевую, добавим методы обновления базы данных и выборки определенной записи по конкретному идентификационному номеру.
<? 
interface GbDb 
{ 
    function Select(); 
    function Insert($obj); 
} 
interface GbDbNew 
{ 
    function Update($id, $obj); 
    function SelectWithId($id); 
} 
class GuestBookDb implements GbDb, GbDbNew 
{ 
    public function Select() 
    { 
        // реализация 
    } 
    public function Insert($obj) 
    { 
        // реализация 
    } 
    public function Update($id, $obj) 
    { 
        // реализация 
    } 
    public function SelectWithId($id) 
    { 
        // реализация 
    } 
} 
class SgbDb extends GuestBookDb 
{ 
    public function Select() 
    { 
        // реализация 
    } 
    public function Insert($obj) 
    { 
        // реализация 
    } 
    public function Update($id, $obj) 
    { 
        // реализация 
    } 
    public function SelectWithId($id) 
    { 
        // реализация 
    } 
} 
?>
Мы можем наследовать одновременно как класс, так и интерфейс. При этом класс наследуется первым. Один интерфейс может наследовать другой интерфейс применяя ключевое слово extends.
Вот мы и рассмотрели некоторые особенности объектно-ориентированного подхода написания сценариев на языке РНР. Мы не затронули некоторые темы, например, статические элементы класса, обработку исключений. Когда вы научитесь проектировать классы и писать ОО код, то и эти темы будут вам более понятны.

Объектно-ориентированное программирование (часть1) +6
ООП

Введение
Данная статья рассчитана на начинающих разработчиков в области ООП. Я работаю с пятой версией РНР, поэтому и статья рассчитана на эту версию.
Первое, что необходимо понимать - класс это не набор функций или удобный контейнер для переменных, а абстрактный тип данных (АТД). Язык РНР не является строго типизированным языком, поэтому для начала необходимо разобраться с "простыми" типами. Целые числа (1, 45, 100, 378 и т.д.) имеют целочисленный тип, integer. Массивы – тоже тип данных. Более подробно с типами данных можно ознакомиться в документации - http://www.php.net/manual/ru/language.types.php. Класс также является типом данных, а объект - своеобразная переменная этого типа.
При создании класса чётко понять задачу, которую мы хотим представить. Часто построение класса является моделированием той сущности, которую необходимо перенести в код. Объект является отражением сущности, которая описана в виде класса. При моделировании класса стоит выявить те необходимые части сущности, над которыми будут производиться необходимые действия, с помощью методов. То есть необходимые части сущности являются полями класса, они как раз отражают данные, которые составляют общий тип данных. Этим тип объекта напоминает данные типа массив.
Методы выполняют разнообразные действия над данными. Методы следует проектировать так, чтобы они работали только с теми данными, которые определены в классе. Не рекомендуется определять методы, которые как-либо влияют на внешние данные. Так называемая стратегия слабого связывания - чем меньше связей между классами и внешними данными - тем проще извлечь класс из системы и повторно использовать его вновь.
Например, класс пачки сигарет состоит из упаковки и массива самих сигарет, следует создавать методы, которые работают только с упаковкой и сигаретами. Нет необходимости использовать методы, с помощью которых мы открываем бутылку газировки или даже прикуриваем сигарету. Каждый класс должен реализовывать только те действия, которые работают с данными самого класса. Не надо пытаться засунуть в один класс всю реализацию целого приложения. Например, есть сайт, который состоит из главной страницы, гостевой книги, страницы новостей, раздела статей и ссылок на дружественные сайты. Опишите каждый раздел сайта своим классом или классами. Классы, отражающие разделы сайта, могут вступать в наследование друг с другом. Т.е. мы представляем раздел как сущность, отдельный тип данных. Снова повторю, что в классе, моделирующем раздел новостей, не надо определять элементы других разделов, если нет необходимости. Если требуется что-то представить из других разделов, используйте включение. Например, пусть на странице новостей требуется вывести заголовки последних статей. Определите в классе новостей поле типа класса статей и используйте методы этого типа. Не надо пытаться писать методы, выводящие заголовки статей в классе, моделирующем новости. Определите необходимый метод в соответствующем классе, классе, представляющем статьи.
Теперь приступим к конкретным примерам. Попробуем создать простейшую гостевую книгу.
Первое, что сделаем, это определим части необходимой нам сущности. Этими частями будут имя посетителя, его email и собственно его сообщение. Приступим.

<? 
class GuestBook 
{ 
    private $name; 
    private $email; 
    private $msg; 
     
    public function __construct($name, $email, $msg) 
    { 
        $this->name = $name; 
        $this->email = $email; 
        $this->msg = $msg; 
    } 
} 
?>
Во-первых, мы объявили необходимые части нашего типа данных. Во-вторых, поля объявлены с модификатором доступ private, который означает, что с полями класса можно работать только методам этого же класса, но про модификаторы доступа будет рассказано позже. В-третьих, мы объявили метод __construct($name, $email, $msg). Этот метод является конструктором класса. О конструкторах и деструкторах будет рассказано немного позже, сейчас же запомните, что конструкторы всегда автоматически выполняются первыми, до всех остальных методов класса, непосредственно сразу после выделения памяти под объект. Деструкторы же выполняются последними, непосредственно перед уничтожением объекта.
В-четвёртых, мы использовали ключевое слово $this. $this означает ссылку на объект, для которого реализована та или иная конструкция. В отличие от других языков программирования, при обращении к членам класса, обязательно следует использовать $this: $this->name и $name - это две разные переменные.
Теперь подумаем над тем, как нам обращаться к полям объекта. Реализуем методы, которые вернут соответствующие значения.
<? 
class GuestBook 
{ 
    private $name; 
    private $email; 
    private $msg; 
     
    public function __construct($name, $email, $msg) 
    { 
        $this->name = $name; 
        $this->email = $email; 
        $this->msg = $msg; 
    } 
     
    public function getName() 
    { 
        return $this->name; 
    } 
    public function getEmail() 
    { 
        return $this->email; 
    } 
    public function getMsg() 
    { 
        return $this->msg; 
    } 
} 
?>
Теперь данные класса можно читать из вне.
При разработке гостевой книги неизбежно встаёт вопрос, как хранить данные. Воспользуемся для этого базой данных MySQL. Добавим новое поле типа DataBase – это специальный тип для работы с БД. В конструкторе проведем инициализацию. Создадим методы для получения данных из базы и наполнения базы. Метод чтения (SELECT) реализуем так:
<?php 
public function Select() 
{ 
    $sql = "SELECT name, email, msg FROM guestbook"; 
    $dbArray = $this->db->Db2Array(); 
    foreach($dbArray as $rows) 
    { 
        $outPut[] = new GuestBook($rows['name'], $rows['email'], $rows['msg'], $this->db); 
    } 
    return $outPut; 
} 
?>
Метод добавления значений реализуем следующим образом:
<?php 
public function Insert() 
{ 
    $sql = "INSERT INTO guestbook (name, email, msg) VALUES('{$this->name}', '{$this->email}', '{$this->msg}')"; 
    if($this->db->Insert($sql) === TRUE) 
        return TRUE; 
    return FALSE; 
} 
?>
Первый метод возвращает массив объектов GuestBook, второй возвращает TRUE, если данные успешно добавлены, и FALSE - в противном случае.
В первой строке метода Select() cоздается SQL-запрос к базе на выборку всех значений.
Во второй строке из базы извлекается результирующая таблица в виде массива $dbArray. Как это происходит будет описано позже. В пятой строке мы создаем массив объектов типа GuestBook, который и возвращается в качестве результата. Напомню, чтобы обратиться к соответствующим полям мы реализовали соответствующие методы.
Для второго метода также создан SQL-запрос, но уже на добавление данных в базу (INSERT). Если запрос выполнен удачно, возвращаем истину (TRUE), иначе – ложь (FALSE).
Разрабатывая Web-приложение с использованием ООП, следует помнить о производительности, которая всегда ниже по сравнению с процедурным подходом. Метод Select, возвращающий значения каждый раз требует обращения к новому объекту типа DataBase. Если в базе хранится тысячи записей, это вызовет значительные накладные расходы - обработка каждой из записей потребует создания дополнительного объекта DataBase. Давайте придумаем выходы из подобной ситуации. Первое что приходит на ум, это не инициализировать поле типа DataBase, а написать соответствующий метод, который инициализирует поле $db.
<?php 
public function setDb($db) 
{ 
    $this->db = $db; 
} 
?>
Напомним, что параметр $db – это экземпляр класса DataBase. Можно поступить и так:
<?php 
public function setDb($db) 
{ 
    $this->db = new DataBase(‘login’,’password’,’host’,’database’); // Параметры – значения подключения к базе данных. 
} 
?>
Однако снова таки тысячу раз инициализировать объект типа DataBase не оптимально. Надо думать дальше smile
Практика показала, что более оптимально разбить подобный класс на два: в первом реализовать инициализацию сущности, а во второй объявить необходимые методы для работы с базой данных.
<? 
class GuestBook 
{ 
    private $name; 
    private $email; 
    private $msg; 
     
    public function __construct($name, $email, $msg) 
    { 
        $this->name = $name; 
        $this->email = $email; 
        $this->msg = $msg; 
    } 
     
    public function getName() 
    { 
        return $this->name; 
    } 
    public function getEmail() 
    { 
        return $this->email; 
    } 
    public function getMsg() 
    { 
        return $this->msg; 
    } 
} 
class GuestBookDb 
{ 
    private $db; 
     
    public function __construct($db) 
    { 
        $this->db = $db; 
    } 
    public function Select() 
    { 
        $sql = "SELECT name, email, msg FROM guestbook"; 
        $dbArray = $this->db->Db2Array(); 
        foreach($dbArray as $rows) 
        { 
            $outPut[] = new GuestBook($rows['name'], $rows['email'], $rows['msg']); 
        } 
        return $outPut; 
    } 
    public function Insert($obj) 
    { 
        $name = $obj->getName(); 
        $email = $obj->getEmail(); 
        $msg = $obj->getMsg(); 
         
        $sql = "INSERT INTO guestbook (name, email, msg) VALUES('$name', '$email', '$msg')"; 
        if($this->db->Insert($sql) === TRUE) 
            return TRUE; 
        return FALSE; 
    } 
} 
?>
Что же изменилось: во-первых, мы получаем также массив объектов с помощью метода Select, но теперь он содержит только необходимые данные. Теперь на тысячу объектов GuestBook, создается только один объект GuestBookDb. В памяти не будет храниться тысячу раз данные типа DataBase. Во-вторых, немного изменился метод Insert(). У него появился параметр – объект типа GuestBook – это необходимо, чтобы занести данные в базу. В результате таких преобразований нагрузка на сервер немного снизится.

MySQL class меньше кода,больше дела +14
SQL

Последние время надоело выполнять кучу запросов к базе и писать кучу кода,подсчёт результатов,проверка на существование,перегонять масcивы.Я решил написал class для удобной работы и сокращения кода.
Вот собственно небольшой класс

<?
/*
MySQL класс BY Орёл
icq: 952042
*/
/*Возвратит число*/
define('COUNT_NUM','countnum');
/*Возвратит запрос*/
define('QUERY','query');
/*Возвратит масив*/
define('ARRAY','array');
/*Возвратит асоцытивный масив*/
define('ASSOC','assoc');
/*Возвратит масив для Smarty цикла section*/
define('TEMPLATE','template');
/*Запрос с проверкой на существование ,возвращение true ,false*/
define('NUM_ROWS','numrows');
class sql_class{
function sql($query,$option){
if ($option == 'countnum'){
$OR_SELECT = mysql_result(mysql_query($query),0);
if (!$OR_SELECT) {$OR_SELECT = 0;}
return $OR_SELECT;
}elseif ($option == 'query'){
$OR_SELECT = mysql_query($query);
return $OR_SELECT;
}elseif ($option == 'array'){
$OR_SELECT = mysql_query($query);
$data = mysql_fetch_array($OR_SELECT);
return $data;
}elseif ($option == 'assoc'){
$OR_SELECT = mysql_query($query);
$data = mysql_fetch_assoc($OR_SELECT);
return $data;
}elseif ($option == 'template'){
$OR_SELECT = mysql_query($query);
while ($data = mysql_fetch_assoc($OR_SELECT)){
$dat[] = $data;
}
return $dat;
}elseif ($option == 'numrows'){
$OR_SELECT = mysql_query($query);
if (mysql_num_rows($OR_SELECT)){
return true;
}else{
return false;
}
}
}
function mysql_error(){
return mysql_error();
}
}
?>
Синтакси функции sql::sql()
sql(query,option)
query - Запрос в базу
option - Опция что вернуть
6 опций
COUNT_NUM - вернёт число mysql_result()
QUERY - вернёт запрос
ARRAY - вернёт масив с нумерацией
ASSOC - вернёт асоцитивный массив без нумерации полей ,но с именами
TEMPLATE - вернёт масив для шаблона Smarty
NUM_ROWS - выполнит проверку на существование и вернёт true или false
Ниже приведу примеру работы с классом.
Вызываем класс
<?
$s = new sql; // Достаточно один раз вызвать в шапке
?>
вызов функции
Пример-1 нам надо подсчитать количество записей в таблице с id 1
<?
$result = $s->sql("SELECT COUNT(*) FROM table WHERE id='1'",COUNT_NUM);
echo $result; // Результат
?>
Пример-2 выполнить и вернуть запрос
<?
$result = $s->sql("SELECT * FROM table WHERE id='1'",QUERY);
?>
Пример-3 сделать запрос и вернуть масив с именами полей и нумерацией.
<?
$result = $s->sql("SELECT * FROM table WHERE id='1'",ARRAY);
print_r($result); //Читаем массив
?>
Пример-4 получить асоцитивный масив без нумерации полей,но с именами
<?
$result = $s->sql("SELECT * FROM table WHERE id='1'",ASSOC);
print_r($result); //Читаем массив
?>
Пример-5 сделать запрос с выполнением подсчёта mysql_num_rows возвращение true или false
К примеру нам надо проверить существует ли в таблицы юзер с id 1
<?
$result = $s->sql("SELECT * FROM user WHERE id='1'",NUM_ROWS);
if ($result){
echo 'Пользователь существует';
}else{
echo 'Пользователь не существует';
}
?>
Пример-6 пример запроса и возвращение массива для шаблонизатора Smarty
<?
$result = $s->sql("SELECT * FROM user ",TEMPLATE);
?>

Вывод в шаблоне
{section name=i loop=$result}
{$result[i].name_pole}
{/section}
Для вывода ошибки запроса
echo $s->mysql_error();
Вроде всё smile .

PHP классы +14
ООП

E-mail
Swift Mailer
Swift Mailer легко интегрируется в любое PHP-приложение. Это гибкий и элегантный ООП-подход к отправке писем с множеством функций: отправка эл.почты, используя SMTP, SendMail, Postfix, поддержка серверов и др.
PHPMailer
Лучший класс для работы с эл. почтой. Поддерживает сообщения в цифровой форме, S/MIME шифрование, текстовые и HTML-письма, изображения, поддерживает несколько E-mail’ов, SMTP-аутентификация.
Формы
Securimage PHP Captcha
Скрипт для создания сложных изображений (капч) для защиты от спамеров. Легко добавляется в любую форму.
phpObjectForms
ООП библиотека для создания и обработки HTML-форм. Основные возможности: поддержка всех стандартных форм ввода, проверка на стороне сервера с помощью регулярных выражений, проверка на стороне клиента с помощью Javascript, поддерживает шаблоны форм. Стили форм записываются в CSS и вы можете легко настроить их отображение.
Изображения / медиа / файлы
PHP Thumb
Маленькая библиотека для работы с изображениями: изменение размеров, поворот, Crop. Вы также можете добавлять пользовательские функции. Может выполнять подряд несколько действий, без неодходимости сохранять и повторно инициализировать класс со всеми манипуляциями.
WideImage
ООП-библиотека для работы с изображениями. Она обеспечивает простой способ подгрузки и хранения изображений из файлов, баз данных и URL. Поддерживает наиболее распространённые графические форматы: GIF, PNG, JPEG, GD и GD2.
Smart Image Resizer
Позволяет изменять размер и кропать любые изображения на вашем сайте фактически их не касаясь. Просто загрузите изображения в максимальном его размере а затем используйте любые его части. Обладает множеством полезных функций.
class.upload.php
Это небольшой PHP-скрипт для закачки изображений и управления ими на сервере. Он может конвертировать изображения из одного формата в другой, изменять размер, добавлять метки, водяные знаки и “размывать” изображения. Вы можете использовать его для файлов, загруженных с помошью HTML-формы, Flash Uploader или локальных файлов.
getID3()
PHP-скрипт, который извлекает полезную информацию из MP3 и других мультимедийных форматов (OGG, WMA, WMV, ASF, WAV, AVI, AAC, VQF, FLAC, MusePack, Real, QuickTime, Monkey’s аудио, MIDI и т.д.)
Javascript / AJAX
PHPLiveX
Небольшая библиотека, которая позволяет легко интегрировать технологию AJAX в ваш веб-проект. Вы можете отправлять данные формы и отправлять запрос на другую страницу без перезагрузки текущей.
Xajax
Очень известная библиотека и Javascript-движок, который позволяет вам легко создавать мощные Ajax-приложения с использованием HTML, CSS, Javascript, PHP. Страницы получают возможность асинхронно посылать запросы на сервер и обновлять содержимое страницы без её перезагрузки.
RSS/Atom
SimplePie
PHP-класс, который предоставляет простую API для выполнения всей грязной работы по получению, кэшированию, разбору и нормализации структуры RSS и Atom форматов.
Безопасность
PHP Intrusion Detection System (PHPIDS)
Пресекает попытки злоумышленников нарушить работу вашего сайта. В настоящее время PHPIDS обнаруживает всевозможные XSS, SQL-инъекции, RFE / LFI, DoS и LDAP нападений.
Тестирование и отладка
PHPUnit
SimpleTest
PHP Debug
Базы данных
ADOdb
Объектно-ориентированная библиотека. Сделана по побразцу Microsoft ADO, но имеет ряд усовершенствований, которые делают её уникальной (например сводные таблицы, кэширование записей…) Поддерживает большое количество баз данных, в том числе: MySQL, PostgreSQL, Interbase, Firebird, Informix, Oracle, MS SQL, FoxPro, Access, ADO, Sybase, FrontBase, DB2, SAP DB, SQLite, Netezza, LDAP.
Doctrine
Представляет собой объектно-реляционное отображение (ORM) в PHP 5.2.3+. Ключевая особенность этой библиотеки в том, что она позволяет писать запросы к базе данных в объектно-ориентированном виде, с помощью собственного диалекта SQL – Doctrine Query Language (DQL). Это мощная альтернатива обычным SQL-запросам.
PHPLINQ
Набор PHP-классов для управления базами данных.
Работа с документами
TCPDF
Класс, генерирующий PDF документы. Не требует других библиотек, поддерживает форматы ISO, в т.ч. UTF-8, Unicode, RTL и HTML.
PHPPowerPoint
Работает на основе стандартов Microsoft OpenXML. Позволяет читать и записывать документы PowerPoint. Дает возможность управлять мета-данными (автор, название, описание, …), добавлять слайды и изображения в презентации и многое другое.
PHPExcel
Также работает на Microsoft OpenXML. Позволяет читать и записывать файлы Excel. Возможности включают в себя: редактирование мета данных (автор, название, описание, …), управление электронными таблицами, шрифтами, стилями, добавление изображений и многое другое.
PhpRtf Lite
Позволяет создавать и редактировать, совместимые с MS Word и Open Office Writer, RTF с помощью PHP. Позволяет контролировать практически всё. Совместим с кодировкой UTF-8

Ускорение работы сценариев PHP 5 +13
PHP

Увидел тут статью камрада True, захотелось плеваться. Информация устарела. Ну что ж, а теперь по существу.
Пункт 1:
"Вы должны осознавать что при преобразованиях (preg_replace, str_replace) регулярки используют гораздо больше ресурсов чем строковые функции, поэтому рекомендую там где можно обойтись использовать именно str_replace или str_ireplace"
В целом всё верно, но функция strtr является более быстрой, особенно для больших объёмов данных, например, для сообщения на форуме.
Пункт 2:
"Помните о том, что в большинстве случаев, если все же надо использовать регулярку preg_match работает быстрее чем eregi"
Функции ereg и её друзей вообще больше нет в PHP 5.3 и выше. Поэтому речь даже не о скорости, а о совместимости.
Пункт 3:
"Незачем генерировать файлы содержащие большие обьемы данных, если часто с ними надо работать сценарию. Гораздо лучше использовать множество мелких файлов. Хотя и в количестве файлов надо стараться знать меру"
Если честно, то я не понял, о чём речь. Если о данных, то их вообще не надо хранить в файлах. А если о коде, то лучше уж всё в большом файле, ибо всякие include и require работают слишком долго.
Пункт 4:
"Незачем повторно выполнять одни и те же действия если вы можете создать переменную, которая будет содержать результат действия"
Слишком размытый совет. Не всегда это верно. Приведу простой пример:

<?php
# $array - какой-то массив
for ($i = 0; $i < count ($array); ++$i) {
# Операции с массивом
} ?>
Тут надо ввести переменную $count, содержащую результат выполнения count ($array), так как в приведённом примере функция будет вызываться при каждом выполнении цикла.
Пункты 5 и 6:
"Надо помнить, что например функция echo при выводе работает быстрее чем print, а вывод заключенный в одиночные кавычки работает быстрее чем в двойные. Связано это с тем, что в двойных кавычках текст еще и обрабатывается (переменные преобразуются), а в одиночных выводится как есть"
"Не стоит вводить переменные с длинными именами, в дальнейшем это может аукнуться весьма сильно"
В PHP 5 это совсем не актуально, PHP научили не заморачиваться лишний раз над такими вещами smile

Облако тегов / Авторы