Дбайливий catalog php. Каталог продукції (MySQL)

Реальні проекти на PHP та MySQL. Основа інтернет-торгівлі - реалізація купівельного візка

Частина 2. Онлайн-каталог товарів з розбивкою за категоріями

Серія контенту:

Цей контент є частиною # із серії # статей: Реальні проекти на PHP та MySQL. Основа інтернет-торгівлі - реалізація купівельного візка

https://www.?series_title_by=**auto**

Слідкуйте за виходом нових статей цієї серії.

При виборі користувачем однієї з категорій відкривається відповідна сторінка, яка генерується наступним кодом:

Сценарій починається з включення файлу book_sc_fns.php, що містить усі бібліотеки функцій цього додатку. Для початку роботи потрібно запустити сеанс, який має працювати для нормального функціонування купівельного візка. При цьому сеанс використовується кожною сторінкою сайту.

Функція get_categories() та display_categories()повертають масив категорій, що існують у системі, який потім передається у функцію display_categories($cat_array) . Опис усіх функцій виходить за межі цієї статті, але код найважливіших функцій представлений нижче за текстом разом з описом їх роботи. Інші функції добре прокоментовані та зрозумілі при найближчому розгляді.

function get_categories() ( // Епросити в базі даних список категорій $conn = db_connect(); $query = "select catid, catname from categories"; $result = @$conn->query($query); if (!$ result) return false; $num_cats = $result->num_rows;

Функція get_categories() підключається до бази даних і потім витягує звідти список ідентифікаторів та імен категорій. Функція db_result_to_array($result) приймає ідентифікатор результату з MySQL і повертає масив рядків з числовою індексацією, де кожен рядок є асоціативним масивом.

function db_result_to_array($result) ( $res_array = array(); for ($count = 0; $row = $result->fetch_assoc(); $count++) $res_array[$count] = $row; return $res_array; )

Потім цей масив повертається до сценарію index.php де передається на функцію display_categories($cat_array) .

function display_categories($cat_array) ( if (!is_array($cat_array)) ( echo "У заразнемає доступних категорій
"; return; ) echo "
    "; foreach ($cat_array as $row) ( $url = "show_cat.php?catid=".($row["catid"])); $title = $row["catname"]; echo "
  • "; do_html_url($url, $title); echo "
  • ";) echo "
"; echo"
"; }

Функція display_categories($cat_array) відображає масив категорій у вигляді списку посилань на категорії. При цьому вона перетворює кожну категорію бази даних на посилання. Причому всі посилання передаються в наступний сценарій show.cat.php, при цьому кожна з них має свій власний параметр - ідентифікатор catid (це унікальне число, яке згенеровано MySQL і служить для такої ідентифікації). Цей параметр визначає, яка категорія повинна відображатися в кінцевому підсумку.

Виведення списку книг для заданої категорії

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

Спочатку запускається сеанс за допомогою функції session_start(), потім за допомогою функції get_category_name($catid) ідентифікатор категорії, що передається, перетворюється в ім'я категорії.

unction get_category_name($catid) ( // Запитати в базі даних ім'я категорії для даного ідентифікатора категорії $catid = intval($catid); $conn = db_connect(); $result = $conn->query($query); if (!$result) return false; $result->num_rows; (); return $row->catname;

Бібліотека функцій, що відповідає за обробку логіки зберігання та отримання даних про книги, наведена нижче. Тут же представлена ​​функція function get_books($catid).

query($query); if (!$result) return false; $num_cats = $result->num_rows; if ($num_cats == 0) return false; $result = db_result_to_array($result); return $result; ) function get_category_name($catid) ( // Запитати в базі даних ім'я категорії для даного ідентифікатора категорії $catid = intval($catid); $conn = db_connect(); ; $result = $conn->query($query); if (!$result) return false; fetch_object(); return $row->catname; ) function get_books($catid) ( // Виконує запит до бази даних певної категорії if (!$catid || $catid=="") return false; $conn = db_connect (); $query = "select * from books where catid="$catid""; >num_rows; if ($num_books ==0) return false; $result = db_result_to_array($result); return $result; isbn || $isbn=="") return false; $conn = db_connect(); $result = @$conn->query($query); if (!$result) return false; $result = @$result->fetch_assoc(); return $result; ) function calculate_price($cart) ( // Обчислює загальну вартість всіх елементів візка $price = 0.0; if(is_array($cart)) ( $conn = db_connect(); foreach($cart as $isbn => $qty) ( $query = "select price from books where isbn="$isbn""; $result = $conn->query($query); $item->price; $price +=$item_price*$qty; ) ) return $price; )) ( $items=array_sum($cart); ) return $items; ) ?>

Обидві функції get_books() та display_books() схожі на їх практичні аналоги get_categories() та display_categories(). Основна відмінність між ними полягає в тому, що у разі використання цих функцій інформація отримується з таблиць книг, а не категорій. Функція display_books() створює посилання на кожну книгу цієї категорії, використовуючи при цьому сценарій, що відображає книги певних категорій (розглянуто вище). При цьому, як і раніше, кожне посилання супроводжується параметром як суфікса. Цей суфікс цього разу є номером ISBN конкретної книги. Наприкінці фрагмента цього сценарію міститься код для відображення додаткових функціональних можливостей. Вони з'являються на сторінці в тому випадку, якщо в систему входить адміністратор і є інструментами адміністрування – додаванням та видаленням книг, категорій тощо.

Функція display_books($book_array) має вигляд:

function display_books($book_array) ( // Виводить всі книги, передані в масиві if (!is_array($book_array)) ( echo "
На даний момент немає доступних книг у цій категорії
"; ) else ( // Створити таблицю echo " // Створити рядок таблиці для кожної книги foreach ($book_array as $row) ($url = "show_book.php?isbn=".($row["isbn"]); echo " ";) echo "
"; if (@file_exists("images/".$row["isbn"].".jpg")) ( $title = " "; do_html_url($url, $title); ) else ( echo " "; ) echo ""; $title = $row["title"]." by ".$row["author"]; do_html_url($url, $title); echo "
";) echo "
"; }

Сценарій, що показує інформацію про конкретну книгу

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

З самого початку, як і в інших сценаріях, запускається сеанс, а потім за допомогою рядка:

$book = get_book_details($book);

з бази даних витягується інформація про конкретну книгу. Для виведення даних у HTML форматі використовується наступна форма виклику:

display_book_details($book);

Функція display_book_details($book) шукає файл зображення для книги, ім'я якого виглядає як images/$isbn.jpg. Якщо такого файлу немає, то зображення не виводиться взагалі. Решта сценарію встановлює засоби навігації за наявним функціоналом. Простому користувачеві пропонується використовувати кнопку Continue Shopping (продовжити покупки), яка повертає його на вихідну сторінку категорій. Крім цього, пропонується кнопка "Add to Cart" (додати в візок) для додавання книг у візок. У тому випадку, коли користувач, що увійшов до системи, має права адміністратора, йому пропонується дещо інші, розширені опції для адміністрування.

Висновки

У статті на реальних прикладах розглянуто питання реалізації онлайн-каталогу товарів під проект інтернет-магазину засобами PHP, MySQL та веб-сервера Apache. Докладно розглянуто макет єдиної торгової системи, що дозволяє обслуговувати клієнтів як онлайн.

Послідовно викладено механізми роботи скриптів, що генерують стартову сторінку інтернет-магазину з категоріями та книгами, відсортованими за категоріями. Показано роботу функцій, що підтримують описану логіку роботи скриптів. При цьому всі функції зібрані у відповідні бібліотеки, і їхня робота наочно представлена ​​в IDE EasyEclipse для LAMP на наведених малюнках. Чітка організація коду та пояснення до нього дають можливість легко підтримувати працюючі програми, видозмінювати їх і за необхідності переносити на будь-які інші платформи.

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

Ми з Вами вже. І тепер я вирішив торкнутися теми роботи з каталогами в PHP. У цій статті Ви навчитеся створювати каталоги в PHP, видаляти їх та зчитувати з них файли та підкаталоги.

Почнемо з найпростішого: створення каталогу в PHP:

mkdir("new_dir");
?>

Після запуску цього скрипту у Вас буде створено порожній каталог new_dir".

Видалити пустий каталог дуже просто. Для цього використовується функція rmdir().

rmdir("new_dir");
?>

А ось тепер перейдемо до роботі з вмістом каталогів через PHP. Тут є дуже прості правила, які необхідно дотримуватися. Всі ці правила дуже логічні, і Ви їх застосовуєте, коли переглядаєте вміст каталогів вручну:

  1. Відкрити каталог.
  2. Вважати вміст.
  3. Закрити каталог.

Щоб не мучити Вас в очікуваннях, одразу наведу код, який виводить імена файлів та категорій усередині заданого каталогу:

$dir = opendir("images");
while (($f = readdir($dir)) !== false)
echo $f."
";
closedir($dir);
?>

В результаті Ви побачите список усіх файлів та каталогів усередині каталогу " images". Також Ви побачите два цікаві імені" . "і" .. ". Перший означає " поточний каталог", а" .. - батьківський.

Тепер докладно про функції, що використовуються у цьому прикладі:

  • Функція opendir(string $path)- відкриває каталог, що знаходиться по дорозі $ path, і навіть повертає дескриптор, необхідний роботи з цим каталогом.
  • Функція readdir(resource $dir)- зчитує поточний елемент у каталозі dir. Поточний елемент задається вказівником, який зсувається під час кожного виклику. Тому виходить, що ця функція щоразу повертає новий елемент з каталогу. Коли всі елементи закінчилися, то функція readdir()повертає false.
  • Функція closedir(resource $dir)- закриває каталог dir.

Це все найважливіші функції для роботи з каталогами у PHP. Проте хочеться додати ще одну дуже важливу деталь з приводу функції rmdir()яка видаляє каталог. Якщо Ви уважно читали, я написав, що ця функція видаляє " порожній каталог", тобто в якому немає жодного файлу та каталогу (крім " . "і" .. "). Іншими словами, якщо в каталозі буде хоча б один файл, то функція rmdir() не спрацює. Ось як вирішити цю проблему Ви дізнаєтесь у наступній статті, тому підписуйтесь на оновлення, щоб не пропустити її появу.

Що це таке?

Це званий віртуальний магазин, тобто. прайс лист певної організації з найменуванням товарів, частину з яких можна ПОМІТИТИ і занести в кошик, щоб надалі можна було заповнити анкету (ПІБ, адреса і т.д.) для купівлі цих товарів. Все простіше простого. Дізана немає ніякого, лише "скелет".

Вимоги: де ЦЕ працюватиме?

На win/unix в PHP версіїне нижче 4.0 з підтримкою сесій. Включені cookies від відвідувачів не потрібно. Потрібно лише правильно налаштувати деякі опції PHP, щоб програма отримала доступ до сесій (буде написано нижче).

А чому розмір файлу 10Кб, а чи не 5Кб?

Якщо викинути всі коментарі, от і буде 5 кб:-) Програма (без коментарів) була написана за 3 години у присутності людини, яка вивчає ПХП. Коментарі, насправді були, але тільки усні:-)

Підготовка сервера

1. Можливий глюк: у вас не налаштований тимчасовий каталог на сервері для розміщення тимчасових файлів.

2. Програма передбачає, що PHP помістить у змінну $SID номер сеансу. За умовчанням, можливо, цього не станеться.

Для вирішення проблеми 1) та 2) пунктів треба змінити опції PHP. Це можна зробити у php.ini чи файлах httpd.conf/.htaccess.

Варіант 1 - php.ini

    Якщо редагувати php.ini, то в ньому вже є ті змінні, що треба змінити
    • шукаємо рядок session.save_pathі пишемо шлях до свого тимчасового каталогу. У цей каталог Apache/PHP будуть писати свої файли, слід. для них там має бути доступ. Якщо у вас Unix, то пишемо /tmp, якщо Windows, то \temp(не забудьте створити C:\TEMP або X:\TEMP, дивлячись де знаходиться Апач)
    • шукаємо рядок session.nameта замінюємо на SID(великими літерами)

Варіант 2 - .htaccessабо httpd.conf

    Якщо вносити ті самі зміни у вказані файли, треба написати так:

    • варіант для unix: php_value session.save_path /tmp і для windows: php_value session.save_path \temp
    • та ім'я сесії: php_value session.name SID

Отже, нам треба для 1) та 2) пунктів підправити змінні PHP-процесори: session.save_path (тимчасовий каталог) та session.name (привласнити значення "SID").

