Увійти
Жіночий інформаційний портал
  • Як наснитися людині перевірені способи
  • П'ятірка Пентаклею (5 Пентаклею): значення карти Таро П'ятірка денаріїв
  • П'ятірка пентаклей - значення карти П'ятірка денаріїв таро у поєднанні
  • Псування на похороні - в будинку, крематорії та на цвинтарі
  • Як правильно приготувати?
  • Псування на здоров'я - ознаки і як зняти?
  • Зонування inurl c board cgi cmd. Програмування за допомогою CGI

    Зонування inurl c board cgi cmd.  Програмування за допомогою CGI

    E-commerce зрозумілою російською. Як улаштований бізнес в інтернеті?

    Останнім часом трапляється дедалі більше проектів, пов'язаних з інтернет-торгівлею. Вивчаючи цей напрямок, не зміг знайти загального та зрозумілого опису процесу. Тому вирішив зробити щось на зразок шпаргалки, до якої завжди можна буде звертатися, щоб зрозуміти порядок дій у такій галузі, як e-commerce.

    Відразу зазначу, що зробив акцент на процесах та каналах, які допомагають наводити клієнтів.

    E-commerce: що це?

    Визначення на різних джерелах говорять про продаж товарів чи послуг через інтернет. Простими словами e-commerce, це будь-яка діяльність у мережі, де з'являються гроші.

    Купівля, продаж, страховки, банкінг, електронні гроші, все сюди. Заберіть, розпишіться.

    Від мети

    Для того, щоб розібратися у питанні, пропоную розпочати шлях із самого кінця. Яка мета у будь-якого бізнесу? Правильно, заробити. Так ось, уявіть будь-який продукт, наприклад, силіконові шкарпетки. Чому б і ні!

    Взяв перше, що спало на думку, виявилося їсти таке…

    Наше завдання, це заробити на цих шкарпетках. Ми думаємо про інтернет. Хм ... а чому б не "запиляти" сайт і ось як підуть продажі, тільки тримайте мене Мальдіви! Але не все так просто.

    Мені дуже подобається малювати. Це допомагає зрозуміти різні процеси. Помалюємо?!

    Поки що наша модель виглядає так. Беремо шкарпетки, засовуємо їх в інтернет та отримуємо гроші. Це просто чудово! Очі горять, долоні потіють і вже хочеться взятися за цю справу. Але ж потрібно зробити сайт чи майданчик для продажу?

    Сайт або майданчик для продажу

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

    Замовили собі сайт, взяли готовий шаблон або самі створили за допомогою конструктора (CMS можна погуглити), не важливо. Далі розмістили купу силіконових шкарпеток різних видів та щасливі.

    Вибачте, що перериваю читання. Приєднуйтесь до мого телеграм каналу . Свіжі новини статей, розвиток digital продуктів та growth hack, там все. Чекаю вас! Продовжуємо…

    Платіжні системи

    Але для того, щоб людина змогла у вас купити тут і зараз, необхідно буде підкрутити платіжні системи. Це свого роду сервіс, який дозволяє здійснювати покупки в мережі через: банківські картки, інтернет гроші, мобільні телефони та ще купу всього. За це доведеться ділитися відсотком від транзакцій, але таким чином ви дуже спростите життя.

    Вибирайте потрібний собі сервіс. Десь буде вище відсоток, а десь абонентка чи ще. Просто трохи вивчіть питання. Поставте собі необхідний код на сайт, прив'яжете всі транзакції до свого рахунку на карті та вуалю!

    Ось здавалося б усе. Сайт є, картки товарів теж і навіть кнопка "купити" працює, але чогось не вистачає... Немає потоку клієнтів, який купуватиме.

    Потоки клієнтів

    Де: CAC = Вартість залучення нового клієнта. MCC (marketingcampaigncosts) = Сумарна вартість маркетингових витрат, вкладених у залучення клієнтів (але з утримання). W (wages) = Зарплата маркетологам та менеджерам з продажу. S (software) = Вартість програмного забезпечення, що використовується в рекламі та продажах (наприклад, використовуваної платформи продажів, автоматизації маркетингу, A/B-тестування, сервісів аналітики тощо). PS (professionalservices) = Вартість професійних послуг, що надаються відділам маркетингу та продажу (дизайн, консультації тощо). O (other) = Інші накладні витрати, що стосуються відділів маркетингу та продажу. CA (customersacquired) = Сумарна кількість залучених клієнтів.

    Але не можна забувати про якість клієнта, тут допоможе LTV.

    Важливі показники: LTV

    Live Time Value, життєвий цикл клієнта, ще один показник у e-commerce, який потрібно враховувати. Він показує, що в середньому доходу приносить один клієнт. Є різні підходи до розрахунку, я вибрав фактичний за прибутком, як один із найточніших.

    Це просто сума загального прибутку за всю історію покупок для кожного окремого клієнта. Додати суму всіх покупок (транзакцій) клієнта до транзакції N, де транзакція N - це остання покупка, яку здійснив клієнт у вашій компанії. Якщо у вас є доступ до всіх даних транзакцій клієнтів, то ви можете легко обчислити це за допомогою Excel.

    LTV = (транзакція 1 + транзакція 2 + транзакція 3 ... + транзакція N) x частку прибутку у виручці.

    Розрахунок LTV на підставі чистого прибутку, зрештою показує фактичний прибуток, який клієнт приносить вашій компанії. Тут береться до уваги вартість обслуговування клієнтів, вартість утримання, вартість залучення тощо. В результаті виходить цілий комплекс обчислень, що базується на окремо взятих даних. Сукупний прибуток, який отримується від одного клієнта за весь час, дасть вам точне розуміння рентабельності ваших клієнтів на сьогоднішній день.

    З іншими підходами можна ознайомитись на .

    Важливі показники: співвідношення CAC та LTV

    Для розуміння життєздатності бізнесу дуже важливо дивитися на ставлення двох згаданих показників CAC:LTV.

    • Менш ніж 1:1 – Ви на всіх парах мчите до банкрутства.
    • 1:1 – Ви втрачаєте гроші на кожному залученому клієнті.
    • 1:2 – Начебто непогано, але, схоже, що ви вкладаєте недостатньо коштів, а могли б розвиватися швидше. Запустіть більш агресивні кампанії із залучення клієнтів і досягайте показників близьких до 1:3.
    • 1:3 - Ідеальне співвідношення. У Вас процвітаючий бізнес та міцна бізнес-модель.

    Важливі показники: ROI не забуваємо

    Як ми розібрали вище, в e-commerce необхідно чітко розуміти, чи вигідно використовувати канал залучення чи ні. Крім LTV та CAC існує ще один важливий показник, це ROI. Він показує, чи ваші вкладення окупилися, в нашому випадку в рекламу. Тобто. скільки один вкладений карбованець приніс нам у результаті.

    Для розрахунку використовується дуже нескладна формула:

    Де “Дохід від кампанії”, це різниця між доходом від каналу та собівартістю на ваш продукт. А щоб порахувати прибуток, заберіть ще витрати на рекламу.

    Таким чином, більш розгорнута формула виглядатиме так:

    ROI = (Дохід по каналу – Собівартість) – Рекламні витрати / Рекламні витрати х 100%

    Більш детальний приклад із розрахунком читайте. По суті, ця проста формула міститься все в ту ж табличку Excel, де все вважається автоматично.

    Всі три показники, які ми розібрали, є важливими в E-commerce. Кожен із них дозволяє знайти “вузькі” місця у ваших потоках і працювати з ними. Якраз у них криється потенціал зростання для бізнесу. Ще трохи доповнив нашу модель зі шкарпетками.

    Вмістити все в один матеріал не вдається, та й хто його так довго читатиме? Пізніше зроблю окремий гайд з нюансів e-commerce, які можуть заважати продажам.

    Разом

    Загалом тепер у вас є загальне розуміння інтернет-торгівлі або e-commerce. Далі, як кажуть: "Диявол криється в деталях". Вивчайте кожен із каналів окремо, вважайте показники ефективності та шукайте нові інсайти у дрібницях. Інтернет продажів вам, та більше! А з мене є ще один матеріал.

    Так, мало не забув, з наступаючим вас, дорогі читачі! Бажаю наступного року вам великих перемог та звершень!

    Глава №9.

    Програмування за допомогою CGI

    Включення розділу про CGI в книгу з баз даних може здатися настільки ж дивним, як би в кулінарну книгу була включена глава про ремонт автомобілів. Зрозуміло, щоб з'їздити в магазин за продуктами, потрібен справний автомобіль, але чи доречно про це говорити? Повний виклад CGI та веб-програмування загалом виходять за рамки цієї книги, але короткого введення в ці теми достатньо для того, щоб розширити можливості MySQL та mSQL за поданням даних у царстві Web.

    В основному цей розділ призначений тим, хто вивчає бази даних, але не проти придбати деякі знання і в програмуванні для Web. Якщо ваше прізвище Бернерс-Лі або Андрессен, навряд чи ви знайдете тут те, чого ще не знаєте. Але навіть якщо ви не новачок в CGI, наявність під рукою короткого довідника під час занурення в таємниці MySQL і mSQL може бути дуже корисним.

    Що таке CGI?

    Як і більшість акронімів, Common Gateway Interface (CGI – загальний шлюзовий інтерфейс) мало що говорить по суті. Інтерфейс із чим? Де цей шлюз? Про яку спільність мова? Щоб відповісти на ці питання, повернемося трохи назад та кинемо погляд на WWW загалом.

    Тім Бернерс-Лі, фізик, який працював у CERN, вигадав Web в 1990 році, хоча план виник ще в 1988. Ідея полягала в тому, щоб дати дослідникам в галузі фізики елементарних частинок можливість легко і швидко обмінюватися мультимедійними даними - текстом, зображеннями та звуком - через Інтернет. WWW складалася з трьох основних частин: HTML, URL та HTTP. HTML -мова форматування, що використовується для представлення змісту в Web. URL -це адреса, яка використовується для отримання вмісту у форматі HTML (або будь-якому іншому) з веб-сервера. І наостанок, HTTP -це мова, яка зрозуміла веб-серверу і дозволяє клієнтам вимагати у сервера документи.

    Можливість пересилання через Інтернет інформації всіх типів стала революцією, але незабаром було виявлено й іншу можливість. Якщо можна переслати через Web будь-який текст, чому не можна переслати текст, створений програмою, а чи не взятий із готового файла? При цьому відкривається море можливостей. Простий приклад: можна використовувати програму, що виводить поточний час, щоб читач бачив правильний час при кожному перегляді сторінки. Декілька розумних голів у National Center for Supercomputing Applications (Національний центр розробки додатків для суперкомп'ютерів -NCSA), які створювали веб-сервер, таку можливість побачили, і незабаром з'явився CGI.

    CGI - це набір правил, за якими програми на сервері можуть через веб-сервер надсилати дані клієнтам. Специфікація CGI супроводжувалася змінами HTML і HTTP, що вводили нову характеристику, відому як форми.

    Якщо CGI дозволяє програмам посилати дані клієнту, форми розширюють цю можливість, дозволяючи клієнту посилати дані цієї CGI-программы. Тепер користувач може не тільки бачити поточний час, а й встановлювати годинник! Форми CGI відчинили двері для справжньої інтерактивності у світі Web. Поширені програми CGI включають:

    • Динамічний HTML. Цілі сайти можуть генеруватись однією CGI-програмою.
    • Пошукові механізми, що знаходять документи із заданими користувачем словами.
    • Гостьові книги та дошки оголошень, до яких користувачі можуть додавати повідомлення.
    • Бланки замовлень
    • Анкети.
    • Вилучення інформації з розміщеної на сервері бази даних.

    У наступних розділах ми обговоримо всі ці програми CGI, а також деякі інші. Всі вони дають чудову можливість з'єднання CGI з базою даних, що цікавить нас у цьому розділі.

    Форми HTML

    Перш ніж вивчати особливості CGI, корисно розглянути спосіб, що найбільш часто зустрічається, за допомогою якого кінцеві користувачі отримують інтерфейс до CGI-програм: форми HTML. Форми є частиною мови HTML, що надає кінцевому користувачеві поля різних типів. Дані, що вводяться в поля, можуть бути надіслані веб-серверу. Поля можуть служити для введення тексту або кнопками, які користувач може натиснути або відзначити галочкою. Ось приклад сторінки HTML, що містить форму:

    <НТМL><НЕАD><ТITLЕ>Моя сторінка з формами


    <р>Це сторінка із формою.


    Введіть своє ім'я:



    Дана форма створює рядок довжиною 40 символів, куди користувач може ввести ім'я. Під рядком для введення знаходиться кнопка, при натисканні якої дані форми передаються серверу. Нижче перераховані теги, що підтримуються HTML 3.2 - найбільш поширеним в даний час стандартом. Назви тегів і атрибутів можуть вводитися в будь-якому регістрі, але ми дотримуємося необов'язкової угоди, згідно з якою теги, що відкриваються, пишуться у верхньому регістрі, а закриваючі - в нижньому.


    Цей тег свідчить про початок форми. Наприкінці форми потрібно закривати тег

    . Між тегами
    допускаються три атрибути: ACTION задає URL або відносний шлях до CGI-програми, якій будуть надіслані дані; METHOD вказує метод HTTP, за допомогою якого буде надіслана форма (це може бути GET або ч POST, але майже завжди будемо використовувати POST); ENCTYPE визначає метод кодування даних (його слід використовувати тільки при чіткому розумінні того, що ви робите).


    Надає найбільш гнучкий спосіб введення даних користувачем. Фактично є дев'ять різних типів тега . Тип визначається атрибутом TYPE. У попередньому прикладі використовуються два теги : один із типом SUBMIT та інший із типом за замовчуванням TEXT. Дев'ять типів такі:

    TEXT

    Поле для введення одного рядка тексту.

    PASSWORD

    Те ж, що TEXT, але текст, що вводиться, не відображається на екрані.

    CHECKBOX

    Прапорець, який користувач може встановлювати та скидати.

    RADIO

    Радіокнопка, яка має об'єднуватися ще хоча б з однією радіокнопкою. Користувач може вибрати лише одну.

    SUBMIT

    Кнопка, при натисканні якої форма надсилається на веб-сервер.

    RESET

    Кнопка, при натисканні якої у формі відновлюються стандартні значення.

    FILE

    Аналогічний текстовому вікну, але передбачає введення імені файлу, який буде надіслано на сервер.

    HIDDEN

    Невидиме поле, де можуть зберігатися дані.

    IMAGE

    Аналогічний кнопці SUBMIT, але можна задати картинку зображення на кнопці.

    Окрім атрибуту TYPE теги зазвичай мають атрибут NAME, що зв'язує введені в поле дані з деяким ім'ям. Ім'я та дані передаються серверу в стилі величина = значення. У попередньому прикладі текстове поле називалося firstname. Можна використовувати атрибут VALUE, щоб привласнити поля типу TEXT, PASSWORD , FILE і HIDDEN встановлені значення. Цей же атрибут, який використовується з кнопками типу SUBMIT або RESET, виводить на них заданий текст. Поля типу RADIO та CHECKBOX можна відобразити як виставлені за допомогою атрибуту CHECKED без значення.

    Атрибут SIZE використовується для завдання довжини полів типу TEXT, PASSWORD та FILE. Атрибут MAXLENGTH можна використовувати для обмеження довжини тексту, що вводиться. Атрибут SRC задає URL-адресу зображення, що використовується в типі IMAGE. І нарешті, атрибут ALIGN задає характер вирівнювання зображення типу IMAGE і може мати значення TOP, MIDDLE, BOTTOM (за замовчуванням), LEFT чи RIGHT (вгору, всередину, вниз, вліво, вправо).

    .

    Як і у тега , біля тега , і як текст за промовчанням буде прийнято будь-який текст, що знаходиться між тегами , аналогічно атрибуту VALUE для тега . Для тега

    , що дає місце для введення нарису. Дані одержують ім'я "essay". Блок тексту 70 символів у ширину та 10 рядків у глибину. Простір між тегами

    можна використовувати для зразка нарису. -->

    типів "SUBMIT" та "RESET" відповідно. Кнопка "SUBMIT" має перевизначений напис "Ввести дані", а кнопка "RESET" має напис за замовчуванням (визначається броузером). Клікнувши по кнопці "SUBMIT", ви надішлете дані на веб-сервер, Кнопка "RESET" відновить дані R вихідний стан, видаливши всі введені користувачем дані. -->


    Єдиний тип введення, який ми не використовували тут, - це тип IMAGE для тега . Можна було б використовувати його як альтернативний спосіб відправлення форми. Однак тип IMAGE рідко сумісний з текстовими і не дуже чуйними броузерами, тому розумно уникати його, якщо ваш сайт не виконаний в насиченому графічному стилі.

    Після знайомства з основами форм HTML можна розпочати вивчення власне CGI.

    Специфікація CGI

    Отже, що точно є «набір правил», що дозволяє CGI-програмі, скажімо, в Батавії, штат Іллінойс, обмінюватися даними з веб-броузером у Зовнішній Монголії? Офіційну специфікацію CGI поряд з іншими відомостями про CGI можна знайти на сервері NCSA за адресою http://hoohoo . ncsa.uluc.edu/cgi/.Однак цей розділ для того і існує, щоб вам не довелося довго подорожувати і самому його шукати.

    Є чотири способи, якими CGI передає дані між CGI-npor-рамою та веб-сервером, а отже, і клієнтом Web:

    • Змінні оточення.
    • Командна строка.
    • Стандартний пристрій введення.
    • Стандартний пристрій виведення.

    За допомогою цих чотирьох методів сервер пересилає всі дані, передані клієнтом CGI-програмі. Потім CGI-програма робить свою чарівну справу і пересилає вихідні дані назад до сервера, який переправляє їх клієнту.

    Ці дані наводяться із прикидкою на сервер HTTP Apache. Apache - найпоширеніший веб-сервер, що працює практично на будь-якій платформі, включаючи Windows 9х та Windows NT. Однак вони можуть бути застосовані до всіх HTTP-серверів, які підтримують CGI. Деякі патентовані сервери, наприклад, Microsoft і Netscape, можуть мати додаткові функції або працювати інакше. Оскільки обличчя Web продовжує змінюватися з неймовірною швидкістю, стандарти все ще розвиваються, і в майбутньому, безперечно, відбудуться зміни. Однак, що стосується CGI, то ця технологія видається усталеною - розплачуватись за це доводиться тим, що інші технології, такі як аплети, її потіснили. Всі CGI-програми, які ви напишете, використовуючи цю інформацію, майже напевно зможуть працювати ще довгі роки на більшості веб-серверів.

    Коли CGI-програма викликається за допомогою форми - найбільш поширеного інтерфейсу, броузер передає серверу довгий рядок, на початку якого стоїть шлях до CGI-програми та її ім'я. Потім слідують різні інші дані, які називаються інформацією шляху та передаються CGI-програмі через змінну оточення PATH_INFO (рис. 9-1). Після інформації шляху слідує символ «?», а за ним – дані форми, які надсилаються серверу за допомогою методу HTTP GET. Ці дані стають доступними до CGI-програми через змінну оточення QUERY_STRING . Будь-які дані, які сторінка надсилає за допомогою методу HTTP POST, який використовується найчастіше, будуть передані CGI-програмі через стандартний пристрій введення. Типовий рядок, який може отримати сервер від броузера, показано на рис. 9-1. Програма з ім'ям formreadв каталозі cgi-binвикликається сервером з додатковою інформацією шляху extra/informationі даними запиту choice=help - мабуть, як частина вихідної URL-адреси. Нарешті, дані самої форми (текст CGI programming в полі keywords) пересилаються через метод HTTP POST .

    Змінні оточення

    Коли сервер виконує CGI-програму, то передусім передає їй деякі дані до роботи у вигляді змінних оточення. У специфікації офіційно визначено сімнадцять змінних, але неофіційно використовується значно більше - за допомогою механізму, що описується нижче, званого HTTP_/nec/zams/n. CGI-програма

    має доступ до цих змінних так само, як і до будь-яких змінних середовища командного процесора під час запуску з командного рядка. У сценарії командного процесора, наприклад, змінної оточення F00 можна звертатися як $F00; Perl це звернення виглядає, як $ENV("F00") ; в С - getenv ("F00"); і т. д. У таблиці 9-1 перераховані змінні, які завжди встановлюються сервером - хоча б і значення null. Крім цих змінних дані, що повертаються клієнтом у заголовку запиту, надаються змінним виду HTTP_F00 , де F00 - ім'я заголовка. Наприклад, більшість веб-броузерів включає дані про версію в заголовок з ім'ям USEfl_AGENT . Ваша CGI-npor-рама може отримати ці дані із змінної HTTP_USER_AGENT .

    Таблиця 9-1.Змінні оточення CGI

    Змінне оточення

    Опис

    CONTENT_LENGTH

    Довжина даних, переданих методами POST чи PUT, у байтах.

    CONTENT_TYPE

    Тип MIME даних, приєднаних за допомогою методів POST або PUT.

    GATEWAY_INTERFACE

    Номер версії специфікації CGI, яку підтримує сервер.

    PATH_INFO

    Додаткова інформація про шлях, передана клієнтом. Наприклад, для запиту http://www.myserver.eom/test.cgi/this/is/a/ path?field=greenзначенням змінної РАТН_ INFO буде /this/is/a/path.

    PATH_TRANSLATED

    Те ж, що PATH_INFO , але сервер виробляє всю


    Можливу трансляцію, наприклад, розширення імен типу "-account". »

    QUERY_STRING

    Усі дані, що йдуть за символом «?» у URL. Це також дані, що передаються, коли форма REQ-UEST_METHOD є GET.

    REMOTE_ADDR

    IP-адреса клієнта, що робить запит.

    REMOTE_HOST

    Ім'я вузла машини клієнта, якщо воно є.

    REMOTE_IDENT

    Якщо веб-сервер та клієнт підтримують ідентифікацію типу identd,то це ім'я користувача облікового запису, який робить запит.

    REQUEST_METHOD

    Метод, який використовується клієнтом для запиту. Для CGI-програм, які ми збираємося створювати, це буде POST або GET.

    SERVER_NAME Ім'я вузла - або IP-адреса, якщо ім'я недоступне, -машини, на якій виконується веб-сервер.
    SERVER_PORT Номер порту, який використовується веб-сервером.
    SERVER_PROTOCOL
    Протокол, який використовує клієнт для зв'язку з сервером. У нашому випадку цей протокол майже завжди є HTTP.
    SERVER_SOFTWARE Дані про версію веб-сервера, що виконує програму CGI.

    SCRIPT_NAME

    Шлях до сценарію, вказаний клієнтом. Може використовуватися при посиланні URL на себе, і для того, щоб сценарії, посилання на які існують в різних місцях, могли виконуватися по-різному в залежності від місця.

    Наведемо приклад сценарію CGI на Perl, який виводить усі змінні оточення, встановлені сервером, і навіть всі успадковані змінні, такі як PATH, встановлені командним процесором, який запустив сервер.

    #!/usr/bin/perl -w

    print<< HTML;

    Content-type: text/html\n\n

    <р>Змінні оточення

    HTML

    foreach (keys %ENV) ( print "$_: $ENV($_)
    \n"; )

    print<

    HTML

    Всі ці змінні можуть бути використані і навіть змінені вашою програмою CGI. Однак ці зміни не зачіпають веб-сервер, який запустив програму.

    Командна строка

    CGI допускає передачу CGI-програмі аргументів як параметри командного рядка, який рідко використовується. Рідко вона використовується тому, що практичні застосування її нечисленні, і ми не будемо зупинятися на ній докладно. Суть у тому, що якщо змінна оточення QUERY_STRING не містить символу =, то CGI-програма буде виконуватися з параметрами командного рядка, взятими з QUERY_STRING . Наприклад, http://www.myserver.com/cgi- bin/finger?rootзапустить finger root на www.myserver.com.

    Існують дві основні бібліотеки, що забезпечують CGI-інтерфейс для Perl. Перша з них - cgi-lib.plУтиліта cgi-lib.plдуже поширена, оскільки протягом тривалого часу була єдиною наявною великою бібліотекою. Вона призначена для роботи в Perl 4, але працює і з Perl 5. CGI.pm,нова і багато в чому перевершує cgi-lib.pl. CGI.pmнаписана для Perl 5 та використовує повністю об'єктно-орієнтовану схему для роботи з даними CGI. Модуль CGI.pmаналізує стандартний пристрій введення та змінну QUERY_STRING та зберігає дані в об'єкті CGI. Ваша програма повинна створити новий об'єкт CGI і використовувати прості методи, такі як paramQ, для вилучення потрібних вам даних. Приклад 9-2 є короткою демонстрацією того, як CGI.pmінтерпретує дані. Всі приклади на Perl у цьому розділі будуть використовувати CGI.PM.

    Приклад 9-2. Синтаксичний аналіз CGI-даних на Perl

    #!/usr/bin/perl -w

    use CGI qw(:standard);

    # Використовується модуль CGI.pm. qw(:standard) імпортує

    # простір імен стандартних CGI-функцій, щоб отримати

    # Зрозуміліший код. Це можна робити, якщо у сценарії

    # використовується лише один об'єкт CGI.

    $ mycgi = новий CGI; #Створити об'єкт CGI, який буде "шлюзом" до даних форми

    @fields = $ mycgi-> param; # Вийняти імена всіх заповнених полів форми

    print header, start_html("CGI.pm test"); ft Методи "header" та "start_html",

    # надані

    # CGI.pm, спрощують отримання HTML.

    # "header" виводить необхідний заголовок HTTP, a

    #"start_html" виводить заголовок HTML з даною назвою,

    #a також тег .

    print "<р>Дані форми:
    ";

    foreach (@fields) ( print $_, ":",- $mycgi->param($_), "
    "; }

    # Для кожного поля вивести ім'я та значення, що отримується за допомогою

    # $mycgi->param("fieldname").

    print end_html; # Скорочення для виведення завершальних тегів "".

    Обробка вхідних даних С

    Оскільки основні API для MySQL та mSQL написані на С, ми не будемо повністю відмовлятися від С на користь Perl, але там, де це доречно, наведемо кілька прикладів на С. Є три широко використовувані С-бібліотеки для CGI-програмування: cgicТома Бу-телла (Tom Boutell) *; cgihtmlЮджина Кіма (Eugene Kim) t та libcgiвід EIT*. Ми вважаємо, що cgicє найбільш повним і простим у використанні. У ній, проте, немає можливості перерахування всіх змінних форми, коли вони не відомі вам заздалегідь. Насправді її можна додати шляхом простого патчу, але це виходить за рамки даного розділу. Тому в прикладі 9-3 ми використовуємо бібліотеку cgihtml,щоб повторити на наведений вище сценарій Perl.

    Приклад 9-3.Синтаксичний аналіз CGI-даних на С

    /* cgihtmltest.c - Типова CGI-програма для виведення ключів та їх значень

    з даних, отриманих від форми */

    #include

    #include "cgi-lib.h" /* Тут містяться всі визначення функцій СGI */

    #include "html-lib.h" /* Тут містяться" всі визначення допоміжних функцій для HTML */

    void print_all(list 1)

    /* Ці функції виводять дані, передані формою, у тому форматі, як і наведений вище сценарій Perl. Cgihtml надає також вбудовану функцію

    Print_entries(), яка робить те саме, використовуючи формат списку HTML. */ (

    node* window;

    /* Тип "node" визначений у бібліотеці cgihtml та посилається на пов'язаний список, у якому зберігаються всі дані форми. */

    window = I.head; /* Встановлює покажчик початку даних форми */

    while (window != NULL) ( /* Пройти по зв'язаному списку до останнього (першого порожнього) елемента */

    printf(" %s:%s
    \n",window->entry. name,replace_ltgt(window->entry.value));

    /* Вивести дані. Replace__ltgt() - функція, яка розуміє HTML-кодування тексту та забезпечує його правильний висновок на броузер клієнта. */

    window = window->next; /* Перейти до наступного списку. */

    } }

    int main() (

    llist entries; /* Покажчик на проаналізовані дані*/

    int status; /* Ціле число, що має статус */

    Html__header(); /* Допоміжна функція HTML, що виводить заголовок HTML*/

    Html_begin("cgihtml test");

    /* Допоміжна функція HTML, що виводить початок сторінки HTML із зазначеним заголовком. */

    status = read_cgi_input(&entries); /* Здійснює введення та синтаксичний аналіз даних форми*/

    Printf("<р>Дані форми:
    ");

    Print_all(entries); /* Викликає певну функцію print_all(). */

    html_end(); /* Допоміжна функція HTML, що виводить кінець сторінки HTML. */

    List_clear(&entries); /* Звільняє пам'ять, зайняту даними форми. */

    return 0; )

    Стандартний пристрій виводу

    Дані, що надсилаються CGI-програмою на стандартний пристрій виведення, читаються веб-сервером і надсилаються клієнту. Якщо ім'я сценарію починається з nph-,то дані надсилаються безпосередньо клієнту без втручання з боку веб-сервера. У цьому випадку CGI-програма має сформувати правильний заголовок HTTP, який буде зрозумілий клієнту. В іншому випадку надайте веб-серверу сформувати заголовок HTTP за вас.

    Навіть якщо ви не використовуєте nph-Сценарій, серверу потрібно дати одну директиву, яка повідомить йому відомості про вашу видачу. Зазвичай це HTTP-заголовок Content-Type, але може бути і заголовок Location. За заголовком повинен слідувати порожній рядок, тобто переклад рядка або комбінація CR/LF.

    Заголовок Content-Type повідомляє серверу, який тип даних видає ваша CGI-програма. Якщо це сторінка HTML, то рядок має бути Content-Type: text/html.Заголовок Location повідомляє серверу інший URL - чи інший шлях тому ж сервері, - куди потрібно направити клієнта. Заголовок повинен мати такий вигляд: Location: http:// www. myserver. com/another/place/.

    Після заголовків HTTP і порожнього рядка можна надсилати власне дані, що видаються вашою програмою, - сторінку HTML, зображення, текст або щось інше. Серед CGI-програм, що постачаються із сервером Apache, є nph-test-cgiі test-cgi,які добре демонструють різницю між заголовками у стилях nph та не-nph, відповідно.

    У цьому розділі ми будемо використовувати бібліотеки CGI.pmі cgic,у яких є функції виведення заголовків як HTTP, і HTML. Це дозволить вам зосередитися на виведенні змісту. Ці допоміжні функції використані прикладах, наведених раніше у цьому розділі.

    Важливі особливості сценаріїв CGI

    Ви вже знаєте, в основному, як працює CGI. Клієнт надсилає дані, зазвичай за допомогою форми, веб-серверу. Сервер виконує програму CGI, передаючи їй дані. CGI-програма здійснює свою обробку та повертає свої вихідні дані серверу, який передає їх клієнту. Тепер від розуміння того, як працюють CGI-npor-рами, потрібно перейти до розуміння того, чому вони так широко використовуються.

    Хоча вам вже достатньо відомо з цього розділу, щоб зібрати просту працюючу CGI-програму, потрібно розібрати ще кілька важливих питань, перш ніж створювати програми, що реально працюють, для MySQL або mSQL. По-перше, потрібно навчитися працювати з кількома формами. Потім потрібно освоїти деякі заходи безпеки, які завадять зловмисникам отримати незаконний доступ до файлів вашого сервера або знищити їх.

    Запам'ятовування стану

    Запам'ятовування стану є життєво важливим засобом надання хорошого обслуговування вашим користувачам, а не тільки служить для боротьби із запеклими злочинцями, як це може здатися. Проблема викликана тим, що HTTP є так званим протоколом без пам'яті. Це означає, що клієнт надсилає дані серверу, сервер повертає дані клієнту, і далі кожен йде своєю дорогою. Сервер не зберігає клієнта даних, які можуть знадобитися в наступних операціях. Аналогічно, немає впевненості, що клієнт збереже про досконалу операцію будь-які дані, які можна буде використовувати пізніше. Це накладає безпосереднє та суттєве обмеження на використання World Wide Web.

    Складання сценаріїв CGI при такому протоколі аналогічно нездатності запам'ятовувати розмову. Щоразу, розмовляючи з будь-ким, незалежно від того, як часто ви спілкувалися з ним раніше, вам доводиться представлятися і шукати спільну тему для розмови. Немає потреби пояснювати, що це не сприяє продуктивності. Малюнок 9-2 показує, що кожного разу, коли запит досягає програми CGI, це абсолютно новий екземпляр програми, що не має зв'язку з попереднім.

    У частині клієнта з появою Netscape Navigator з'явилося рішення, що виглядає поспіхом, зробленим під назвою cookies. Воно полягає у створенні нового HTTP-заголовка, який можна пересилати туди-сюди між клієнтом та сервером, схожим на заголовки Content-Type та Location. Броузер клієнта, отримавши заголовок cookie, повинен зберегти в cookie дані, а також ім'я домену, в якому діє цей cookie. Після цього щоразу при відвідуванні URL в межах вказаного домену заголовок cookie повинен повертатися серверу для використання в програмах CGI на цьому сервері.

    Метод cookie використовується переважно для зберігання ідентифікатора користувача. Відомості про відвідувача можна зберегти у файлі на машині сервера. Унікальний ID цього користувача можна надіслати як cookie броузеру користувача, після чого при кожному відвідуванні сайту користувач броузер автоматично надсилає серверу цей ID. Сервер передає ID програмі CGI, яка відкриває відповідний файл і отримує доступ до всіх даних користувача. Все це відбувається непомітним для користувача чином.

    Незважаючи на всю корисність цього методу, більшість великих сайтів не використовує його як єдиний засіб запам'ятовування стану. Для цього є низка причин. По-перше, не всі броузери підтримують cookie. Донедавна основний броузер для людей з недостатнім зором (не говорячи вже про людей з недостатньою швидкістю підключення до мережі) – Lynx – не підтримував cookie. "Офіційно" він досі їх не підтримує, хоча це роблять деякі його широко доступні "бічні гілки". По-друге, важливіше, cookie прив'язують користувача до певної машини. Однією з великих переваг Web є те, що вона доступна з будь-якої точки світла. Незалежно від того, де була створена або де зберігається веб-сторінка, її можна показати з будь-якої підключеної до Інтернету машини. Однак якщо ви спробуєте отримати доступ до сайту, що підтримує cookie з чужої машини, всі ваші персональні дані, що підтримувалися за допомогою cookie, будуть втрачені.

    Багато сайтів, як і раніше, використовують cookie для персоналізації сторінок користувачів, але більшість доповнює їх традиційним інтерфейсом у стилі «ім'я реєстрації/пароль». Якщо доступ до сайту здійснюється з броузера, що не підтримує cookie, сторінка містить форму, в яку користувач вводить ім'я реєстрації та пароль, присвоєні йому при першому відвідуванні сайту. Зазвичай ця форма маленька і скромна, щоб не відлякувати більшість користувачів, які не зацікавлені в жодній персоналізації, а просто охочих пройти далі. Після введення користувачем у форму імені реєстрації та пароля CGI знаходить файл з даними про цього користувача, начебто ім'я надсилалося з cookie. Використовуючи цей метод, користувач може реєструватися на персональному веб-сайті з будь-якої точки світла.

    Крім завдань обліку переваг користувача та тривалого зберігання відомостей про нього можна навести тонший приклад запам'ятовування стану, який дають популярні пошукові машини. Здійснюючи пошук за допомогою таких служб, як AltaVista або Yahoo, ви зазвичай отримуєте значно більше результатів, ніж можна відобразити у зручному для читання вигляді. Ця проблема вирішується тим, що показується невелика кількість результатів – зазвичай 10 або 20 – і дається будь-який засіб переміщення для перегляду наступної групи результатів. Хоча звичайному мандрівнику по Web така поведінка здається звичайною і очікуваною, дійсна його реалізація нетривіальна і вимагає запам'ятовування стану.

    Коли користувач вперше робить запит пошуковому механізму, той збирає всі результати, можливо, обмежуючись деякою граничною граничною кількістю. Фокус полягає в тому, щоб видавати ці результати одночасно в невеликій кількості, запам'ятавши при цьому, що користувач запитував ці результати і яку порцію він чекає наступної. Залишаючи осторонь складності самого пошукового механізму, ми постаємо перед проблемою послідовного надання користувачеві деякої інформації на одній сторінці. Розглянемо приклад 9-4, в якому показаний сценарій CGI, що виводить десять рядків файлу і надає можливість переглянути наступні або попередні десять рядків.

    Приклад 9-4. Збереження стану у сценарії CGI

    #!/usr/bin/perl -w

    use CGI;

    Open(F,"/usr/dict/words") or die("Не можу відкрити! $!");

    #Це файл, який виводитиметься, може бути будь-яким.

    $output = новий CGI;

    sub print_range (# Це головна функція програми my $start = shift;

    # Початковий рядок файлу, my $count = 0;

    # Вказівник, my $line = "";

    # Поточний рядок файлу, print $output->header,

    $output->start_html("Мій словник");

    # Створює HTML із заголовком "Мій словник", print " \n";

    while (($count< $start) and ($line = )) ( $count++; )

    # Пропустити всі рядки перед початковою, while (($count< $start+10) and ($line ? )) ( print $line; $count++; )

    # Надрукувати ще 10 рядків.

    my $newnext = $start+10; my $newprev = $start-10;

    # Встановити початкові рядки для URL "Next" та "Previous",

    print "

    ";

    unless ($start == 0) ( # Включити URL "Previous", якщо тільки ви

    # вже не на початку.

    print qq%Previous%; )

    unless (eof) ( # Включити URL "Next", якщо ви # не в кінці файлу.

    print qq% Next%;

    }

    print «HTML;HTML

    exit(0); )

    # Якщо даних немає, почати спочатку,

    if (not $output->param) (

    &print_range(0); )

    # Інакше почати з рядка, вказаного у даних.

    &print_range($output->param("start"));

    У цьому вся прикладі запам'ятовування стану проводиться з допомогою найпростішого методу. Проблеми зі збереженням даних немає, оскільки ми тримаємо їх у файлі на сервері. Нам потрібно лише знати, звідки почати висновок, тому сценарій просто включає в URL початкову точку для наступної чи попередньої групи рядків – все, що необхідно для генерації чергової сторінки.

    Однак якщо вам потрібно щось більше, ніж можливість просто перегортати файл, то покладатися на URL буває обтяжливо. Полегшити цю труднощі можна через використання форми HTML і включення даних про стан в теги типу HIDDEN. Цей метод успішно використовується на багатьох сайтах, дозволяючи робити посилання між взаємопов'язаними CGI-програмами або розширюючи можливості використання однієї CGI-програми, як у попередньому прикладі. Замість посилання на певний об'єкт, такий як початкова сторінка, дані URL можуть вказувати на ID користувача, що автоматично генерується.

    Так працюють AltaVista та інші пошукові машини. При першому пошуку генерується ID користувача, який приховано включається до наступних URL-адрес. Із цим ID пов'язані один або кілька файлів, що містять результати запиту. В URL включаються ще дві величини: поточне положення у файлі результатів та напрямок, у якому ви хочете переміщатися в ньому далі. Ці три значення – все, що потрібно для роботи потужних систем навігації великих пошукових машин.

    Втім, бракує ще дечого. Файл, що використовувався в нашому прикладі /usr/diet/wordsдуже великий. Що, якщо на середині читання ми його покинемо, але захочемо повернутися до нього пізніше? Якщо не запам'ятати URL наступної сторінки, жодного способу повернутися назад немає, навіть AltaVista це не дозволить. Якщо ви перезавантажите свій комп'ютер або почнете працювати з іншим, неможливо повернутися до результатів попереднього пошуку, не вводячи заново запит. Однак таке довготривале запам'ятовування стану є основою персоналізації вебсайтів, про яку ми говорили вище, і варто подивитися, як ним можна скористатися. Приклад 9-5 є модифікованим варіантом прикладу 9-4.

    Приклад 9-5. Стійке запам'ятовування стану

    #!/usr/bin/perl -w

    use CGI;

    umask 0;

    Open(F,"/usr/dict/words") or die("Не можу відкрити! $!");

    Chdir("users") or die("He можу перейти в каталог $!");

    # Це каталог, де зберігатимуться всі дані

    # про користувача.

    Soutput = новий CGI;

    if (not$output->param) (

    print $output->header,

    $output->start_html("Мій словник");

    print «HTML;


    <р>Введіть своє ім'я користувача:


    HTML

    exit(0); )

    $user = $output->param("username");

    ## Якщо файлу користувача немає, створити його та встановити

    ## початкове значення "0",

    if (not -e "$user") (

    open (U, ">$user") or die("Не можу відкрити! $!");

    print U "0\n";

    close U;

    &print_range("0");

    ## якщо користувач існує і в URL не встановлено

    ## Початкове значення, прочитати останнє значення і почати з нього.

    ) elsif (not $output->param("start")) (

    Open(U,"Suser") or die("He можу відкрити користувача! $!");

    $start = ; close U;

    chomp $starl;

    uprint range($start);

    ## Якщо користувач існує і URL не вказано

    ## початкове значення, записати початкове значення

    ## у файл користувача та почати висновок.

    ) else (

    Open(U,">$user") or die("He можу відкрити користувача для запису! $!");

    print U $output->param("start"), "\n";

    close U;

    &print_range($output->param("start 1)); )

    sub print_range (

    my $start = shift;

    my $ count = 0;

    my $line = " "

    print $output->header,

    $output->start_html("Мій словник");

    print "

    \n"; 

    while (($count< $start) and ($line = )) ( $count++; )

    while (($count< $start+10) and ($line = ))

    print $line; $ count++;

    my $newnext = $start+10;

    my $newprev = $start-10;

    print "

    unless (Sstart == 0)

    {

    print

    qq%

    Previous%;

    }

    unless (eof) (print qq% Next%;

    # Зауважте, що ім'я користувача "username" додано до URL-адреси.

    # Інакше CGI забуде, з яким користувачем мав справу.

    }

    print $output->end_html;

    exit(0") ;

    }

    Заходи безпеки

    При роботі серверів Інтернет, будь вони серверами HTTP або іншого роду, дотримання заходів безпеки є найважливішою турботою. Обмін даними між клієнтом та сервером, що здійснюється в рамках

    CGI висуває ряд важливих проблем, пов'язаних із захистом даних. Сам протокол CGI досить захищений. CGI-програма отримує дані від сервера через стандартний пристрій введення або змінні оточення, і ці методи є безпечними. Але як тільки CGI-програма отримує керування даними, її дії нічим не обмежені. Погано написана програма CGI може дозволити зловмиснику отримати доступ до системи сервера. Розглянемо наступний приклад CGI-програми:

    #!/usr/bin/perl -w

    use CGI;

    my $output = новий CGI;

    my $username = $output»param("username");

    print $output->header, $output->start_html("Finger Output"),

    "

    ", "finger $username", "
    ", $output->end_html;

    Ця програма забезпечує діючий CGI-інтерфейс до команди finger.Якщо запустити програму просто як finger.cgi,вона виведе список всіх користувачів на сервері. Якщо запустити її як finger.cgi?username=fred,то вона виведе інформацію про користувача "fred" на сервері. Можна навіть запустити її як finger. oo.comдля виведення інформації про віддаленого користувача. Однак якщо запустити її як finger.cgi?username=fred; можуть статися небажані речі. Оператор зворотний штрих """ в Perl породжує процес оболонки і виконує команду, що повертає результат. У цій програмі " finger $username*використовується як простий спосіб виконати команду finger та отримати її результат. Однак більшість командних процесорів дозволяє об'єднувати в одному рядку кілька команд. Наприклад, будь-який процесор, подібний до процесора Борна, робить це за допомогою символу «; ». Тому"finger fred;mail запустить спочатку команду finger, апотім команду mail яка може надіслати повністю файл паролів сервера небажаному користувачеві.

    Одне з рішень полягає в синтаксичному аналізі даних від форми даних з метою пошуку зловмисного змісту. Можна, скажімо, шукати символ ";" і видаляти всі наступні символи. Можна зробити таку атаку неможливою, використовуючи альтернативні методи. Наведену вище CGI-програму можна переписати так:

    #!/usr/local/bin/perl -w

    use CGI;

    my $output = новий CGI;

    my $username = $output->param("username");

    $|++;

    # Вимкнути буферизацію з метою направлення всіх даних клієнту,

    print $output->header, $putput->start_html("Finger Output"), "

    \n"; 

    $pid = open(C_OUT, "-|");# Ця ідіома Perl породжує дочірній процес і відкриває

    # канал між батьківським та дочірнім процесами,

    if ($pid) (# Це батьківський процес.

    print ; ft Вивести вихідні дані дочірнього процесу.

    print "

    ", $output->end_html;

    exit(O); ft Завершити програму. )

    elsif (defined $pid) (# Це дочірній процес.

    $|++; # Вимкнути буферизацію.

    ехес("/usr/bin/finger",$username) або die("exec() call failed.");

    # Виконує програму finger з Susername як один єдиний
    аргументу командного рядка. ) else ( die("невдала спроба fork()"); )

    # Перевірка помилок.

    Як бачите, це не набагато складніша програма. Але якщо запустити її як finger.cgi?username=fred; то програма finger буде виконуватись з аргументом fred;mail як одним ім'ям користувача.

    Як додатковий захід безпеки цей сценарій запускає finger явно як /usr/bin/finger. У малоймовірному випадку, коли веб-сервер передає вашій програмі CGI незвичайний PATH, запуск просто finger може змусити виконатися не ту програму, яка потрібна. Ще один захід безпеки можна вжити, вивчивши змінну оточення PATH і переконавшись, що вона має прийнятне значення. Непогано видалити з PATH поточний робочий каталог, якщо тільки ви впевнені, що це не той випадок, коли дійсно потрібно виконати програму, що знаходиться в ньому.

    Інше важливе міркування щодо безпеки пов'язане з правами користувача. За промовчанням веб-сервер запускає програму CGI з правами користувача, який запустив сам сервер. Зазвичай це псевдокористувач, такий як nobody, що має обмежені права, тому у CGI-програми теж мало прав. Зазвичай це добре, бо якщо зловмисник зможе отримати доступ до сервера через CGI-програму, йому не вдасться завдати багато шкоди. Приклад програми, що краде паролі, показує, що можна зробити, але фактичний збиток для системи, як правило, обмежений.

    Проте робота як користувача з обмеженими правами обмежує можливості CGI. Якщо програмі CGI потрібно читати або записувати файли, вона може робити це тільки там, де вона має таку роздільну здатність. Наприклад, у другому прикладі запам'ятовування стану кожного користувача ведеться файл. CGI-програма повинна мати дозвіл на читання та запис у каталозі, що містить ці файли, не кажучи вже про самі файли. Це можна зробити, створивши каталог як того ж користувача, що і сервер, з правами читання та запису тільки для цього користувача. Однак для такого користувача, як nobody, тільки root має подібну можливість. Якщо ви не суперкористувач, то вам доведеться спілкуватися з адміністратором системи при кожній зміні в CGI.

    Інший спосіб - зробити каталог вільним для читання та запису, фактично знявши з нього будь-який захист. Оскільки із зовнішнього світу отримати доступ до цих файлів можна тільки через вашу програму, небезпека не така велика, як може здатися. Однак якщо у програмі виявиться дірка, віддалений користувач отримає повний доступ до всіх файлів, у тому числі можливість знищити їх. Крім того, законні користувачі, що працюють на сервері, також матимуть можливість змінювати ці файли. Якщо ви збираєтеся скористатися цим методом, то всі користувачі сервера повинні заслуговувати на довіру. Крім того, використовуйте відкритий каталог лише для файлів, які потрібні CGI-програмі; інакше кажучи, не ризикуйте зайві файли.

    Якщо це ваш перший звернення до CGI-програмування, подальше вивчення можна продовжити різними шляхами. З цього предмета написано десятки книг, багато з яких не припускають жодного знайомства з програмуванням. "CGI Programming on the World Wide Web"видавництва O"Reilly and Associates охоплює матеріал від простих сценаріїв різними мовами до дійсно разючих трюків і хитрощів. Загальнодоступна інформація є також удосталь у WWW. Непогано почати CGI Made Really Easy(Дійсно просто про CGI) за адресою http://www.jmarshall.com/easy/cgi/ .

    CGI та бази даних

    З початку епохи Інтернет бази даних взаємодіяли із розробкою World Wide Web. Насправді багато хто розглядає Web просто як одну гігантську базу даних мультимедійної інформації.

    Пошукові машини дають повсякденний приклад переваг баз даних. Пошукова машина не відправляється блукати по всьому Інтернету у пошуках ключових слів у той момент, коли ви їх запросили. Натомість розробники сайту за допомогою інших програм створюють гігантський покажчик, який є базою даних, звідки пошуковий механізм отримує записи. Бази даних зберігають інформацію у вигляді, який допускає швидку вибірку з довільним доступом.

    Завдяки своїй мінливості бази даних надають Web ще більшої сили: вони перетворюють її на потенційний інтерфейс для чого завгодно. Наприклад, системне адміністрування можна здійснювати віддалено через веб-інтерфейс замість вимоги реєстрації адміністратора у потрібній системі. Підключення баз даних до Web є основою нового рівня інтерактивності до Інтернету.

    Одна з причин підключення баз даних до Web регулярно дається взнаки: значна частина світової інформації вже знаходиться в базах даних. Бази даних, що існували до виникнення Web, називаються успадкованими (legacy) базами даних (на противагу непідключеним до Web баз даних, створеним нещодавно і які слід назвати «дурною ідеєю»). Багато корпорацій (і навіть приватних осіб) стоять зараз перед завданням забезпечення доступу до цих успадкованих баз даних через Web. Якщо тільки ваша успадкована база не є MySQL або mSQL, ця тема лежить за межами даної книги.

    Як сказано раніше, тільки ваша уява може обмежити можливості зв'язку між базами даних та Web. В даний час існують тисячі унікальних та корисних баз даних, що мають доступ із Web. Типи баз даних, що діють за межами цих програм, дуже різні. Деякі з них використовують CGI-програми як інтерфейс із сервером баз даних, таким як MySQL або mSQL. Ці типи представляють нам найбільший інтерес. Інші використовують комерційні програми для взаємодії з популярними настільними базами даних, такими як Microsoft Access та Claris FileMaker Pro. А інші просто працюють з плоскими текстовими файлами, що є найпростішими базами даних із усіх можливих.

    За допомогою цих трьох типів баз даних можна розробляти корисні веб-сайти будь-якого розміру та ступеня складності. Однією з наших завдань протягом кількох наступних розділів буде застосування мощі MySQL mSQL до Web з використанням CGI-програмування.

    Сторінка 1 з 30

    Сьогодні такі речі, як гостьова книга, пошук по серверу, форма для відправки повідомлень – невід'ємний атрибут практично будь-якого серйозного сайту. Проблема застосування цих та інших прибамбасів, зрозуміло, всіляко збуджує уяву веб-майстра-початківця, позбавляючи його сну, апетиту і тяги до пива. На жаль, вивчення HTML-вихідників сторінок конкурентів нічого, крім посилань на якийсь "cgi-bin", не дає, та ще й у телеконференціях іноді зустрічається згадка про якісь cgi-скрипти. Ця стаття і присвячена основам використання цих cgi-скриптів на славу і процвітання вашого сайту.

    Для початку, гадаю, треба розібратися з поняттями. CGI-скрипт - це програма, яка виконується на Web-сервері на запит клієнта (тобто відвідувача Web-сайту). Програма ця принципово нічим не відрізняється від звичайних програм, які встановлені на вашому комп'ютері - будь то MS Word або гра Quake. CGI - це не мова програмування, якою написаний скрипт, а Common Gateway Interface - спеціальний інтерфейс, за допомогою якого і відбувається запуск скрипту та взаємодія з ним.

    Короткий ліричний відступ щодо CGI

    Отже, що таке CGI- скрипти та взагалі подібні речі. Почнемо з того, що ваш браузер (коли ви набрали URL) з'єднується за протоколом HTTPіз зазначеним сервером і вимагає в нього потрібний файл, приблизно так:

    GET /~paaa/cgi-bin/guestbbok.cgi HTTP/1.0-Ось це найголовніше у запиті

    Ну і якщо запросений простий файл, наприклад .htmlто якщо такий файл є, то сервер відішле браузеру відповідь:

    HTTP/1.0 200 Okay
    Content-Type: text/html

    Далі після порожнього рядка (вона потрібна щоб відокремити Заголовоквід тіла) йде інформація із самого URL"а ...
    Ось у принципі і весь WWW....ходиш від посилання до посилання.
    А що якщо Потрібно внести в цей похмурий процес щось по справжньомуінтерактивне, динамічне, прекрасне та чудове ....? Що ж є відповідь і це питання. Просто що якщо у запитуваному URLвказати спеціальну програму ( CGI,програма Common Gateway Inteface - Спільного Шлюзового Інтерфейсу) і те, що ця прога видасть те і відправити браузеру .... Сервер запускає .cgiпрограму і вона наприклад обробивши дані форми заносить вас кудись у свою базу даних, а вам повідомить що ви великий молодець:)
    Ну, сподіваюся я вас заінтригував......?

    Короткі відомості про те, що треба знати, щоб писати CGIскрипти: Ну по-перше треба знати що таке інтернеті як він працює (а ви знаєте?) ;))) ) Ну і трохи вміння програмувати (це найголовніше)
    Давайте разом писанем якийсь простенький скриптик а потім я вам розповім де тут собака порився.
    Ну спочатку у своєму домашньому каталозі створіть директорію cgi-bin:

    cd public_html
    mkdir cgi-bin
    chmod 0777 cgi-bin

    Останній рядок буде дуже важливим.
    Візьміть редактор і наберіть: #!/usr/bin/perl
    #first.cgi
    print "Content-Type: text/html\n\n";
    print " ";
    print "

    Hello you!

    ";
    print "";

    Збережіть його в директорії cgi-binпід ім'ям first.cgi.Ну як зберегли?
    А тепер зробіть його виконуваним (адже це програма):

    chmod +x first.cgi

    Ну ось, підходимо до урочистого моменту .... наберіть у рядку браузера http://www.uic.nnov.ru/~твій_логін/cgi-bin/first.cgi
    і подивіться чо буде. Буде одне з двох, або скрипт запрацює і ви побачите згенеровану ним сторінку (вітаю, в нашому полку прибуло!) або Internal Server Error-Тоді не засмучуйтеся, ви щось зробили не так. Вам тоді стане в нагоді посібник з лову бліх. Ну по-перше перевірку синтаксису можна здійснити наступним чином:

    perl -з first.cgi

    Perl вам відразу видасть або повідомлення про помилки (ну буває, точку з комою пропустили, дужки або лапки забули закрити ...) це відразу по ходу справи можна виправити.
    Більш груба з логічного погляду це пропустити виведення порожнього рядка, який відокремлює заголовок від тіла:
    print "Content-Type: text/html\n\n"; #Все правильно
    print "Content-Type: text/html\n"; #ПОМИЛКА!

    Розберемо скрипт:
    Перший рядок #!/usr/bin/perlПросто вказує, де в системі розташований Perl. Друга це просто коментар - ви можете тикати чо завгодно після знака #
    Потім йде print "Content-Type: text/html\n\n";Це заголовок вказує тип вмісту все, що скрипт друкує у свій стандартний висновок STDOUT йде на обробку до сервера. Порожній рядок відокремлює заголовок від тіла, яке в нашому випадку є

    Hello you!



    Сервер обробить відповідь скрипта і основі його сформує і надішле браузеру відповідь.(Сервер зазвичай змінює тіла повідомлення,він лише доповнює заголовок необхідними протоколу HTTP полями)

    Ну ось ази вже освоєні, все не так важко і гнітюче як могло здатися вперше
    Ви тепер можете самі потренуватися в написанні таких простеньких скриптів щоб набити руку.

    Common Gateway Interface (CGI, рус. Загальний шлюзовий інтерфейс) - це стандартний метод динамічного керування вмістом веб-сторінок за допомогою спеціальних програм, що виконуються на стороні веб-сервера. Ці програми називаються CGI-обробники або шлюзи, але частіше – CGI-скрипти, т.к. зазвичай вони пишуться скриптовими мовами, в основному на Perl.

    Оскільки гіпертекст статичний за своєю природою, веб-сторінка не може безпосередньо взаємодіяти з користувачем. До появи JavaScript , не було іншої можливості відреагувати на дії користувача, крім передати введені ним дані на веб-сервер для подальшої обробки. У разі CGI ця обробка здійснюється за допомогою зовнішніх програм та скриптів, звернення до яких виконується через стандартизований (див. RFC 3875: CGI Version 1.1) інтерфейс – загальний шлюз. Спрощена модель, що ілюструє роботу CGI, наведена на рис. 1.

    Як працює CGI?

    Узагальнений алгоритм роботи через CGI можна подати у такому вигляді:

    1. Клієнт запитує CGI-додаток з його URI.
    2. Веб-сервер приймає запит та встановлює змінні оточення, через них додатку передаються дані та службова інформація.
    3. Веб-сервер перенаправляє запити через стандартний потік введення (stdin) на вхід програми, що викликається.
    4. CGI-додаток виконує всі необхідні операції та формує результати у вигляді HTML.
    5. Сформований гіпертекст повертається веб-сервер через стандартний потік виведення (stdout). Повідомлення про помилки надсилаються через stderr.
    6. Веб-сервер передає результати запиту клієнта.

    Області застосування CGI

    Найчастіше завдання, на вирішення якої застосовується CGI - створення інтерактивних сторінок, зміст яких залежить від дій користувача. Типовими прикладами таких веб-сторінок є форма реєстрації на сайті або форма для надсилання коментарів. Інша сфера застосування CGI, що залишається за лаштунками взаємодії з користувачем, пов'язана зі збором та обробкою інформації про клієнта: встановлення та читання «печенюшок»-cookies; отримання даних про браузер та операційну систему; підрахунок кількості відвідувань веб-сторінки; моніторинг веб-трафіку тощо.

    Ці можливості забезпечуються тим, що CGI-скрипт може бути підключений до бази даних або звертатися до файлової системи сервера. Таким чином, CGI-скрипт може зберігати інформацію в таблицях БД або файлах і отримувати її звідти на запит, чого не можна зробити засобами HTML.

    ЗВЕРНІТЬ УВАГУ: CGI - це не мова програмування! Це простий протокол, що дозволяє веб-серверу передавати дані через stdin та читати їх із stdout. Тому, як CGI-оброблювача може використовуватися будь-яка серверна програма, здатна працювати зі стандарними потоками вводу-виводу.

    Hello, world!

    Приклад простого CGI-скрипту на мові Perl наведено в лістингу 1. Якщо цей код зберегти у файлі з ім'ям hello (ім'я може бути будь-яким, розширення - теж), помістити файл у серверний каталог cgi-bin (точніше, у той каталог веб-сервера , який призначений для CGI-програм і вказаний в налаштуваннях веб-сервера) і встановити для цього файлу права на виконання (chmod uo+x hello), то він буде доступний за адресою виду http://servername/cgi-bin/hello.

    Лістинг 1. Приклад CGI-скрипту (Perl)

    #!/usr/bin/perl print "Content-type: text/html\n\n"; print< CGI say Hello

    Hello, world!

    HTML exit;

    У цьому коді рядок #!/usr/bin/perl вказує повний шлях до інтерпретатора Perl. Рядок Content-type: text/html\n\n - http-заголовок, що задає тип вмісту (mime-type). Подвоєний символ розриву рядка (\n\n) - обов'язковий, він відокремлює заголовки від тіла повідомлення.

    Змінні оточення

    Всі CGI-програми мають доступ до змінних оточення, які встановлюються веб-сервером. Ці змінні відіграють важливу роль під час написання CGI-програм. У таблиці перелічені деякі із змінних, доступних CGI.

    Змінне оточенняОпис
    CONTENT_TYPE Тип даних, які передаються на сервер. Використовується, коли клієнт надсилає дані, наприклад, завантажує файл.
    CONTENT_LENGTHРозмір вмісту запиту. Ця змінна визначена для запитів POST.
    HTTP_COOKIEПовертає набір «куків» як пар «ключ значення».
    HTTP_USER_AGENTІнформація про агента користувача (браузер)
    PATH_INFOШлях до каталогу CGI
    QUERY_STRINGРядок запиту (URL-encoded), що передається методом GET.
    REMOTE_ADDRIP-адреса клієнта, який виконує запит.
    REMOTE_HOSTПовне ім'я клієнта (FQDN). (Якщо є)
    REQUEST_METHODМетод, яким виконується запит. Найчастіше GET чи POST.
    SCRIPT_FILENAMEПовний шлях до скрипта, що запитується (у файловій системі сервера).
    SCRIPT_NAMEІм'я скрипту
    SERVER_NAMEІм'я сервера
    SERVER_ADDRIP-адреса сервера
    SERVER_SOFTWAREІнформація про серверне ПЗ

    У лістингу 2 наведено код невеликої програми Perl, що виводить список змінних оточення. Результат її роботи наведено на рис. 2.

    Лістинг 2. Змінні оточення

    #!/usr/bin/perl print "Content-type: text/html\n\n"; print " \n \n

    Environment

    \n"; foreach (sort keys %ENV) ( print " $_: $ENV($_)
    \n"; ) print "\n"; exit;

    Передача даних: метод GET

    Метод GET використовується для передачі urlencoded -даних через рядок запиту. Адреса запитуваного ресурсу (CGI-скрипта) і дані, що передаються йому, відокремлюються знаком «?». Приклад такої адреси:

    http://example.com/cgi-bin/script.cgi?key1=value1&key2=value2

    GET використовується за замовчуванням для даних, введених в адресний рядок браузера. Такий самий рядок може бути сформований при надсиланні даних із веб-форми (тег ), якщо метод передачі форми не указан. Вся інформація, що надсилається методом GET, передається у відкритому вигляді, тому ніколи не слід використовувати його для відправки на сервер паролів або іншої інформації. Метод GET має обмеження за розміром: рядок запиту має бути не довшим за 1024 символи.

    Інформація, що надсилається методом GET, передається в заголовку QUERY_STRING у вигляді рядка, що складається з пар виду ключ = значення, CGI-скрипт може отримати її через однойменну змінну оточення.

    Лістинг 3. Надсилання даних із веб-форми методом GET

    A simple CGI scripting: Sending data using GET-method You name: name="user">
    Where are you from?: name="from">

    Після введення даних у форму з лістингу 3 та натискання кнопки "Submit" буде сформовано рядок запиту виду:

    http://example.com/cgi-bin/ sayhello?user=sometext&from=anothertext

    де: sayhello – ім'я CGI-скрипту; user та from - імена параметрів; деякітекст і іншийтекст - введені користувачем значення відповідних параметрів.

    У лістингу 4 наведено приклад скрипту, який може обробити дані форми листингу 3.

    Лістинг 4. Надсилання даних з веб-форми методом GET

    #!/usr/bin/perl local ($buffer, @pairs, $pair, $name, $value, %FORM); # Аналізуємо оточення $ENV("REQUEST_METHOD") =~ tr/a-z/A-Z/; if ($ENV(" REQUEST_METHOD") eq " GET") ($buffer = $ENV(" QUERY_STRING"); ) # Розділяємо рядок запиту на пари виду ключ/значення @pairs = split(/&/, $buffer); foreach $pair (@pairs) ( ($name, $value) = split(/=/, $ pair), $value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM($name) = $value; Зберігаємо дані в масив) # Відправляємо заголовок print "Content-type: text/html\n\n"; # Відправляємо гіпертекст print< CGI say Hello

    Hello, $FORM(user) from $FORM(from)!

    HTML exit;

    Передача даних: метод POST

    У загальному випадку найбільш підходящим для передачі CGI-скрипту є метод POST. Блок даних формується так само, як і для методу GET, але безпосередньо передача здійснюється в тілі запиту. Дані надходять на вхід CGI-програми через стандартне введення (stdin).

    Для надсилання даних цим методом він повинен бути явно заданий в описі форми (action="POST").

    Для обробки вхідних даних CGI-скрипт повинен прочитати stdin, а щоб це правильно зробити, йому потрібно дізнатися розмір повідомлення зі змінної CONTENT_LENGTH. Для ілюстрації цього модифікуємо блок аналізу оточення в лістингу 4 замінивши його наступним кодом:

    ... # Аналізуємо оточення $ENV("REQUEST_METHOD") =~ tr/a-z/A-Z/; if ($ENV(" REQUEST_METHOD") eq " POST")(read( STDIN, $buffer, $ENV(" CONTENT_LENGTH"}); } ...

    Подальша обробка збережених у змінній $buffer параметрів та їх значень виконується так само, як і при використанні методу GET.

    Переваги CGI

    Багато можливостей CGI зараз дублюються такими технологіями, як DHTML , ActiveX або Java-аплетами. Основними перевагами використання серверних скриптів є те, що ви можете бути впевнені, що всі клієнти (за рідкісним винятком, зазвичай пов'язаним з блокуванням доступу до певних ресурсів на рівні файрвола) зможуть працювати з серверним додатком. Клієнтські програми можуть бути просто відключені в браузері, або зовсім не підтримуватися.

    Недоліки CGI

    Найбільшим недоліком цієї технології є підвищені вимоги до продуктивності веб-сервера. Справа в тому, що кожне звернення до CGI-додатку викликає породження нового процесу, з усіма накладними витратами, що звідси випливають. Якщо ж додаток написано з помилками, то можлива ситуація, коли він, наприклад, зациклиться. Браузер перерве з'єднання після закінчення тайм-ауту, але на серверній стороні процес триватиме доти, доки адміністратор не зніме його примусово. У цьому плані клієнтські скрипти мають істотну перевагу, т.к. вони виконуються локально.

    Іншим недоліком CGI є менша, в порівнянні з іншими рішеннями, захищеність веб-сервера. Неправильне налаштування прав доступу до серверних ресурсів із CGI-програми може поставити під загрозу не лише працездатність веб-сервера, а й інформаційну безпеку. Втім, будь-яку мережну технологію можна вважати потенційно небезпечною вже за визначенням.

    Постійна адреса цієї сторінки:

    Власникам інтернет-магазинів не з чуток знайоме поняття «електронна комерція», вони вже точно знають відповідь на питання «e-commerce - що це таке». Але якщо розібратися в суті, то спливає багато нюансів і цей термін набуває більш широкого значення.

    E-commerce: що таке?

    Загальне поняття звучить так: під електронною комерцією розуміється певний підхід до ведення бізнесу, що передбачає включення у собі низки операцій, використовують цифрову передачу даних під час надання товарів чи наданні послуг/робіт, зокрема з допомогою інтернету.

    Таким чином, це будь-яка комерційна угода, яка відбувається за допомогою електронного засобу зв'язку.

    Схема роботи влаштована так:

    • будь-який може бути блогер або будь-який інший власник власної інтернет-сторінки) реєструється в даній системі;
    • отримує власне посилання;
    • розміщує спеціальний код на своїй веб-сторінці – з'являється реклама обраного офіційного партнера e-Commerce Partners Network;
    • стежить за конверсією сайту;
    • заробляє певний відсоток за кожну покупку відвідувача свого сайту, який перейшов за партнерським посиланням.

    WP e-Commerce

    Багато людей зараз захоплені електронною комерцією, в першу чергу через бажання створити власний веб-сайт, унікальний інтернет-магазин для продажу власної продукції. Для задоволення цього попиту розробники сконцентрувалися на створенні e-commerce template (шаблонів електронної комерції). Що таке розглянемо далі.

    Одним із таких прикладів шаблонів є WordPress e-commerce. Це плагін кошика покупок для WordPress (одна з найвідоміших систем управління веб-ресурсом), призначається в першу чергу для створення та організації блогів). Надається абсолютно безкоштовно та дає можливість відвідувачам сайту здійснювати покупки на інтернет-сторінці.

    Іншими словами, цей плагін дозволяє створити інтернет-магазин (на базі WordPress). Плагін цієї електронної комерції має всі необхідні інструменти, налаштування та опції, що відповідають сучасним потребам.

    2005-2017, HOCHU.UA