Coding:
Програмуємо на РНР
Це не тільки дуже просто – це ще й захоплюює! До такого висновку незмінно приходиш, якщо починаєш знайомитися з основами програмування мовою гіпертекстового препроцесора РНР. Ну ось, тільки початок, а вже незрозумілі слова пішли. Це ж треба було придумати таке – гіпертекстовий препроцесор! Так що для поліпшення сприйняття матеріалу давайте заздалегідь умовимося, що будемо застосовувати спрощені та зрозумілі усім терміни, що б було зрозуміло. І ще одна неодмінна умовність – робимо все так, як робимо. Є кілька способів відкрити Панель Керування в Windows, є різні способи приготувати одне і те саме блюдо, і є різні способи та методи програмування. З поставленою задачею можна справитися так, як описано, і зовсім по-іншому. Але в нашому випадку –акцент буде робитися на простоту та логічність, а не на швидкість та чистоту коду. Все це прийде трохи пізніше, а поки наша мета – учитися, учитися, і ще раз учитися. У продовження теми, піднятої в статті “РНР для усіх!”, ми заглибимося далі в надзвичайний світ програмування
Цикли в програмуванні – то є операції, що повторюються. Початок (точка відліку) вказується в початку циклу, а тривалість його виконання обмежується якою-небудь умовою. Прикладом циклу може служити копіювання декількох файлів. Алгоритм виконання цього завдання можна описати так: установити лічильник скопійованих файлів у нуль, скопіювати файл, перевірити чи закінчилися файли, якщо ні - збільшити лічильник скопійованих файлів, повернутися до початку циклу (знову скопіювати файл), якщо так – закінчити цикл. Тепер розглянемо, як цикли реалізуються в синтаксисі РНР.
<?php
$i = 0; $n = 10;
while ($i <= $n):
echo $i.”<br>\n”;
$i++;
endwhile;
?>
Зміст скрипту дуже простий. Надаємо змінній $і значення, що відповідає початкові циклу, а змінній $n – значення кінця циклу. Далі відкриваємо цикл оператором WHILE ( ), і всередині його дужок описуємо умову, при виконанні якій цикл буде продовжувати свою роботу. У нашому випадку виконання не перерветься, поки $i <= $n. Як тільки ця умова буде порушена, керування буде передано наступної за циклом операції РНР. Всередині циклу можуть бути будь-які команди РНР (розділені між собою зазвичай крапкою з комою). Тільки треба стежити за тим, що б змінна $і, що використовується в циклі, була збільшена (і зовсім не обов'язково на одиницю), инакше цикл стане нескінченним, і інтерпретатор РНР буде виконувати його, поки не закриється сесія (вікно браузера). Оператор ENDWHILE означає кінець циклу. Скрипт, описаний тут, виводить на екран браузера цифри починаючи з 0 до 10. Причому цифри будуть виведені в стовпчик, тому що після виводу на екран значення змінної $і ми виводить HTML-тег переведенні рядка (<br>). Після нього йде переведення рядка для коду, переданого клієнтові (його можна подивитися, вибравши перегляд у вигляді HTML у меню Вашого браузера). Це не обов'язково, але в такий спосіб досягається читабельність коду. Наприклад я приводжу ще один варіант виконання зазначеної вище задачі, але вже набагато більш правильно в змісті чистоти коду та швидкості виконання
<?php
$i = 0; while ($i <= 10) { echo $i++.”<br>”; } ?>
Дивно, але ці два приклади абсолютно ідентичні у сенсі результату. Але сам скрипт умістився в один рядок! Різниця – у стилі застосування оператора циклу та в тому, що змінна циклу виводиться на екран одночасно зі збільшенням. І в цьому – уся принадність програмування. Иноді буває щось просте зробити дуже важко, а складне – легко. Ніколи не варто зупинятися на вже досягнутому, а потрібно пробувати застосовувати инші алгоритми та рішення. Ось Вам ще один варіант рішення. Він заснований на застосуванні конструкції РНР DO…WHILE. Це так само цикл, але відрізняється він від просто WHILE тим, що значення логічного виразу перевіряється не до (як у випадку з WHILE), а закінчивши роботи операторів, включених у сам цикл. Таким чином, DO…WHILE гарантовано буде виконаний хоча б один раз, що у випадку з WHILE зовсім не обов'язково. Адже якщо умова є неправда, керування відразу буде передано далі. Для циклів DO..WHILE існує тільки один вигляд синтаксису:
<?php
$i = 0; do { echo $i.”<br>\n”; $i++; } while ($i <=10);
?>
Здавалося б, досить варіантів, але це не все - існує ще кілька варіантів циклу. І, як правило, саме вони й використовуються програмістами. Цикли FOR - найбільш могутні цикли в PHP. Вони працюють подібно їх аналогам у мові програмування C. Синтаксис циклу FOR:
FOR (expr1; expr2; expr3) statement
Перший вираз (expr1) безумовно обчислюється (виконується) на початку циклу. На початку кожної ітерації (прохід циклу) обчислюється expr2. Якщо воно дорівнює TRUE (істина), то цикл продовжується та виконуються вкладений(е) оператор(ы). Якщо воно дорівнює FALSE (неправда), то цикл закінчується. Наприкінці кожної ітерації обчислюється (виконується) expr3. Кожне з цих виразів може бути порожнім. Якщо expr2 порожньо, то цикл продовжується нескінченно (PHP за замовчуванням вважає його ,що дорівнюють TRUE, як і в мові Сі). Це не так даремно, як могло б показатися, тому що найчастіше треба закінчити виконання циклу використовуючи оператор BREAK у сполученні з логічною умовою замість використання логічного виразу в FOR. Якщо всередині циклу (кожного) зустрічається цей оператор (BREAK), цикл безумовно припиняє виконання ітерації, і керування передається наступної за циклом команді. Якщо зустрічається оператор CONTINUE – керування передається на початок наступного найближчого циклу. Наприклад подивимося, як можна ще реалізувати вивід на екран користувача список чисел. Не забувайте про перехід з HTML у PHP.
/* приклад 1 */
for ($i = 1; $i <= 10; $i++)
{ print $i; }/* приклад 2 */
for ($i = 1;;$i++)
{ if ($i > 10) { break; } print $i; }/* приклад 3 */
$i = 1; for (;;)
{ if ($i > 10) { break; } print $i; $i++; }/* приклад 4 */
for ($i = 1; $i <= 10; print $i, $i++) ;
Так що не кажіть потім, що у Вас не було вибору :-) На прикладі тривіальної задачі ми розглянули, як РНР дозволяє різними способами досягти однієї мети. Як правило, на практиці застосовується найбільш придатна конструкція, але часто в цьому немає ніякої необхідності, досить використовувати найпростіший та логічний варіант
Відправлення пошти
Дуже часто хочеться знати, що відбувається на сайті за час Вашої відсутності. Звичайно, можна періодично перевіряти форум, гостьову, тощо. на предмет нових повідомлень, але є спосіб краще! Чому б не надсилати самому собі повідомлення на поштову скриньку, коли на сайті відбувається та або инша подія. Як приклад можу запропонувати такі варіанти – реєстрація в розсилці, ввід повідомлення у форум, гостьову, тощо, помилка відкриття файлу, організація зворотного зв'язку, опитування думки читачів про розміщену статтю та т.д та т.п. Способів застосувати цю можливість РНР – маса, залишилося розібратися як це працює. Як завжди – просто! Синтаксис такий:
Mail ( $email, "Уведене повідомлення", $str, "From: повідомлення ");
Звичайно, перед цим відповідні змінні повинні бути введені або вручну, або за допомогою форми (треба стежити за відповідністю імен змінних у формі та в скрипті). При виконанні даної команди інтерпретатор РНР відішле лист з текстом зі змінної $str за адресою, зазначеній в змінній $email. Все инше – службова інформація, що може бути в деяких випадках опущена як непотрібна. Наприклад розглянемо систему контролю за відвідувачами визначених сторінок сайту. Така можливість може знадобитися для аналізу відвідувань визначених статей, сторінок, тощо. Нам буде треба інформація про відвідувача, що у РНР автоматично доступна через змінні оточення. Цю інформацію ми будемо відсилати собі на поштову скриньку. Тільки не перестарайтеся – кожне відвідування такої сторінки викликає відправлення листа, і скринька може виявитися переповненою
<?phpif (isset ($HTTP_X_FORWARDED_FOR)) { $host = gethostbyaddr($HTTP_X_FORWARDED_FOR); }else{ $host = gethostbyaddr($REMOTE_ADDR); } $ip=getenv('REMOTE_ADDR');$date=date('d M Y, H:i:s');$host1=gethostbyaddr("$ip"); $str=("Дата - $date
Хост - $host
IP-адреса - $ip
---------------------");mail( $email, "статистика", $str, "From:інформація");
?> Якщо Ви розмістите на одній з Ваших сторінок цей код РНР, інформація про відвідувача (це дата входу, хост та IP-адреса) буде у Вашій поштовій скриньці. Ще можна надіслати собі повідомлення під час виникнення помилки (наприклад відкриття файлу) на сайті:
$filename = "data.txt"; $fp = @fopen($filename,"r"); if ( !$fp ) { @mail( $email, "Помилка!", "Помилка відкриття файлу $filename !"); }
Як правило, можна поставити знак @, і якщо виникне помилка при відправленні пошти, повідомлення про це не буде виведено на екран. А можна просто перевірити, пішов лист чи ні: if ( @mail( $email, "Тест", $str) ) { ... що зробити якщо лист пішов ... } else { ... що робити, якщо відбулася помилка відправлення (не доступна скринька, сайт, тощо) } Власне кажучи, існує можливість забирати пошту з будь-якого акаунта, але це вимагає розширення РНР за рахунок підключення додаткових модулів, і в стандартному постачанні недоступно. Якщо в змінній $email указати кілька адрес, розділених пробілами, інформація буде розіслана по всіх зазначених адресах. Це відкриває простий шлях до організації власної, ні від кого не залежної системи поштових розсилок
Часи та дати
Коли вже розмова торкнулася дати, спробуємо розібратися як все це можна використовувати у своїх власних цілях. У РНР найчастіше використовується функція DATE у форматі $date=date('параметр'); Параметрів може бути декілька, і розділяються вони між собою комою. Ось список припустимих параметрів
· a - "am" або "pm"
· A - "AM" або "PM"
· d - день місяця, цифровий, 2 цифри (на першому місці нуль)
· D - день тижня, текстовий, 3 букви; тобто "Fri"
· F - місяць, текстовий, довгий; тобто "January"
· h - година, цифровий, 12-годинний формат
· H - година, цифровий, 24-годинний формат
· і - хвилини, цифровий
· j - день місяця, цифровий, без початкових нулів
· l (рядкова 'L') - день тижня, текстовий, довгий; тобто "Friday"
· m - місяць, цифровий
· M - місяць, текстовий, 3 букви; тобто "Jan"
· s - секунди, цифровий
· S - англійський порядковий суфікс, текстовий, 2 символи; тобто "th", "nd"
· U - секунди з початку століття
· Y - рік, цифровий, 4 цифри
· w - день тижня, цифровий, 0 означає неділя
· y - рік, цифровий, 2 цифри
· z - день року, цифровий; тобто "299"
Зверніть увагу на відмінності в регістрі. Кожен символ у різних регістрах має різні функції. Тепер Ви легко можете одержати інформацію про поточний час, і використовувати її на власному сайті. Один із найбільш розповсюджених варіантів – вивід поточного часу та дати. Звичайно, все це робиться без проблем на JavaScript, але хто бачив ці скрипти, той зрозуміє різницю (принаймні в розмірі та швидкості виконання, не кажучи вже про трафік від сервера до браузера). Ну, час на мій погляд виводити досить безсенсовно, тому що воін є в кожного користувача у треї Windows-, а ось вивести число, місяць та день тижня (так й українською мовою) буває корисно. Почнемо з вітання відвідувачеві. Було б не погано вивести відповідну фразу в залежності від часу відвідування. Сказано – зроблено:
<?php
$h=date('H');
if ($h>=5 && $h<=11) echo "Добрий ранок!";
if ($h>=12 && $h<=18) echo "Здрастуйте!";
if ($h>=19 && $h<=24) echo "Добрий вечір!";
if ($h>=1 && $h<=4) echo "Добраніч!";
?>
Цифри бажаного часу можна проставити будь-які, у залежності від особистого поняття дня та ночі :-) Наступний крок – вивід числа, дня тижня та назви місяця. Але перш ніж ми приступимо до реалізації алгоритму, нам треба познайомитися ще з одним важливим моментом у мовах програмування
Масиви в РНР
Якщо Ви чітко уявляєте собі, що таке масив, пропоную Вам відразу перейти до читання наступного абзацу. Якщо ні, тоді саме це Ви зараз і довідаєтеся. Масив – це ряд змінних, упорядкованих по імені та маючих різний індекс. Наприклад уювіть, що у Вас є двадцять назв, і всі їх треба внести в програму. Можна для зручності обізвати змінні однаковим ім'ям та ставити наприкінці кожного імені змінної число в відповідності з номером назви. У Вас вийде найпростіший одномірний масив. Тільки будь-яка мова програмування (і РНР так само!) надає набір засобів для більш детальної та зручної роботи з таким набором – масивом. І число (так званий індекс) треба узяти в квадратні дужки. Припустимо існує ряд строкових змінних – комп'ютер, Інтернет, модем, монітор. Ім'я для масиву виберемо $m, хоча доступне кбудь-яке, як і в звичайної змінної. Індекс у масивах починається не з одиниці, а з нуля, і в такий спосіб для внесення наших слів у масив треба зробити так:
$m[0] = “комп'ютер”;
$m[1] = “Інтернет”;
$m[2] = “модем”;
$m[3] = “монітор”;
Тепер у нас створений масив з ім'ям $m та максимальним індексом (ця кількість елементів у масиві) – 4. Саме 4, хоча останній заповнений елемент – 3. Якщо ми спробуємо зчитати елемент із 4-им індексом, результат буде дорівнювати порожньому рядкові, тому що там просто нічого немає. Звертатися до елементів масиву треба по імені масиву та його індексові, що й складає основну зручність. Наприклад ми можемо вивести на екран всі елементи масиву:
$i = 0; while ($i < count($m)) { echo $m[$i].”<br>”; $i++; } Функція count($m) видає нам число, що відповідає максимальному індексові масиву. Отже у нас завжди існує можливість знати, скільки елементів присутні у даному масиві. Що ще можна довідатися про масиви в РНР? Наприклад, функція current повертає поточний елемент масиву. Кожна змінна-масив має внутрішній покажчик (це не індекс, а спеціяльний параметр який як правило або збігається з індексом або перевищує його на одиницю, але необов'язково), що вказує на один зі своїх елементів. Крім того, всі елементи в масиві зв'язуються двокерунковим списком покажчиків для додаткових цілей. Внутрішній покажчик вказує на перший елемент, що включався в масив поки Ви не виконували одну з функцій, що модифікують цей покажчик у цьому масиві. Функція current() просто повертає елемент масиву, на який у даний момент указує внутрішній покажчик. Вона ніяк не переміщає покажчик. Якщо внутрішній покажчик указує на кінець списку елементів, current() повертає false (неправда). Увага: якщо масив містить порожні елементи (0 або "", порожній рядок), то функція поверне "false" для кожного з них. Це показує, що поточний елемент є нульовим значенням або ви дійшли до кінця масиву. End - встановлюєте внутрішній покажчик масиву на останньому елементі. Next - пересуває внутрішній покажчик масиву. Повертає наступний елемент масиву, від поточної позиції внутрішнього покажчика масиву, або "неправда"(false) якщо немає більше елементів. Якщо масив містить порожні елементи, тоді ця функція поверне "неправда" (false) та для цих елементів. next() поводиться подібно current(), з одною лише різницею. Він пересуває внутрішній покажчик масиву на один елемент уперед перш, ніж повернути елемент. Це означає що він повертає значення наступного елемента та пересуває на нього внутрішній покажчик масиву. Якщо при звертанні до наступного елемента виявлений кінець масиву - next() повертає "неправда" (false). Prev - переміщає внутрішній покажчик масиву. Повертає попередній елемент масиву, або "неправда" (false), якщо перед поточної немає більше елементів. Якщо масив містить порожні елементи, то функція поверне "неправда" та на цих елементах. prev() веде себе подібно next(), за винятком того, що він переводить внутрішній покажчик масиву на одну позицію назад, а не вперед. Reset () - установлює внутрішній покажчик масиву на першому елементі. Rsort () - сортує масив у зворотному порядку (по убуванню). По алфавітові в тому числі. На жаль, український алфавіт отут ні до чого. Sort () - сортує масив. Точно так само що й попередня, тільки по зростанню. Звичайно, це далеко не всі функції, що є в РНР щодо масивів. Але инше - часто дуже специфічно та вирішується иноді більш простими методами
Дата по русски
Скрипт, що ми зараз розглянемо, дозволяє вивести на екран відвідувача дату у форматі української мови. Відразу попереджаю, що реалізація алгоритму цієї задачі не сама краща. Але – працездатна, зрозуміла у всіх відносинах та проста. А головне – використовується тільки те, що вже було описано. Спочатку я приведу сам текст скрипту, а потім докладно опишу його.
<?php
і>//-і визначаємо масив для місяців -і<і>
$q[]="";
і>$q[]="січня"; <і>
і>$q[]="лютого"; <і>
і>$q[]="березня"; <і>
і>$q[]="квітня"; <і>
і>$q[]="травня";<і>
і>$q[]="червня"; <і>
і>$q[]="липня"; <і>
і>$q[]="серпня"; <і>
і>$q[]="вересня"; <і>
і>$q[]="жовтня"; <і>
і>$q[]="листопаду";<і>
і>$q[]="грудня";<і>
і>//- визначаємо масив для днів тижня -і<і>
і>$e[0]="неділя"; <і>
і>$e[1]="понеділок"; <і>
і>$e[2]="вівторок"; <і>
і>$e[3]="середовище"; <і>
і>$e[4]="четвер";<і>
і>$e[5]="п'ятниця"; <і>
і>$e[6]="субота"; <і>
// -і-і зчитуємо місяць
$m=date('m');
if ($m=="01") $m=1;
if ($m=="02") $m=2;
if ($m=="03") $m=3;
if ($m=="04") $m=4;
if ($m=="05") $m=5;
if ($m=="06") $m=6;
if ($m=="07") $m=7;
if ($m=="08") $m=8;
if ($m=="09") $m=9;
// -і-і зчитуємо день тижня
$we=date('w');
// -і-і зчитуємо число
$chislo=date('d');
// - витягаємо з день тижня
$den_nedeli = $e[$we];
// - витягаємо значення місяця
$mesyac = $q[$m];
і>echo "У наш час ".$chislo." ".$mesyac.", ".$den_nedeli;
?>
Тепер розглянемо, як працює цей скрипт. Спочатку нам треба визначити два масиви, у яких будуть зберігатися відповідно українська назва місяця та українська назва дня тижня. Позаяк місяць не може бути нульовим, нам треба подбати про ввод елемента масиву з нульовим індексом. Якщо індекс масиву не зазначений, він приймається як такий, що дорівнюють внутрішньому покажчикові. Якщо масив порожній і ще не визначений, внутрішній покажчик указує на перший елемент (той що має індекс нуль). Увод нового елемента масиву переміщає внутрішній покажчик на одиницю нагору, і в такий спосіб забезпечується наступний увод значення масиву в елемент масиву, одиницю, що має індекс на, більший, ніж попередній. У принципі, можна забезпечити ввод даних у масив різними способами. Але зазначений тут – найпростіший та примітивний. Ми просто надаємо по черзі потрібні нам дані елементам масиву, і в такий спосіб заповнюємо його. Точно така ж історія спостерігається і з другим масивам. Тільки отут вже індекс потрібних елементів масиву вказується явно, і внутрішній покажчик установлюється на той індекс, що зазначений. А після вводу значення переміщається нагору на одиницю. Різниця між цими двома методами в тому, що якщо масив вже був визначений раніше, і індекс при вводі не зазначено, заповниться елемент масиву, на яку указує внутрішній покажчик. А він може знаходитися і наприкінці! А якщо індекс зазначений явно, внутрішній покажчик установлюється на його значення, і запис відбувається в явно зазначений елемент. Власне, частіше масиви бувають набагато довші ніж приведені у прикладі, і зручніше скористатися спеціяльною функцією, що дозволяє зчитати зазначений у ній файл та увести все, що є в цьому файлі в масив. Причому роздільником вважається переведення рядка, що дуже зручно. Синтаксис цієї функції - $ім'я масиву = file (“ім'я файлу”); Далі формується масив з зазначеним ім'ям та значеннями, що відповідають рядкам файлу.
Коли масиви визначені, нам треба зчитати номер місяця. Він зчитується з ведучим нулем, якщо номер місяця менш десяти, і тому нам треба подбати про його відсікання. Отут можна застосувати так само різні алгоритми та методи, але ми скористаємося лобовим рішенням – просто порівняємо отримане рішення з поруч заздалегідь відомих варіантів та змінимо номер місяця на правильний без нуля. Рішення грубе, зате зрозуміле та вже знайоме нам. Хоча так робити не правильно – є більш витончені методи. Наприклад – перевірити отримане значення на ведучий нуль, і якщо перевірка є істина (найперший символ у рядку – нуль), видалити перший символ
Далі по ходу скрипту ми зчитуємо день тижня та число. З числом робити нічого не потрібно, а ось день тижня та місяць повинні піддатися обробці. Витягаємо з введеного нами раніше масиву день тижня. Номер дня тижня указує на елемент нашого масиву, де зберігається потрібне укарїнська назва, і таким чином ми в будь-якому випадку одержимо правильне значення. Змінюється номер дня тижня, змінюється номер (індекс) елемента, з якого зчитується значення. Причому тут, у відмінності від масиву з ім'ям місяця, нулеві відповідає неділя, що ми й врахували при вводі масиву днів тижня. Точно таку ж операцію проводимо і для місяця. Його номер указує на елемент масиву, де зберігається правильне ім'я місяця російською мовою. А далі – виводимо результат на екран у довільній формі.
Висновок
Отже, ми познайомилися з дуже важливими в будь-якій мові програмування принципами організації циклів та масивів. А також довідалися, як застосовувати на практиці можливість відправлення пошти та зчитування дати. Не сумніваюся, що ви зможете придумати ще багато прикладів для застосування цих речей на практиці. Не соромтеся експериментувати та пробувати різні варіанти. Саме так і вивчаються мови програмування – на прикладах. Використовуйте для пошуку нових рішень та скриптів Інтернет, підпишіться на розсилки по РНР для одержання нової інформації. Якщо не все зрозуміло – сміливо задавайте питання, я постараюся в міру сил та знань відповісти на них. І ніколи не зупиняйтеся на досягнутому, тому що завжди існує те, що ми ще поки не знаємо, але ж так хочеться...
Андрій Кухарчик @ червень 2001
http://virtual.bresttelecom.by/php
virtualphp@tut.by
За матеріалами:
02.10.2002
Функції. include, require
Конструкція switch()
Цикли for(), foreach()
Конструкція if()
Вирази та оператори
Коментарі (5) | Залишити коментар
| Алекс | 10.10.2010 09:18 |
На каком язіке єто написано? Исправить миллион ошибок невозможно Проще переписать и не позориться![]() |
| твоя смерть | 16.11.2010 22:17 |
| от навіщо бог створив москалів,мені здаєтся тіки для того щоб вони лише підпиздували якусь хуйню збоку і смерділи як те лайно на кожному кроці. |
| Ice | 17.04.2011 06:50 |
| That′s really tihnikng out of the box. Thanks! |
| Chianna | 17.04.2011 19:52 |
| That′s a mold-brekaer. Great thinking! |
| Marel | 17.04.2011 21:12 |
| Stands back from the keyboard in amazement! Tnhaks! |

Проще переписать и не позориться