Налаштування каталогу

  • створити файл shop.txt. Якщо ви захочете додати нові колонки, то не забудьте, що першою кононкою повинні йти ID товарів (наприклад, числа від 1 до..), а останньою - ціна товару. Розділювач товарів - слєш ( \ ).
  • створити файл shop.phtml (ім'я не є принципово), код програми наведено нижче.

Текст програми

". "// передаємо сесію // малюємо заголовок таблиці з кошиком: ". "// проходимо масив $t за списком його ключів $k=@array_keys($t); for ($i=0; $i ". "". "". ""; ) // внизу таблиці дві кнопки: // Зміни - зберегти зміну числа товарів та оновити сторінку // Замовлення - сорх. вим. + перейти на сторінку оформлення замовлення echo "
$ogl$oglукоманди
($t[$id])($t[$id])видалити
". "Виводить на екран таблицю з товарами. У таблиці автоматично генерується нова колонка з checkbox асами, відзначивши які і натиснувши "додавши", можна занести товари в кошик. */ function price() ( global $t, $PHP_SELF,$SID; $f=file("./shop.txt") or die("файл не знайдений"); // читаємо файл $ogl=explode(" \\",$f); // з нього беремо обігрів $x=count($ogl); // обчислюємо число колонок $y=count($f); // і число рядків // форма (не забуваємо вписати $ SID) + початок таблиці: echo "
". "// малюємо заголовок таблиці, назви колонок - перший рядок файлу shop.txt echo " "; for ($j=0; $j<$x; $j++) { if (strlen($ogl[$j])==0) echo ""; else echo " "/) // малюємо останню колонку, де будуть checkbox"и echo " // основний цикл виведення прайсу for ($i=1; $i<$y; $i++) { $a=explode("\\",$f[$i]); // читаем очередную строку файла if (count($a)<2) continue; // если она пустая (глюки), пропускаем echo "// цикл виведення всіх колонок поточного рядка таблиці for ($j=0; $j<$x; $j++) { // если ячейка пустая, там надо поместить " "; if (strlen($a[$j])==0) echo ""; else echo " " ) // малюємо цей checkbox в останній колонці поточного рядка echo " ";) echo "
$ogl[$j]x
$a[$j]

"; ) /* Виводить на екран кілька чисел (написано). Підрахунок значень відбувається при каджому виклику. */ function summa() ( global $t; // традиційний прохід масиву товарів із кошика $k=@array_keys($t); for ($i=0; $i ",$summ); ) /* Оголошення змінної post, яка містить поля для заповнення відвідувачем при оформленні замовлення. Оскільки цей список використовується 2 рази, то описано це саме тут, а не нижче. */ $post=array( "назва організації", "П.І.Б. посадової особи", "посада", "ІПН організації", "місцезнаходження організації", "контактний телефон", "e-mail"); ************************************************** ********************/ // основний код програми // $c - основна змінна, що вказує на необхідну дію if (!isset($c)) $c= ""; switch($c) ( case "": // без параметрів - малюємо прайс-лист summa(); // статистика по кошику price(); // прайс // посилання для переходу на кошик echo "
  • Кошик покупок"; break; case "korzina": // виведення кошика summa(); // див. вище korzina(); // малюємо таблицю кошика // пишемо 2 посилання echo "
  • Каталог товарів"; echo "
  • Очистити кошик (обережно!)"; break; case "add": // додавання з форми прайсу всіх товарів // у масиві $v накопичені номери рядків товарів, які функція... $k=@array_keys($v); for ($i=0; $i ". "". ""; for ($i=0; $i ";) echo "
    $post[$i]
    "; break; case "post": // генеруємо та відправляємо анкету відвідувача, де вказані дані відвідувача // та список товарів з кошика $msg="Анкета відвідувача:\n\n"; for ($i=0; $i

    Ваше замовлення надіслано!
    Дякую за покупку!



    ">сторінка сервера

    ?Прайс-лист
    У змінній $msg зберігається анкета відвідувача, з якої можна зробити все, що завгодно (надіслати милом, записати в лог-файл, вивести на екран):