|
Компьютерная скорая помощь
|
|
|
||||||||||
|
|
PHP
Функции в РНР.
Что нужно понимать под функцией в программировании? Функция – последовательность инструкций, имеющая
имя и результат. Т.е. вы один раз оформляете, какой то кусок кода, как функцию, а потом, можете использовать его, вызывая функцию,
в любом месте вашей программы. PHP обладает большим количеством встроенных функций. Но, очень часто бывает нужно, использовать
собственные функции. Например, в разных частях программы, нужно выполнять, какие то похожие действия. Не переписывать же каждый
раз один и тот же фрагмент кода.
Работа со строками в РНР.
Тема, которую мы сегодня рассмотрим, является важной, т.к. работать со строками приходится особенно часто. Начнем с простого. Конкатенация строк. Этим хитрым словом называется присоединение одной строки к другой. Начиная с PHP 3-ей версии, для сложения строк применяется оператор «.». (раньше использовался +). Существует ещё один способ сложения строк. В виду того, что каждая переменная начинается со знака $, то если написать echo “Привет $name”; вместо $name будет подставлено значение переменной $nam
Работа с файлами в РНР. Часть вторая.
Продолжим рассматривать особенности работы с файлами в РНР. В этой части я расскажу о полезных функциях, для работы с файлами, которые не вошли в первую статью (временные файлы, чтение файлов CSV, функции для работы с именами файлов, блокировка файлов). Итак, обо всём по порядку. Иногда необходимо организовать в программе работу с временными файлами. Функция int tmpfile() создаёт новый файл с уникальным именем и открывает его на чтение/запись. Чтение CSV файлов. Знаете что такое CSV файлы? Если нет, вспомните программу Microsoft Exel. CSV - это один из форматов, в которых Exel может сохранять свои таблицы.
Голосование на PHP
Хочу рассказать Вам, как написать голосование на PHP. Голосование - хорошее средство для того, что бы узнать мнение посетителей сайта, по какому либо вопросу. Хорошо продуманное голосование может помочь понять веб мастеру, что не так на его сайте, что нужно изменить, что добавить и т.д. Но, не буду Вас учить, как выбирать тему для голосования.
Лучше подскажу, как написать удобную систему голосований. Переходим к делу. Несколько слов, о том, каким будет скрипт, и как он должен работать. С помощью скрипта можно будет создавать неограниченное количество голосований. Скрипт будет называться vote.php, а файл, в котором хранится инфа по голосованиям - vote.dat. Скрипт состоит из админской части, части,
которая отображает голосование, и которая учитывает голоса. Чтобы получить доступ к любой из этих частей, будем использовать
параметр-переменную action.
Mail форма
Думаю, что Вы часто видели mail-формы на многих сайтах. Они представляют собой html форму связанную с web скриптом.
Их цель отправлять письма на указанный адрес email. При этом, отправителю не нужно запускать почтовую программу, он может
вообще не иметь почтового ящика. Вы согласны, что будет не плохо, если посетитель, не отрываясь от просмотра вашего сайта,
сможет отправить вам пожелание, замечание, благодарность и т.д.? Если да, тогда начнём писать наш скрипт. И html форма и
скрипт будут находится в одном файле. Назовём его mail.php. В форме будет три поля: имя отправителя, его email, текст
сообщения.
Работа с формами
Данная статья расскажет Вам, как осуществить связь между пользователем и PHP скриптом.В большинстве скриптов, пользователь
должен передать им какие-либо параметры. Пример – гостевая книга. В качестве параметров этому скрипту обычно передаются
текст сообщения, имя и email посетителя.
Счётчик на PHP
Советую использовать этот пример только в учебных целях, так как он имеет большое количество недостатков, которые будут рассмотрены далее. Итак, начнем. Каждый раз, когда посетитель заходит на страницу с данным кодом, скрипт выдаёт ему число - количество посетителей. Это число должно где-то храниться. Используем для этого файл. Для того, что бы работать с файлом, его нужно открыть.
Работа с файлами в PHP.
Использования файлов в любом языке программирования открывает для программиста абсолютно новые возможности. Теперь можно сохранять данные на диск, и использовать их в любой момент. Работать с файлами в PHP очень просто (как впрочем, и со всем остальным). Всю работу с файлом можно разделить на три этапа. 1)Открытие файла. При открытии файла возвращается число – дескриптор файла. При этом вся дальнейшая работа ведётся именно с этим дескриптором. 2)Выполняется обработка файла (запись, чтение и т.д.) 3) Закрытие файла.
Основные конструкции языка PHP.
В этой статье я расскажу о языковых конструкциях языка веб программирования PHP. Изучив их, вы уже сможете писать простенькие программы. Особенностью конструкций этого языка является простота.
if-else, while, for, foreach, case - основные конструкции языка. Рассмотрим каждую из них подробнее.
Переменные в PHP
Вы никогда не хотели сделать свой сайт интерактивным, гибким, динамическим? Не задумывались ли Вы,
как создають гостевую книгу, форум, голосование, чат и т.д.? Всего этого можно легко добиться с
помощью языков веб программирования. Среди этих языков особенно известны Perl и PHP. У каждого
из них есть свои преимущества и недостатки. Но я посоветовал бы начать изучать именно PHP.
Основным его плюсом является простота изучения. Тем не менее, эта простота не мешает ему сочетать в
себе все достоинства Perl. На РНР можно написать практически всё: начиная от простого счётчика посещений
и заканчивая поисковой системой (напр. движок сайта aport.ru написан на PHP). Число сайтов использующих
PHP растёт с огромной скоростью. Аргументов, для того, чтобы ознакомится с РНР, по-моему, достаточно.
Вступление
Поскольку в интернете уже существует достаточное количество сайтов о PHP, публикующих материалы, рассчитанные на новичков, мы приняли решение в основном ориентироваться на людей, уже несколько разбирающихся в PHP-программировании. Это необходимо для того, чтобы понимать примеры кода, которые будут приводиться в дальнейшем. Тем не менее, несмотря на предполагаемую подготовленность читателя, в первой статье мы дадим краткий обзор по PHP вообще - что он из себя представляет, какие задачи с его помощью следует решать, некоторые особенности синтаксиса, и т.п.
Что такое PHP?
PHP (его полное название: PHP: Hypertext Preprocessor) - это язык, предназначенный для быстрого создания динамических web-страниц.
Синтаксис языка похож на С, Java и Perl, однако имеет и свои,
присущие только ему особенности. В официальной документации PHP определяется как server-side HTML-embedded scripting language (встраиваемый в HTML скриптовый язык с обработкой на сервере).
Из этого определения можно выделить два основных момента:
Обработка кода PHP производится на сервере, а не в браузере клиента, как, например JavaScript
Код PHP может быть встроен непосредственно в тело HTML страницы, что выгодно отличает его от Perl.
Ниже приведен пример PHP скрипта, взятый из фирменной документации по PHP, код PHP выделен синим цветом.
<html>
<head>
<title>Example</title>
</head>
<body>
<?php echo "Hi, I'm a PHP script!"; ?>
</body>
</html>
Из этого примера виден принцип встраивания кода PHP в HTML код страницы: все, что находится между начальным и конечным тегом PHP (<?php и ?> соответственно) считается PHP кодом и обрабатывается интерпретатором PHP.
Немного истории
Создателем PHP первоначально был Rasmus Lerdorf, но сейчас разработкой этого языка занимается довольно большое количество людей, поставивших своей задачей его дальнейшее расширение и развитие. За время своего существования (а первая версия PHP появилась в конце 1994 года) этот язык претерпел очень значительные изменения, коснувшиеся как внешней его структуры (синтаксиса, набора функций и т.п.), так и внутренней организации. Последний раз подобные глобальные изменения коснулись PHP с появлением 4-й версии этого языка, когда PHP был полностью переписан с использованием Zend scripting engine, разработанным компанией Zend technologies. Это позволило добавить в синтаксис языка ряд новых функций, а также сделать его существенно быстрее, чем предыдущие версии. Причиной, по которой удалось добиться таких результатов является то, что Zend scripting engine является наполовину компилятором, т.е. компилирует PHP код, а уж затем производит его выполнение, тогда как предыдущие версии PHP были по своей сути интерпретаторами. В наших публикациях мы в основном будем вести разговор именно о PHP версии 4. Кстати, на момент публикации этой статьи последняя официальная версия PHP имеет номер 4.0.6
Синтаксис PHP
Как уже было сказано ранее - синтаксис PHP во многом заимствован из таких языков как C, Java и Perl. Поэтому, если вы знакомы хотя бы с одним из них - вам не составит особого труда просто сесть и начать писать программы на PHP. Здесь мы не будем подробно останавливаться на описании синтаксиса - он хорошо описан в PHP Manual. Однако мне хотелось бы остановиться на некоторых аспектах, которые отличают PHP от других языков.
Имена переменных
Любая переменная в PHP имеет имя, начинающееся со знака $, например $variable. Людям, привыкших к C/C++-подобным языкам этот принцип именования переменных может показаться странным, но на самом деле такой подход имеет определенные преимущества.
При таком способе формирования имен переменных их очень легко отличить от остального кода. Если в других языках иногда может возникать путаница с тем, что при первом взгляде на код не всегда ясно - где здесь переменные, а где функции, то в PHP этот вопрос даже не встает.
Данный принцип позволяет очень просто и элегантно реализовать функциональность, просто недоступную иначе. Например, ссылка на переменную по ее имени, хранящемуся в другой переменной:
$name = 'value'; $value = 5; echo $$name;
В данном примере PHP
выведет результат 5. Такие фокусы стали возможны
из-за заложенного в PHP принципа: "anything is
an expression" (любая вещь является выражением).
Исходя из этого PHP воспринимает выражение
$$name
следующим образом:
парсер встречает символ $, а это значит, что следующее выражение является именем переменной
парсер встречает еще один символ $, и продолжает поиски имени уже другой переменной, значение которой необходимо для вычисления значения предыдущего выражения.
парсер получает имя name, находит переменную с таким именем, берет ее значение ('value') и возвращается назад.
поскольку на предыдущем шаге мы искали имя переменной, то значение только что вычисленного выражения воспринимается именно как имя переменной. Парсер ищет переменную с таким именем (value) и возвращает ее результат (5).
Как видите, это очень гибкая система и при небольшой тренировке вы сможете просто творить чудеса с ее помощью! Ведь точно так же можно оперировать с любыми элементами языка, имеющими имя, т.е. например вызывать метод класса по его имени, содержащемуся в переменной (о классах в PHP мы поговорим в одной из следующих публикаций).
Строки
Возможность однозначно идентифицировать переменную позволила создателям PHP дать возможность программистам использовать переменные непосредственно внутри строк! Пример подобного использования:
$name = 'John'; $age = 23; echo "$name is $age years old";
В качестве результата мы получим строку: John is 23 years old.
Не правда ли, это исключительно удобно? Однако необходимо обратить ваше внимание на одну деталь - в PHP, в отличие от многих других языков, различаются строки, заключенные в одинарные и двойные кавычки. И подобное замещение имен переменных их значениями производится только в строках, заключенных в двойные кавычки! Очень важно всегда помнить об этом, дабы избежать ошибок.
Строки, заключенные в двойные кавычки могут содержать и более сложные выражения. Для этого необходимо заключить их в фигурные скобки:
$man = array('John',23);
echo "{$man[0]} is {$man[1]} years old";
Результат будет таким же, как и в предыдущем примере.
Еще одной интересной особенностью работы PHP со строками является поддержка т.н. here docs. Ниже приведен пример:
$str = <<<TEXT
There can be any text
which will be stored
into a string
right in the same way
as it
typed here
TEXT;
В этом случае значением переменной будет весь текст, содержащийся между начальным и конечным маркерами (в данном случае это строка TEXT, но этот маркер может быть любой последовательностью символов). Признаком того, что это here doc, является наличие <<< непосредственно после знака присваивания. Данный механизм очень удобен в случае, если строке необходимо присвоить какой-то сложный текст, особенно, если необходимо сохранить его форматирование. Кстати, в случае использования here docs вы также имеете возможность использования переменных внутри строки как это было описано ранее.
Массивы
Массивы в PHP - это очень мощный и гибкий механизм. Он позволит вам сделать практически все, что вы только можете пожелать сделать с массивами. Поддерживаются как обычные, так и ассоциативные массивы, причем они могут быть смешаны в любом порядке даже в пределах одного массива. Поддерживаются вложенные массивы, их вложенность никак явно не ограничена. В PHP существует большое количество функций для работы с массивами, они помогут вам выполнить большинство
необходимых операций без лишних затрат времени и сил. Кроме того, необходимо отметить еще одну особенность PHP при работе с массивами: в отличие от других языков PHP позволяет задавать массивы практически любой сложности непосредственно в теле программы! Возможно с первого взгляда эта возможность не покажется вам такой уж важной, однако это не так. В вашей практике вам не раз придется столкнуться с необходимостью описания какой-нибудь сложной структуры данных и наполнением
этой структуры данными. В других языках для этого как правило приходится писать дополнительный код, что не всегда удобно. В PHP же вы можете сделать это очень просто и элегантно:
$data = array(1,10,100,1000, // Численные данные
'Some text','Another text', // Строковые данные
'name'=>'John','age'=>23, // Ассоциативные связи в массиве
'date'=>array('day'=>10,'month'=>'may','year'=>2001));
//Вложенный массив
Как видите - различные данные могут быть совмещены вместе в единой структуре без каких-либо проблем! Посмотрим, как можно обратиться к этим данным:
echo $data[1]; // Результат - 10 echo $data[5]; // Результат - 'Another text' echo $data['age']; // Результат - 23 echo $data['date']['month']; // Результат - 'may'
Большое количество информации и примеров, а также описания функций для обработки массивов можно найти в PHP Manual
Variable scope
Английский термин, вынесенный в заголовок переводится на русский как "область видимости переменной", но в оригинале этот термин намного понятнее.
Под этим термином подразумевается то, что любая переменная, описанная в программе имеет свою область видимости, другими словами если переменная описана в каком-то месте программы, то это отнюдь не означает, что она автоматически становится видимой в любом другом месте этой программы.
В PHP на этот счет есть свои особенности. Самая "странная" вещь, с которой сталкивается человек при знакомстве с PHP это то, что переменная, описанная вне функции невидима внутри нее! В других языках программирования мы привыкли к тому, что глобальные переменные программы видны везде, но в PHP это не так. Но посмотрев на эту "странность" повнимательнее можно заметить, что она имеет больше выгоды, нежели неудобств, т.к. является своего рода "защитным механизмом", который не позволит вам случайно перепутать локальную и глобальную переменную, что подчас приводит к очень тяжелым последствиям.
Как же получить доступ к глобальным переменным из функции? Есть 2 способа сделать это:
Использовать глобальный ассоциативный массив $GLOBALS. Это единственная переменная в PHP, которая видна отовсюду и которая "содержит" в себе все глобальные переменные, имеющиеся в программе. Т.о. если вы внутри функции обращаетесь к переменной $variable - то вы обращаетесь к локальной переменной, а если $GLOBALS['variable'] - то к глобальной.
function myFunction() {
$variable = 5; // Присваиваем значение локальной переменной
$GLOBALS['variable'] = 10; // Присваиваем значение глобальной переменной
};
Использовать ключевое слово global. Оно позволит вам задать список глобальных переменных, которые будут видимы внутри функции:
function myFunction() {
global $variable;
$variable = 10; // Присваиваем значение глобальной переменной
};
При написании кода на php возникает одна маленькая проблема, которая грозит поглотить существенное время от отведенного на разработку. Эта проблема стара как мир - отладка написанного кода. И для решения этой проблемы хочется держать на машине минимальный по объему и достаточный по функциональности пакет программ, комфортных в работе и не требовательных к финансовому благополучию клиента.
После поисков при столь суровых требованиях автор остановил свое внимание на следующем программном продукте - PHPEdit.
Для того чтобы разрабатывать и тестировать(с помощью средств отладки, а не только посредством вывода тестовых сообщений в коде) написанные на php скрипты, хочется рекомендовать использовать следующий набор:
Еще одна вещь, облегчающая общую работу - "Денвер". Он объединяет в себе множество необходимых решений (веб-сервер Apache, php, mysql) позволяя резко сократить время настройки домашнего рабочего комплекта, не теряя при этом в качестве работы. Итоговый объем установленного PHPEdit (включая файлы помощи и DBG) суммарно занимает на диске 15 мб.
Рассмотрим по порядку обустройство рабочего места.
Во-первых, мы должны либо уже иметь тестовую площадку (где и будем вести разработку кода), либо создать ее. В случае, если готового варианта поблизости нет (рабочий сервер в домашней сети недоступен, лишней машины дома не нашлось и вы не работаете с готовым веб-сайтом), то рекомендуем посмотреть на Денвер. Более подробно читайте статью, посвященную этому пакету, либо непосредственно документацию на самом сайте.
Обеспечив место для экспериментов, обратимся ко второму шагу. Он включает в себя установку редактора PHPEdit. Установка сведена к минимуму. В выбранный вами каталог копируем ZIP-архив с редактором и распаковываем архив. Все. У нас на руках полностью готовый к работе PHPEdit.
Для того чтобы приступать непосредственно к процессу написания и отладки скриптов, осталось сделать последние шаги: установить документацию на PHPEdit и непосредственно сам отладчик. Документация - устанавливается как и PHPEdit - распаковкой ZIP-архива в выбранный вами каталог. Отладчик забираем у создателя, после чего открываем в документации очень важный документ (module.DBG.html) и следуем буквально по шагам согласно его рекомендаций.
Все. По завершению этих манипуляций у нас обустроенное место, состоящее из "Денвер", PHPEdit и отладчика DBG, которые совместно составляют полнофункциональную систему, способную решить проблемы выполнения процесса отладки php-кода.
Теперь давайте рассмотрим непосредственно сам редактор, в котором мы и будем проводить львиную долю времени.
Текущая версия включает в себя:
PHPEdit поддерживает следующий набор форматов обрабатываемых файлов (с поддержкой синтаксиса для каждого): CSS, HTML, PHP, INI, JavaScript, обычный текст, XML. Использовать описанные форматы - личное дело каждого, но большую часть возможностей использовали все же в варианте php-редактора.
Одной из важных особенностей PHPEdit является то, что фактически любые действия в нем прописаны в виде самостоятельных команд, доступ к которым возможен через окна настройки. Поэтому стандартные возможности редактора и клавиши управления можно переопределить и перенастроить под свои нужды и привычки.
Например, по умолчанию PHPEdit поддерживает уже интегрированный парсер кода, который производит подстановку кавычек, скобок, завершает начатые конструкции php и старается облегчить жизнь программисту. К сожалению, некоторые из его навязчивых действий не всегда удобны и для желающих настроить среду обитания под себя можем порекомендовать отключить помощника (aoPHPAutoComplete в Help - About - General Option Dialog) и закодировать ненужные комбинации через механизм шаблонов и вызова команд.
Вместе с тем, реализованный по умолчанию набор возможностей редактора покрывает большую часть необходимых требований, включая навигацию по коду, закладки и возможность перехода по ним, выделение синтаксических особенностей в набираемом коде, подсветку незавершенных конструкций и так далее.
Полученный код можно экспортировать для последующей публикации в html формат, либо в RTF. К сожалению, при экспорте автоматически не подставляется стандартное расширение для создаваемых файлов (это надо помнить, когда будете работать с сгенерированными файлами) и в RTF "раскраска" кода оставляет желать лучшего, а также существенно отличается от выбранной в редакторе. Html-вариант экспорта нареканий не вызывает.
Возможности редактирования и поиска - стандартны. Выделение, взятие в буфер, удаление текста, возврат по списку произведенных изменений. Поиск и замена организована с поддержкой различных направлений поиска. Мощной возможностью является поддержка регулярных выражений в поиске и замене.
Блок Tools объединяет в себе все возможные настройки редактора. Сюда входят:
Блок View содержит возможность настройки инструментов (toolbars), быстрого переключения между видами подсветки синтаксиса, окна отладчика (точки остановки, окно вывода, значения переменных с их делением на глобальные, локальные), окно быстрой навигации по коду.
И последний раздел Help содержит ссылки на сайт разработчиков с обращением к заглавной странице и странице поддержки. Кроме того, реализована контекстная помощь, для чего редактор обращается к сайту, где подставляется запрашиваемое слово.
При работе с PHPEdit нужно помнить, что в случае его запуска автоматически также запускается отладчик DBG, который перехватывает все обращения к заранее описанному в конфигурации потру и осуществляет обработку всех обращений к php-коду. Фактически при работе в связке "Денвер" - PHPEdit - DBG составные части сливаются в одно целое и через какое-то время воспринимаются как одно целое.
Хочется отметить одну забавную особенность в интерфейсе PHPEdit. Визуально не различаются диалоговые окна настроек, часть из которых может динамически менять размер, а часть не может. Изучается данная возможность только методом тыка. Достаточно удобно работать с окнами, где это поддерживается, но остается вопрос, почему подобное поведение распространяется не на все вызываемые окна в программе.
Напоследок хочется дать рекомендацию для любителей использовать клавиатуру. Чтобы ускорить работу с закладками, лучше всего удалить уже описанные горячие клавиши (раздел Tools - Edit Syntax Properties - Key Assignments - Bookmarks). Вместо этого завести отдельные "горячие клавиши" (Tools - Edit Shortcuts), более удобные для вас лично. Опыт показывает, что это сделать проще, чем попытаться заставить стандартный обработчик закладок понимать комбинации клавиш с использованием Ctrl или Alt. К счастью, "горячие клавиши" работают с любыми вариантами задаваемых комбинаций, что решает названную проблему.
Необходимо отметить очень важную вещь - PHPEdit является динамично разрабатываемым продуктом, в котором активно участвует его коммуннити. Это выливается в поддержку продукта, апдейты, быструю реакцию на добавление новых возможностей и внесенение необходимых изменений. Кроме того, доступны люди, осуществляющие техническую поддержку. Минус для русскоговорящих - поддержка понимает английский язык и не общается на русском. Но решаются вопросы очень быстро, в чем у автора была возможность убедиться лично.
O MySQL и взаимодействии её с РНР. Для начала о том, что из
себя представляет MySQL. Это одна из самых распространённых
систем управления реляционными базами данных (СУБД),
работающая на базе языка SQL. Большую известность эта СУБД
получила благодаря своей надёжности, быстроте, и тому, что
распространяется она бесплатно.
Небольшой рассказ о том, что такое база данных.
Реляционная база данных это совокупность связанной
информации, сохраняемой в виде двухмерных таблиц (записная книга, таблица Excel).
Например:
Имя | телефон
----------------------------------------
Вася | 22-12-334
Петя | 333-23-22
Коля | 03
Название реляционной она получила потому, что в 1970 г.
Э.Кодд предложил использовать для обработки данных теорию
множеств и доказал, что данные можно представить в виде
таблицы, которая на математическом языке называется
«отношением» (по-английски relation).
Для чего нужны базы данных? Понятно, что для хранения
информации, но ведь хранить её можно и в файлах. Однако
хранение в базе даёт неоспоримые преимущества.
1)Высокая скорость доступа к информации.
2)Возможность быстро добавлять, удалять, сортировать,
искать данные.
3)В отличие от файлов, отсутствие проблем совместного
доступа к информации.
Прежде чем начать работу с базой данных с ней нужно
соединиться. int mysql_connect([string $hostname] [,string
$username] [,string $password]) – С помощью этой функции РНР
мы соединяемся с базой данных MySQL расположенной на хосте
$hostname(обычно localhost). Вместо $username, $password нужно
указать логин и пароль на доступ к БД. Функция возвращает
идентификатор установленного соединения. Это может
пригодиться, если Вы будете работать с несколькими
соединениями с базой одновременно. По завершении работы с
MySQL сервером нужно закрыть с ним соединение
mysql_close().
Для того чтобы начать работу c базой и посылать ей SQL
запросы недостаточно просто соединиться с сервером. Необходимо
выбрать базу данных, с которой Вы собираетесь работать. Делает
это функция
int mysql_select_db(string $dbname [,int
$link_identifier]) – где $dbname – имя базы, с которой нужно
работать. Необязательный параметр $link_identifier –
указывает, что база данных $dbname будет использоваться для
работы именно с соединением $link_identifier. Если он не
указан, то используется последнее установленное
соединение.
Для отправки запросов базе служит функция resource
mysql_query(string $query [, $link_identifier]). Результатом
функции является идентификатор ответа СУБД. Дело в том, что,
когда мы посылаем запрос базе, она их обрабатывает и сохраняет
результат обработки на сервере. Затем, уже по отдельному
запросу результат возвращается к нам обратно. Это сделано для
того, чтобы ускорить соединение с базой. Ведь в большинстве
случаев, нам будет нужен не весь результат запроса, а только
некоторая его часть. Вернёмся к рассмотрению функции. $query -
строка-запрос, составленная по правилам языка SQL.
$link_identifier – имя используемого соединения. Результат,
который возвращает функция mysql_query() – служит параметром
для многих других функций для работы с БД (об этом ниже).
Для того чтобы создать таблицу нужно воспользоваться
следующим SQL запросом: create table имя_таблицы(имя_поля1,
тип_поля1,…, имя_поляN, тип_поляN).
В MySQL существует 6 основных типов полей: целочисленные,
нецелочисленные, двоичные , дата и время, строковые,
текстовые.
В свою очередь целочисленные типы подразделяются
на:
int (длина) [unsigned] – целые числа 4 байта. Если указан
параметр unsigned, то в поле можно будет хранить только
беззнаковые числа (т.е. числа > = 0).
bigint, smallint,
mediumint, tinyint – все эти типы отличаются от предыдущего
только максимальным размером числа, которое может в них
храниться. (8, 2, 3, 1 байт соответственно).
Нецелочисленные типы.Имя типа [(максимальная длина,
количество цифр отведенных для дробной части числа)]
[unsigned]; Имена типов могут быть: float – число одинарной
точности. double(или real) – число двойной точности, decimal –
дробное число, хранящееся в виде строки. Поля типа Date, Time
или Timestamp – хранят время и дату. Разница в форматах
хранения.
Логические типы:Blob – двоичный объект длиной до
65535, longblob(2^32), mediumblob(16777215), tinyblob(255);
Cтроки:Тип Сhar(длина) – строка фиксированной длины.
Длина может быть от 1-го до 255 символов. При этом, если ваша
строка меньше указанной длины, то это не повлияет на
количество памяти, выделенное под этот тип.
Varchar(длина) – может хранить от 1-го до 255 символов, но
в отличии от предыдущего, выделяется столько памяти, сколько
действительно содержит строка.
Текстовые типы. Поле типа Text – может содержать в
себе не более 65 535 символов. Существуют также tinytext,
mediumtext и long text.
......PHP и сокеты.
Пишем сканер портов на PHP
//===( 0x0 :: Содержание
)=====================================================
[0x1] Предисловие
[0x2] Механизм сокетов
и PHP
[0x3] Функций
для работы с сокетами
[0x4]
Преопределенные константы
[0x5]
Принцип написания сканера портов. Начнем с алгоритма.
[0x6] Пишем портскан
[0x7] Полезные советы и хинты
[0x8] Исходник
//===( 0x1 :: Предисловие
)============================================
В данной статье будет продемонстрирована
работа с сокетами в PHP. PHP имеет очень мощный набор
функций, который позволяет проделывать уникальные вещи.
Но как показывает практика - при работе используют
только 80% мощности этого языка кодинга. Одна из причин
такой фигни - мало кто знаком со всеми прелестями языка
в полной мере, то есть человек знает что можно делать А,
Б и В - остальное ему
пох. Конечно, для того чтобы заработать денег или
наполнить штаны радостью ему этого может хватать. Но мы
же не из таких, верно? ;)Как говориться - карта не
территория, потому если за что-то беремся - делаем это
максимально эффективно, это залог успешности по жизни
вообще. Так вот, в этой статье я опишу работу с
механизмом сокетов на примере написания продвинутого
сканера портов с гибким конфигурированием.
//===( 0x2 ::
Механизм сокетов и PHP
)=====================================
Механизм работы с сокетами в PHP основывается
на всем известных Berkley sockets Это наилучшая
реализация сокетного движка, совместимая как с unix так
и с win32 Единственное серьезное отличие - более высокий
уровень доступа к ресурсам для программиста.То есть все
намного проще нежели в реализации для того же C/C++. Вам
не нужно заботиться о заполнении разных структур,
вызывать некоторые функции для промежуточных шагов. При
всем этом PHP предоставляет очень! широкий набор функций
для работы непосредственно с сокетами.
//===( 0x3 ::
Функций для
работы с сокетами
)===================================
Многие из этих функций не документированы и
известны лишь параметры. Потому если вас что-то из этого
заинтересует - вперед на php.net и читайте последнюю
версию мануала на тему Socket functions
socket_accept -- Accepts a connection on a socket
resource socket_accept ( resource socket)
socket_bind -- Binds a name to a socket
bool socket_bind ( resource socket, string address [,
int port])
socket_clear_error -- Clears the error on the socket or
the last error code
void socket_clear_error ( [resource socket])
socket_close -- Closes a socket resource
void socket_close ( resource socket)
socket_connect -- Initiates a connection on a socket
bool socket_connect ( resource socket, string address [,
int port])
socket_create_listen -- Opens a socket on port to accept
connections
resource socket_create_listen ( int port [, int
backlog])
socket_create_pair -- Creates a pair of
indistinguishable sockets and stores
them in fds.
bool socket_create_pair ( int domain, int type, int
protocol, array &fd)
socket_create -- Create a socket (endpoint for
communication)
resource socket_create ( int domain, int type, int
protocol)
socket_get_option -- Gets socket options for the socket
mixed socket_get_option ( resource socket, int level,
int optname)
socket_getpeername -- Queries the remote side of the
given socket which may
either result in host/port or in a UNIX filesystem path,
dependent on its type.
bool socket_getpeername ( resource socket, string &addr
[, int &port])
socket_getsockname -- Queries the local side of the
given socket which may
either result in host/port or in a UNIX filesystem path,
dependent on its type.
bool socket_getsockname ( resource socket, string &addr
[, int &port])
socket_iovec_add -- Adds a new vector to the
scatter/gather array
bool socket_iovec_add ( resource iovec, int iov_len)
socket_iovec_alloc -- ...]) Builds a 'struct iovec' for
use with sendmsg,
recvmsg, writev, and readv
resource socket_iovec_alloc ( int num_vectors [, int ])
socket_iovec_delete -- Deletes a vector from an array of
vectors
bool socket_iovec_delete ( resource iovec, int iov_pos)
socket_iovec_fetch -- Returns the data held in the iovec
specified by
iovec_id[iovec_position]
string socket_iovec_fetch ( resource iovec, int
iovec_position)
socket_iovec_free -- Frees the iovec specified by
iovec_id
bool socket_iovec_free ( resource iovec)
socket_iovec_set -- Sets the data held in
iovec_id[iovec_position] to new_val
bool socket_iovec_set ( resource iovec, int
iovec_position, string new_val)
socket_last_error -- Returns the last error on the
socket
int socket_last_error ( [resource socket])
socket_listen -- Listens for a connection on a socket
bool socket_listen ( resource socket [, int backlog])
socket_read -- Reads a maximum of length bytes from a
socket
string socket_read ( resource socket, int length [, int
type])
socket_readv -- Reads from an fd, using the
scatter-gather array defined by
iovec_id
bool socket_readv ( resource socket, resource iovec_id)
socket_recv -- Receives data from a connected socket
int socket_recv ( resource socket, string &buf, int len,
int flags)
socket_recvfrom -- Receives data from a socket,
connected or not
int socket_recvfrom ( resource socket, string &buf, int
len, int flags, string
&name [, int &port])
socket_recvmsg -- Used to receive messages on a socket,
whether
connection-oriented or not
bool socket_recvmsg ( resource socket, resource iovec,
array &control, int
&controllen, int &flags, string &addr [, int &port])
socket_select -- Runs the select() system call on the
given arrays of sockets
with a timeout specified by tv_sec and tv_usec
int socket_select ( resource &read, resource &write,
resource &except, int
tv_sec [, int tv_usec])
socket_send -- Sends data to a connected socket
int socket_send ( resource socket, string buf, int len,
int flags)
socket_sendmsg -- Sends a message to a socket,
regardless of whether it is
connection-oriented or not
bool socket_sendmsg ( resource socket, resource iovec,
int flags, string addr [,
int port])
socket_sendto -- Sends a message to a socket, whether it
is connected or not
int socket_sendto ( resource socket, string buf, int
len, int flags, string addr
[, int port])
socket_set_nonblock -- Sets nonblocking mode for file
descriptor fd
bool socket_set_nonblock ( resource socket)
socket_set_option -- Sets socket options for the socket
bool socket_set_option ( resource socket, int level, int
optname, mixed optval)
socket_shutdown -- Shuts down a socket for receiving,
sending, or both.
bool socket_shutdown ( resource socket [, int how])
socket_strerror -- Return a string describing a socket
error
string socket_strerror ( int errno)
socket_write -- Write to a socket
int socket_write ( resource socket, string buffer [, int
length])
socket_writev -- Writes to a file descriptor, fd, using
the scatter-gather array
defined by iovec_id
bool socket_writev ( resource socket, resource iovec_id)
//===( 0x4 ::
Преопределенные
константы )=======================================
Иногда сигнатуре функций встречается параметр
type, вот там и пользуются эти константы зачастую.
AF_UNIX (integer)
AF_INET (integer)
AF_INET6 (integer)
SOCK_STREAM (integer)
SOCK_DGRAM (integer)
SOCK_RAW (integer)
SOCK_SEQPACKET (integer)
SOCK_RDM (integer)
MSG_OOB (integer)
MSG_WAITALL (integer)
MSG_PEEK (integer)
MSG_DONTROUTE (integer)
SO_DEBUG (integer)
SO_REUSEADDR (integer)
SO_KEEPALIVE (integer)
SO_DONTROUTE (integer)
SO_LINGER (integer)
SO_BROADCAST (integer)
SO_OOBINLINE (integer)
SO_SNDBUF (integer)
SO_RCVBUF (integer)
SO_SNDLOWAT (integer)
SO_RCVLOWAT (integer)
SO_SNDTIMEO (integer)
SO_RCVTIMEO (integer)
SO_TYPE (integer)
SO_ERROR (integer)
SOL_SOCKET (integer)
PHP_NORMAL_READ (integer)
PHP_BINARY_READ (integer)
SOL_TCP (integer)
SOL_UDP (integer)
//===( 0x5 ::
Принцип
написания сканера портов. Начнем с алгоритма
)============
Принцип работы сканера портов простой как
двери: пробуем соединиться с удаленным портом, если
соединение не удалось - порт закрыт Ж8)
Более детально, с учетом сокетов: создаем сокет,
привязываем его к определенному target host и target
port, инициализируем соединение. Если удалось
соединиться - закрываем сокет и запоминаем порт как
открытый, если соединение не удалось - порт закрытый.
//===( 0x6 ::
Пишем портскан
)=================================================
портсканер выводит все в красивую табличку,
которую строит сам. вам стоит лишь все это вставить в
HTML страницу. минимум <html>[сюда 8)]</html>
<?php
error_reporting (E_ALL); // вывод сообщений для всех
ошибок
// так как мы пишем продвинутый портскан, сделаем все
красиво и удобно ;)
$portz =
array("20","21","23","25","39","43","69","79","80","88","107","109","110","111","137","138",
"139","143","161","464","512","513","514","530","544","636","749","1433","1434");
// в данном массиве будут храниться номера портов,
которые необходимо сканировать.
// это сделано для эффективного использования ресурсов
сервера, зачастую провайдер выставляет небольшой
//таймаут для php скриптов и получится что сканируя все
65тысяч портов мы поступаем очень нерационально //так
как реально полезные из них всего пару процентов
$descr = array("FTP data", "FTP control",
"Telnet","Simple Mail Transfer Protocol",
"rlp: Resource Location Protocol", "whois",
"tftp","finger","http",
"kerberos","rtelnet","pop2","pop3","sunrpc:SUN Remote
Procedure Call",
"Netbios name service","Netbios name service", "Netbios
datagram service",
"imap4","snmp","kpasswd: kerberos v5","Remote Process
Execution",
"remote login","cmd shell","courier rpc","kshell:
Kerberos remote shell",
"ldaps","LDAP over TLS/SSL","kerberos-adm","ms-sql-s:
Microsoft-SQL-Server",
"ms-sql-m: Microsoft-SQL-Monitor");
// а в этом массиве задаем описания для сервисов,
обслуживающих на соответствующих портах
// главное чтобы смещение в массиве порта
соответствовало смещению в массиве его описания
// то есть если смещение (индекс) порта с номером 23 ==
2 (считаем с 0), значит описание
// для этого порта должно быть расположено так же с
индексом 2 в массиве описаний.
$white_power = array("nteam.ru", "localhost");
$white_powerIP = array("194.186.45.233", "127.0.0.1",
"1.0.0.1");
// при попытке сканировать данные хосты-адреса
// чел будет направлен на сеанс мануальной терапии к
гинекологу, это сделано для случаев,
// когда необходимо запретить скан вашего хоста. ну
представте что разместили вы этот
// портскан у себя на сайте и предоставили уеб-интерфейс
для посетителей, а они все
// метанулись сканировать вас ;))
$log_path = "pscan.log";
$who = $HTTP_SERVER_VARS['REMOTE_ADDR'];
// объявляем переменные для лога. как это продвинутый
сканер и без лога? ;)
// в лог будем писать все, даже адрес того кто сканит.
мы же любопытные ;)
$err_path = "pscan.err";
$white_power_cnt = count($white_power);
$white_powerIP_cnt = count($white_powerIP);
// определяем колличество заданых портов-описаний, далее
нам это пригодиться в циклах
$cnt=0; //счетчик
$timeout = 10; // таймаут для инициализации сокета,
максимум - 15
if($timeout>15) // а тут можете изменить максимум 8)
$timeout=15;
$inputz = $hostname;
$chost = strip_tags($hostname); //загоняем сюда значение
параметра $hostname,
// этот параметр необходимо передавать из html-формы,
етц с именем hostname
$ITS_FUCKING_LAMOZ = 0;
// если 0 - услугами сканера пользуется законопослушный
чел, все нормал 8)
// если 1 - этого засранца следует проучить
// эта переменная нам также пригодиться в дальнейшем,
так как если кто-то захочет
// посканить хосты из black-листа - его нужно проучить,
нельзя же просто так ламеров
// отпускать без ничего ;) по-дэфолту считаем что это
нормальный чел, а дальше будет
// видно, эт смотря что за хост он захочет сканить...
(см. дальше)
// если обнаружен засранец - имитируем сканирование,
пишем мол все порты кроме
// 31337 закрыты и советуем засранцу
проконсультироваться у врача 8)
// это все условно и вы можете изменить это по-вашему
усмотрению.
if($chost==""){ // если запустили наш скрипт без
параметра $hostname - громко ругаемся
echo "необходимо задать ip-адрес или имя хоста!\n";
exit;
}
$ch = $chost[0];
$new_chost="";
if( ord($ch)>=48 && ord($ch)<=57 ){ // IP -> DNS
$new_chost = gethostbyaddr($chost);
for($cnt=0; $cnt<$white_powerIP_cnt; $cnt++)
// проверяем наличие ламера в онлайне 8)
if( strstr($chost, $white_powerIP[$cnt]) )// ...
$ITS_FUCKING_LAMOZ = 1; // вот он ламер!
}
else{
$new_chost = gethostbyname($chost); // DNS -> IP
for($cnt=0; $cnt<$white_power_cnt; $cnt++)
if( strstr($chost, $white_power[$cnt]) ){
$ITS_FUCKING_LAMOZ = 1; // вот он ламер!
break;
}
$chost = $white_power[$cnt];
}
if( $chost == $new_chost){
printf("ошибка в процессе соединения\n");
exit;
}
// вот это ухо @ в начале строки значит следующее - если
при выполнении данной строки кода
// возникнет ошибка - ее выводить не нужно. это
придумано для того, чтобы исключить
// возможный баг раскрытия пути, вдруг хостер что-то
изменит или что-то глюкнет при работе
// с файловой системой - ошибку НЕ выводим, так как в
сообщении об ошибке будет путь к файлу
// спасибо за данную идею [R00T]'у!
@$LOGF = fopen($log_path, "a");
if($LOGF){ // если файл открыт успешно
@ flock($LOGF, 2);
@ fwrite($LOGF,
"================================================================\n");
if( $ITS_FUCKING_LAMOZ == 1 )
@ fwrite($LOGF, "[!!!] ".date('H:i:s Y-m-d')." :>>>
".$HTTP_SERVER_VARS['REMOTE_ADDR']." scaned $chost\n");
else
@ fwrite($LOGF, date('H:i:s Y-m-d')." :>>>
".$HTTP_SERVER_VARS['REMOTE_ADDR']." scaned $chost\n");
@ fwrite($LOGF,
"================================================================\n");
}
// ну а это шапка лога, тоесть дата, айпишник,
сканируемый хост...
else{ // если возникла ошибка при логировании - пишем в
файл ошибок
@$ERRF = fopen($err_path, "a");
if($ERRF){
@ flock($ERRF, 2);
@ fwrite($ERF, "[date('H:i:s Y-m-d')] невозможно
залогировать $who\n");
@ flock($ERRF, 3);
@ rewind($ERRF);
@ fclose($ERRF);
}
}
//
$port = 0;
$pcnt = count($portz);
$dcnt = count($descr);
$ccnt = 0;
$errno = 0;
$errstr = "no errorZ";
if( ($pcnt==0) || ($dcnt==0) ){
echo "список портов не пустой. всем на выход.<br>\n";
exit;
}
if($pcnt!=$dcnt){
if($pcnt>$dcnt)
$ccnt=$dcnt;
else
$ccnt=$pcnt;
}
else
$ccnt=$pcnt;
// если количество портов и количество описаний разные -
обрезаем до равного
echo "сканируем ".$hostname.".....<br>\n";
if($ITS_FUCKING_LAMOZ==1){
printf('<center><b><div align="center">региональный
департамент ФСБ, отдел по борьбе с компьютерной
преступностью</div><b></center><br>');
printf('<br><br><center><b><div align="center">подождите
пока система проверит ваш компьютер<br>');
echo '<div align="center">просим не отсоединятся еще две
минуты, идет скачка информации.......</center><br>';
sleep(1); // делаем маленькую задержку, типа имитация
мощной работы скрипта 8)
echo '<br><div align ="center"><b>настоятельно
рекомендуем пройти сеанс мануальной терапии у
гинеколога, у вас проблемы</b></div><br>';
}
echo '
<p> </p>
<table width="85%" border="0" align="center">
<tr>
<td width="8%" bgcolor="#999999"> <div
align="center">status</div></td>
<td width="14%" bgcolor="#999999"> <div
align="center">ip adress</div></td>
<td width="8%" bgcolor="#999999"> <div
align="center">port</div></td>
<td width="50%" bgcolor="#999999"> <div
align="center">service description</div></td>
<td width="20%" bgcolor="#999999"> <div
align="center">err0r</div></td>
</tr>
';
if( $ITS_FUCKING_LAMOZ != 1){ // LAMOZ NOT DETECTED
echo str_repeat(" ", 256);
for($i=0; $i<$ccnt; $i++){
if(!$timeout)
@$usenet_handle = fsockopen($chost, (int)$portz[$i]);
else
@$usenet_handle = fsockopen($chost, (int)$portz[$i],
&$errno, &$errstr, $timeout);
if(!$usenet_handle)
printf('
<tr>
<td><div align="center">refused</div></td>
<td><div align="center">%s</div></td>
<td><div align="center">%s</div></td>
<td><div align="center">%s</div></td>
<td><div align="center">%s</div></td>
</tr>' , $chost, $portz[$i], $descr[$i], $errstr
);
else{
@ fwrite($LOGF,
$chost."\t".$portz[$i]."\t".$descr[$i]."\t".$errstr."\n");
printf('
<tr>
<td><div align="center"><font
color=red>соединен</font></div></td>
<td><div align="center"><font
color=red>%s</font></div></td>
<td><div align="center"><font
color=red>%s</font></div></td>
<td><div align="center"><font
color=red>%s</font></div></td>
<td><div align="center"><font
color=red>%s</font></div></td>
</tr>' , $chost, $portz[$i], $descr[$i], "no err0rZ"
);
} // end else
flush();
} // end for
@ fwrite($LOGF, "\n\n");
@ flock($LOGF, 3);
@ rewind($LOGF);
@ fclose($LOGF);
}
else{ // LAMOZ WAS DETECTED, ATTENTION!!! 8-)
$errstr = "порт закрыт"; // heh, lamer did not expect
such shit! ;)
echo str_repeat(" ", 256);
for($i=0; $i<$ccnt; $i++){ // типа открыт только 31337
Ж8-)
printf('
<tr>
<td><div align="center">закрыт</div></td>
<td><div align="center">%s</div></td>
<td><div align="center">%s</div></td>
<td><div align="center">%s</div></td>
<td><div align="center">%s</div></td>
</tr>' , $chost, $portz[$i], $descr[$i], $errstr
);
flush();
}//end for
printf('
<tr>
<td><div align="center"><font
color=red>соединен</font></div></td>
<td><div align="center"><font
color=red>%s</font></div></td>
<td><div align="center">31337</div></td>
<td><div align="center"><font color=red>lol... inet
cracker here!</font></div></td>
<td><div align="center"><font color=red>no
err0rz</font></div></td>
</tr>', $chost
);
}
echo '</table><p> </p>';
echo "<br><br>\n <center><b>tNPScan v1.0.0</b> bY black
c0de //[tN] :: [the nobodies] ::
[www.nteam.ru]<br></center>\n";
unset($chost);
unset($new_chost);
unset($timeout);
unset($port);
unset($pcnt);
unset($dcnt);
unset($ccnt);
unset($errno);
unset($errstr);
// ну и напоследок освобождаем память, выделенную под
переменные. кому нужны значения
// наших переменных у прова в свопе? ;)
?>
//===( 0x7 :: Полезные советы и
хинты )========================================
для того чтобы ваш PHP позволял работать с
сокетами его необходимо собрать с опцией
--enable-sockets. обычно по-дэфолту он собран с этим
параметром.
//===( 0x8 :: Исходник
)=====================================================
sum -r/size 60956/4828
Q: Как на PHP написать скрипт, определяющий MAC-адрес человека, пытающего
зайти на конкретную страницу? Хочется написать систему фильтров, с помощью
которой в дальнейшем реализовать так называемый черный список. Скрипт стоит на
локальной машине с WinXP и Apache.
A: В случае, когда скрипт стоит на локальной машине и имеется возможность
изучить текущее состояние ARP-кэша системы, затребованная задача вполне
выполнима. Достаточно получить отчет системы о состоянии ARP-таблицы
(($macadd=exec("arp -a")). После чего с помощью банального поиска,
организованного стандартными процедурами и функциями PHP, найти в отчете
MAC-адрес, который будет соответствовать предварительно определенному IP-шнику
посетителя.
Q: Pазрабатываю сайт для одной конторы, торгующей программным
обеспечением. Компания хранит все свои прайс-листы в формате Excel, а они
создаются какими-то бухгалтерскими программами. Мне предлагают настроить
автоматическую закачку этого xls-файла на сервер, но я хочу пойти дальше и
отображать обновленный прайс прямо на самой веб-странице. Отсюда вопрос: каким
образом можно средствами PHP динамически обработать лист Excel’а и преобразовать
его в HTML-вид?
A: Здесь тебе не обойтись без библиотеки PHP-ExcelReader.
Вкратце объясню, как ее использовать:
1. Для начала подключим файл с описанием класса командой include('reader.php').
2. Далее создаем экземпляр класса: $xl_reader = new Spreadsheet_Excel_Reader().
3. Указываем объекту, какой именно файл (filename.xls) необходимо обработать:
$xl_reader->read("filename.xls"). После этого вся извлеченная информация будет
помещена в хранилище данного объекта.
4. Контейнерами для хранения данных служат обычные двумерные массивы. Поэтому
для доступа к ним не надо применять какие-либо специфические и изощренные методы
и функции. Просто работай с массивом, как ты это делаешь по десять раз на дню.
5. Общий синтаксис команды выглядит следующим образом: $xl_reader->sheets[x][y],
где x - это номер листа в документе, а y - одно из специальных свойств.
6. Например, чтобы присвоить переменной $rows количество строк на первом листе
(нумерация листов начинается с нуля!), достаточно использовать команду $rows =
$xl_reader->sheets[0]['numRows'].
7. Команда для извлечения информации из первой ячейки второго листа:
$cell = $xl_reader->sheets[1]['cells'][1][1].
8. А следующая команда может быть полезна, если необходимо возвратить имя листа:
$sheetname = $xl_reader->boundsheets[0]['name'].
po gonn © 2006 "JULI'S BEEHIVE" |
|
|
|