[ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ]



Ответов: 0
25-02-12 07:01







   Web - программирование
PHP


ASP






XML



CSS

SSI





   Программирование под ОС











   Web - технологии








   Базы Данных









   Графика






Данные




Web - программирование / PHP /

Интернет-магазин на PHP

Автор: Дмитрий Бородин
Источник: http://php.spb.ru/

Это так называемый виртуальный магазин, т.е. прайс лист некой организации с наименованием товаров, часть из которых можно пометить и занести в корзину, чтобы в дальнейшем можно было заполнить анкету (ФИО, адрес и т.д.) для покупки этих товаров. Дизайна нет никакого, только код т.е. алгоритм работы.

Требования: где ЭТО будет работать?

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

Возможные проблемы:

  • Возможный глюк: у Вас не настроен временный каталог на сервере для размещения временных файлов.
  • Программа подразумевает, что PHP поместит в переменную $SID номер сесии. По умолчанию, возможно, этого не произойдет.

    Для решения вышеуказанных проблем, необходимо изменить опции PHP. Это можно сделать в php.ini или файлах httpd.conf/.htaccess

    Изменение php.ini:

    Если корректировать php.ini, следует учесть, что в нем уже есть те переменные, которые необходимо изменить.

  • ищем строку session.save_path и пишем путь к своему временному каталогу. В этот каталог Apache/PHP будут писать свои файлы, следовательно для них там должен быть доступ. Если у вас Unix, то пишем /tmp, если Windows, то emp (не забудьте создать C:TEMP или X:TEMP, смотря где находится Apache)
  • ищем строку session.name и заменяем на SID (все большими буквами).

    Второй вариант:.htaccess или httpd.conf

    Если вносить те же измения в указанные файлы, то следует написать так:

  • вариант для unix: php_value session.save_path /tmp и для windows: php_value session.save_path emp
  • и имя сессии: php_value session.name SID

    Настройка каталога.

  • создать файл shop.txt. по образцу. Если Вы захотите добавить новые колонки, то не забудьте, что первой колонкой должны идти ID товаров (например числа от 1 до ..), а последней - цена товара. Разделитель товаров - слеш ().
  • создать файл shop.phtml (имя не принципиально), код программы приведен ниже.

    Код скрипта:

    <?php

    // символы "<?" должны быть первыми(!) в файле. Т.е. ни пустых строк, ни
    // пробелов до символов "<?" ставить нельзя, иначе не будет работать
    // header - появятся warning'и

    unset($t);
    session_start();


    /*
       функция прибавляет в корзину новый товар, где $n - это номер строки
       в shop.txt. Далее, в сессиях сохраняется не номер строки, а число ID
       из shop.txt и используется повсеместно. Если товар уже существует,
       то корзина никак не меняется.
    */
    function tadd($n) {
       global
    $t;

       
    // открыли файл
       
    $f=file("./shop.txt") or die("файл не найден");
       
    // и получили нужную строку с товаром (в массив $o)
       
    $o=explode("\",$f[$n]);

       
    $id=$o[0];
       if (isset(
    $t[all][$id])) return; // если товар уже в корзине - выход

       
    $t[all][$id]=$id;    // флаг, благодаря которому, двумя строчками выше
    // мы определили, что товар уже есть в корзине
       
    $t[$id][name]=$o[1]; // наименование
       
    $t[$id][info]=$o[2]; // инфо
       
    $t[$id][cena]=$o[3]; // и д.р. не значащие данные
       
    $t[$id][kol]=1;      // кол-во в начале равно "1 штуке"

       
    session_register("t"); // записали переменную в сессию
    }


    /*
       Рисует таблицу с товарами в корзине. Из файла shop.txt мы читаем только
       названия колонок и не более. Названия товара (в данном случае только
       название/цена/кол-во) берется из сессии.
    */
    function korzina() {
       global
    $t,$PHP_SELF,$SID;

       
    $f=file("./shop.txt") or die("файл не найден");
       
    $ogl=explode("\",$f[0]);

       echo
    "<form action="http://php.spb.ru/php/%24PHP_SELF" method=POST>".
    "<input type=hidden name=SID value='$SID'>". // передаем сесиию
    "<input type=hidden name=c value=kolvo>".
       
    // рисуем заголовок таблицы с корзиной:
    "<table border=2><tR><td>$ogl[1]</td></td><td>$ogl[3]</td>".
    "<td>кол-во</td><td>команды</td></tr>";

       
    // проходим массив $t[all] по списку его ключей
       
    $k=@array_keys($t[all]);
       for (
    $i=0; $i<count($k); $i++) {
    $id=$k[$i];
          echo
    "<tr><td>{$t[$id][name]}</td>".
    "<td>{$t[$id][cena]}</td>".
    "<td><input size=4 type=text name=v[$id] value={$t[$id][kol]}></td>".
    "<td><a href="javascript:if(confirm('http://php.spb.ru/php/$PHP_SELF?c=del&id=$id&SID=$SID  \n\nThis file was not retrieved by Teleport Pro, because the server reports that this file cannot be found.  \n\nDo you want to open it from the server?'))window.location='http://php.spb.ru/php/%24PHP_SELF?c=del&id=$id&SID=$SID'" tppabs="http://php.spb.ru/php/%24PHP_SELF?c=del&id=$id&SID=$SID">удалить</a></td></tr>";
       
    }

       
    // внизу таблицы две кнопки:
    //   Измениения - сохранить изменение числа товаров и обновить страницу
       //   Заказ - сорх. изм. + перейти на страницу оформления заказа
       
    echo "</table><input type=submit name=edit value='Внести изменения'>    ".
    "<input type=submit name=zakaz value='Оформить заказ'></form>";
    }


    /*
       Выводит на экран таблицу с товарами. В таблице автоматом генериться новая
       колонка с checkbox'асами, отметив которые и нажав "добавив", можно
       занести товары в корзину.
    */
    function price() {
       global
    $t, $PHP_SELF,$SID;

       
    $f=file("./shop.txt") or die("файл не найден"); // читаем файл
       
    $ogl=explode("\",$f[0]); // из него берем огравление
       
    $x=count($ogl); // вычисляем число колонок
       
    $y=count($f);   //         и число строк
       // форма (не забываем вписать $SID) + начало таблицы:
       
    echo "<form action="http://php.spb.ru/php/%24PHP_SELF" method=POST><input type=hidden name=c value=add>".
    "<input type=hidden name=SID value='$SID'><table border=2>";

       
    // рисуем заголовок таблицы, названия колонок - первая строка файла shop.txt
       
    echo "<tr>";
       for (
    $j=0; $j<$x; $j++) {
          if (
    strlen($ogl[$j])==0) echo "<tD> </td>";
          else echo
    "<td>$ogl[$j]</td>";
       }
       
    // рисуем последнюю колонку, где будут checkbox'ы
       
    echo "<td>x</td></tr>";

       
    // основной цикл вывода прайса
       
    for ($i=1; $i<$y; $i++) {

    $a=explode("\",$f[$i]); // читаем очередную строку файла
    if (count($a)<2) continue; // если она пустая (глюки), пропускаем
    echo "<tr>";
    // цикл вывода всех колонок текущей строки таблицы

    for ($j=0; $j<$x; $j++) {
    // если ячейка пустая, там надо поместить " ";
    if (strlen($a[$j])==0) echo "<tD> </td>";
    else echo
    "<td>$a[$j]</td>";
          }

    // рисуем тот самый checkbox в последней колонке текущей строки
    echo "<td><input type=checkbox name=v[$i] value=$i></td></tr>";
       }

       echo
    "</table><br><center><input type=submit value='Добавить ".
    "отмеченные товары в корзину'></center></form>";
    }


    /*
       Выводит на экран несколько чисел (написано). Подсчет значений происходит
       при каджом вызове.
    */
    function summa() {
       global
    $t;
       
    // традиционный проход массива товаров из корзины
       
    $k=@array_keys($t[all]);
       for (
    $i=0; $i<count($k); $i++) {
    $id=$k[$i];
    // если убрать (double), то копейки округляться
    $summ+=(double)$t[$id][kol]*(double)$t[$id][cena];
    $summ2+=$t[$id][kol];
       }
       
    // просто выводим посчитанные цифры на экран
       
    echo "Корзина: наименований товаров - $i (в кол-ве $summ2 шт), цена -  ".sprintf("%.2f руб.<br>",$summ);
    }

    /*
       Объявление переменной post, которая содержит поля для заполнения
       посетителем при оформление заказа. Т.к. этот список используется
       2 раза, то описано это именно тут, а не ниже.
    */
       
    $post=array(
    "название организации",
    "Ф.И.О. должностного лица",
    "должность",
    "ИНН организации",
    "местонахождение организации",
    "контактный телефон",
    "e-mail");

    /*****************************************************************************/
    // основной код программы

    // $c - основная переменная, указывающая на нужное действие
    if (!isset($c)) $c='';

    switch(
    $c) {

    case
    "":
    // без параметров - рисуем прайс-лист

       
    summa(); // статистика по корзине
       
    price(); // прайс
       // ссылка для перехода на корзину
       
    echo "<li><a href="javascript:if(confirm('http://php.spb.ru/php/$PHP_SELF?c=korzina&SID=$SID  \n\nThis file was not retrieved by Teleport Pro, because the server reports that this file cannot be found.  \n\nDo you want to open it from the server?'))window.location='http://php.spb.ru/php/%24PHP_SELF?c=korzina&SID=$SID'" tppabs="http://php.spb.ru/php/%24PHP_SELF?c=korzina&SID=$SID">Корзина покупок</a>";
       
    break;

    case
    "korzina":
    // вывод корзины

       
    summa(); // см. выше
       
    korzina(); // рисуем таблицу корзины
       // пишем 2 ссылки
       
    echo "<li><a href="javascript:if(confirm('http://php.spb.ru/php/$PHP_SELF?SID=$SID  \n\nThis file was not retrieved by Teleport Pro, because the server reports that this file cannot be found.  \n\nDo you want to open it from the server?'))window.location='http://php.spb.ru/php/%24PHP_SELF?SID=$SID'" tppabs="http://php.spb.ru/php/%24PHP_SELF?SID=$SID">Каталог товаров</a>";
       
    echo "<li><a href="javascript:if(confirm('http://php.spb.ru/php/$PHP_SELF?c=delete&SID=$SID  \n\nThis file was not retrieved by Teleport Pro, because the server reports that this file cannot be found.  \n\nDo you want to open it from the server?'))window.location='http://php.spb.ru/php/%24PHP_SELF?c=delete&SID=$SID'" tppabs="http://php.spb.ru/php/%24PHP_SELF?c=delete&SID=$SID">Очистить корзину (осторожно!)</a>";

       
    break;

    case
    "add":
    // добавление из формы прайса всех товаров

       // в массиве $v скоплены номера строк товаров, которые функция ...
       
    $k=@array_keys($v);
       for (
    $i=0; $i<count($k); $i++) {
    // ... tadd() преобразует из файла в данные и поместит в сессии
    tadd($v[$k[$i]]);
       }
       
    // надо перенаправить браузер на приличный адрес, чтобы:
       // 1) в URL был написан приличный адрес
       // 2) чтобы не было глюка, если посетитель нажмет ОБНОВИТЬ СТРАНИЦУ
       
    exit(header("Location: $PHP_SELF?c=korzina&SID=$SID"));
       
    // Ну, а то, что header засунуто в exit... Это просто фича такая :-)
       
    break;


    case
    "kolvo":
    // измение кол-ва товаров, когда а странице КОРЗИНА нажимают СОХРАНИТЬ
    // ИЗМЕНЕНИЯ или ОФОРМИТЬ ЗАКАЗ..
    // Оцените, насколько короткий код преобразования корзины

       
    $k=@array_keys($v);
       for (
    $i=0; $i<count($k); $i++) {
    $t[$k[$i]][kol]=abs(intval($v[$k[$i]]));
       }
       
    // после изменения переенной сессии ее нужно записать
       
    session_register("t");

       
    // Далее важная проверка. Если посетитель нажимает кнопку СОХРАНИТЬ, то
       // у нас устанавливается переменная $edit, которая содержит строку
       // "Сохранить изменения". Если он нажимает ЗАКАЗ, то устанавливается
       // $post. Устанавливается только одна из этих твух переменных.

       // если это было ИЗМЕНИТЬ, то переправить на корзину
       
    if (isset($edit)) exit(header("Location: $PHP_SELF?c=korzina&SID=$SID"));
       
    // иначе переправить на страницу с офрмлением заказа
       
    exit(header("Location: $PHP_SELF?c=zakaz&SID=$SID"));
       break;

    case
    "del":
    // удаление товара по его $id

       
    $id=intval($id);
       unset(
    $t[$id]);
       unset(
    $t[all][$id]);
       
    session_register("t");
       exit(
    header("Location: $PHP_SELF?c=korzina&SID=$SID"));
       break;


    case
    "delete":
    // удаление всей корзины.. Как и в пред. пункте, только с проходом
    // массива id товаров

       
    $k=@array_keys($t[all]);
       for (
    $i=0; $i<count($k); $i++) {
          unset(
    $t[$k[$i]]);
          unset(
    $t[all][$k[$i]]);
       }
       
    session_register("t");
       exit(
    header("Location: $PHP_SELF?c=korzina&SID=$SID"));


    case
    "zakaz":
    // форма для оформления заказа

       
    echo "<form action="http://php.spb.ru/php/%24PHP_SELF" method=post><input type=hidden name=c value=post>".
    "<input type=hidden name=SID value='$SID'>".
    "<table border=1>";
       for (
    $i=0; $i<count($post); $i++) {
          echo
    "<tr><td>$post[$i]</td><td><input type=text size=40 name='v[$i]'></td></tr>";
       }
       echo
    "</table><input type=submit value='Отправить заказ'></form>";
       break;


    case
    "post":
    // генерим и отправляем анкету посетителя, где указаны данные посетителя
    // и список товаров из корзины

       
    $msg="Анкета посетителя:\n\n";
       for (
    $i=0; $i<count($post); $i++) {
    $msg.="$post[$i]: ".substr($v[$i],0,500)."\n";
       }
       
    $msg.="\nСписок покупок:\n\n";
       
    $k=@array_keys($t[all]);
       for (
    $i=0; $i<count($k); $i++) {
    $id=$k[$i];
    $msg.=($i+1).") {$t[$id][name]} \ ".doubleval($t[$id][cena])." руб \ {$t[$id][kol]} шт. \ = ".
    sprintf("%.2f",$t[$id][cena]*$t[$id][kol])." руб\n";
       }

       print <<< end
    <table width=100% height=95%><tr><td align=center>
    <h2>Ваш заказ отправлен!<br>
    Спасибо за покупку!</h2>
    <hr width=60%><br>
    <a href="http://php.spb.ru/?=SID">страница сервера</a><br><br>
    <a href="http://php.spb.ru/php/$PHP_SELF?=SID">прайс-лист</a>
    </td></tr></table>
    end;
    <?
    }
    ?>

    В переменной $msg хранится анкета посетителя, с которой можно сделать все, что угодно (послать на e-mail, записать в лог-файл, вывести на экран):

    <? echo $msg; ?>



  • Комментарии

     Ваш комментарий к данному материалу будет интересен нам и нашим читателям!



    Последние статьи: Web - программирование / PHP /

    GTK+: перспективы развития
    02-03-2010   

    Библиотека GTK+ прошла долгий путь развития и сейчас очень популярна. GNOME, одна из ведущих оконных сред, использует GTK+ почти исключительно, GIMP построен на GTK+, множество коммерческих разработчиков ПО, таких как Abobe, NVidia и VMware, решили использовать эту библиотеку в качестве графической основы для своих продуктов... подробнее

    Кол. просмотров: общее - 4302 сегодня - 0

    Новостной портал
    13-11-2009   

    Slashdot.org – популярный новостной портал с посещаемостью 50 млн. человек в месяц. Авторы проекта добились такого успеха, предоставляя пользователям свежие и интересные новости из мира IT... подробнее

    Кол. просмотров: общее - 4148 сегодня - 1

    Параллельное выполнение скриптов может нарушить целостность информации в файлах
    13-11-2009   

    Здесь рассматривается вопрос, что бывает, если запустить некий скрипт почти одновременно (что происходит, например, при большой нагруженности сервера) несколько раз, т.е. запустить несколько копий одного и того же скрипта. И к чему это может привести... подробнее

    Кол. просмотров: общее - 3998 сегодня - 2

    No spam.php
    10-11-2009   

    ...и снова о спаме. Кто о нем только не писал, и все писали, что это плохо и ай-яй-яй. Я не буду оригинальничать, и тоже скажу – это плохо. Это ай-яй-яй. Как бороться со спамерами со своей стороны... подробнее

    Кол. просмотров: общее - 4038 сегодня - 2

    Начинаем работу с рисунками в php для Windows
    10-11-2009   

    Эта статья даст вам общее представление о том, как создавать, обрабатывать и выводить рисунки в PHP4 для Windows... подробнее

    Кол. просмотров: общее - 4022 сегодня - 1



      WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects