09
Ноя

Пишем скрипт Каталог товаров на Php и MySql, Часть #4

Четвёртая статья цикла "Пишем скрипт Каталог товаров": Back_Office: работа с товаром.
Сегодня мы научим нашу программу работать с товаром.
Для этого в начале нужно сделать таблицу в базе данных.
Импортируем следующий код:
CREATE TABLE 'item' (
  'id' int(11) NOT NULL auto_increment,
  'id_category' int(11) NOT NULL default '0',
  'title' varchar(255) NOT NULL default '',
  'description' text NOT NULL,
  'price' int(11) NOT NULL default '0',
  'hits' int(11) NOT NULL default '0',
  'money_type' enum('D','E','R','G') NOT NULL default 'R',
  'print_to_index' enum('yes','no') NOT NULL default 'yes',
  PRIMARY KEY  ('id')
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 PACK_KEYS=0 CHECKSUM=1 AUTO_INCREMENT=1 ;


И пропишем правила для ЧПУ в файле .htaccess:
### работа с товаром каталога ###
RewriteRule ^admin/cat/([0-9]+)/?$ sadmin.php?action=cat&id_cat=$1
RewriteRule ^admin/cat/add_item/?$ sadmin.php?action=cat&op=add_item
RewriteRule ^admin/cat/([0-9]+)/page/([0-9]+)/?$ sadmin.php?action=cat&id_cat=$1&page=$2
RewriteRule ^admin/cat/([0-9]+)/([0-9]+)/edit_item/?$ sadmin.php?action=cat&id_cat=$1&id_item=$2&op=edit_item
RewriteRule ^admin/cat/([0-9]+)/([0-9]+)/drop_item/?$ sadmin.php?action=cat&id_cat=$1&id_item=$2&op=drop_item


На этом этапе у нас появляются новые функции, предназначенные для постраничной навигации, код которых необходимо поместить в наш файл func.php:
function page_list ($page, $num, $count_on_page)
{
    if (!isset($page) && intval($page) == 0) $page = 1;
    $count_pages = intval($num / $count_on_page);
    $ostatok = $num % $count_on_page;
    if($ostatok > 0) $count_pages++;
    $start = $count_on_page * $page - $count_on_page;
    return $start;
}

function show_page_list ($page, $num, $count_on_page, $id_cat, $path_to_page)
{
    echo "<table align=center><tr><td class=\"y b\">";
    if (!isset($page) && intval($page) == 0) $page = 1;
    $count_pages = intval($num / $count_on_page);
    $ostatok = $num % $count_on_page;
    if($ostatok > 0) $count_pages++;
    if ($page>1) echo " <a href = \"http://". $_SERVER['HTTP_HOST'] ."/$path_to_page/$id_cat/page/".($page - 1)."/\" title = \"Предыдущая страница\"><<</a> ";
    $diapazon = 1;
    $page_from = $page - $diapazon; 
    if($page_from < 1) $page_from = 1;
    $page_to = $page + $diapazon; 
    if($page_to > $count_pages) $page_to = $count_pages;

    for ($i = $page_from; $i <= $page_to; $i++)
    {
        if ($i == $page) echo " [$i] ";
        else echo "<a href=\"http://".$_SERVER['HTTP_HOST']."/$path_to_page/$id_cat/page/$i/\" title = \"$i страница\">[$i]</a>";
    }
    if ($page<$count_pages) echo " <a href = \"http://". $_SERVER['HTTP_HOST'] ."/$path_to_page/$id_cat/page/".($page + 1)."/\" title = \"Следующая страница\">>></a> ";
    echo "</td></tr></table>";
}

function show_page_list_index ($page, $num, $count_on_page, $path_to_page)
{
    echo "<table align=center><tr><td class=\"y b\">";
    if (!isset($page) && intval($page) == 0) $page = 1;
    $count_pages = intval($num / $count_on_page);
    $ostatok = $num % $count_on_page;
    if($ostatok > 0) $count_pages++;
    if ($page>1) echo " <a href = \"http://". $_SERVER['HTTP_HOST'] ."/$path_to_page/page/".($page - 1)."/\" title = \"Предыдущая страница\"><<</a> ";
    $diapazon = 1;
    $page_from = $page - $diapazon; 
    if($page_from < 1) $page_from = 1;
    $page_to = $page + $diapazon; 
    if($page_to > $count_pages) $page_to = $count_pages;

    for ($i = $page_from; $i <= $page_to; $i++)
    {
        if ($i == $page) echo " [$i] ";
        else echo "<a href =\"http://". $_SERVER['HTTP_HOST'] ."/$path_to_page/page/$i/\" title = \" $i страница \">[$i]</a>";
    }
    if ($page<$count_pages) echo " <a href = \"http://". $_SERVER['HTTP_HOST'] ."/$path_to_page/page/".($page + 1)."/\" title = \"Следующая страница\">>></a> ";
    echo "</td></tr></table>";
}


И появляется новые переменные, значения которых будут влиять на количество товаров, выводимых на одну страницу в категории нашей Административной панели, тип и порядок сортировки.
Это следует добавить в файл config.php:
// Количество товаров, выводимых в админ-панели на одной странице
$COUNT_SHOW_ITEMS_IN_ADMINPAGE = 5; 
// Поля для сортировки: id - по номеру; title - по названию; price - по цене; hits - по популярности
$SORT_FIELD_ITEMS_IN_ADMINPAGE = "id";
// Сортировка товаров по возрастанию - ASC, наоборот - DESC
$DESC_ASC_ITEMS_IN_ADMINPAGE = "DESC";


Такс, а теперь собственно код, отвечающий за работу с товаром в нашем каталоге:
    ###############    БЛОК ДОБАВЛЕНИЯ ТОВАРОВ    ###############    
elseif (@$_GET['op'] == "add_item")
{
    if (@$_POST['title']) // если POST массив не пуст
    {
        // преобразовываем зарезервированные в HTML символы
        // и устанавливаем тип переменных в числа
        $id_category = intval            ($_POST['id_category']);
        $price         = intval            ($_POST['price']);
        $title         = htmlspecialchars    ($_POST['title']);
        $description = htmlspecialchars    ($_POST['description']);

        // Проверим наличие стоимости
        if (!$price) die ("<br /><br /><center><strong>
        Введите нормальную стоимость!</strong></center>");

        // экранируем
        if (!get_magic_quotes_gpc())
        {
             $title = mysql_escape_string($title);
             $description = mysql_escape_string($description);
        }
        else
        {
            $title = str_replace("'","'",$title);
            $description = str_replace("'","'",$description);
        }

        // вставляем данные в БД
        $query = mysql_query("
        INSERT item  
        SET id_category = '$id_category', 
        title = '$title', 
        description = '$description', 
        price = '$price', 
        money_type = '".$_POST['money_type']."', 
        print_to_index = '".$_POST['print_to_index']."'
        ");
        // если удачно, то...
        if($query) echo "<center><strong>Товар добавлен</strong></center>";
        // если не удачно, то
        else echo "<center><strong>Ошибка при добавлении товара</strong></center>";
    }
    // иначе выводим форму для заполнения
    else
    {
        echo "<table align=center cellspacing=2 cellpadding=2 border=0>
        <tr><td align=right><FORM METHOD=POST
         ACTION=\"http://".$_SERVER['HTTP_HOST']."/admin/cat/add_item/\">
        Название: <input type=text maxlength=250 name=title><br /><br />
        Описание: <textarea name=description></textarea><br /><br />
        Выберите категорию: <select name=id_category>";
        // ф-ия обхода дерева категорий
        function subcategory($id, $sub)
        {
            $categories = mysql_query("SELECT * FROM category WHERE root_cat = $id");
            while($category = mysql_fetch_array($categories)) 
            {    
                for($i = 0; $i < $sub; $i++) echo "";
                echo "<option value=\"".$category['cat_id']."\">
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;".$category['name_cat']." ";
                subcategory($category['cat_id'], $sub+1);
            }
        }
        $categories = mysql_query("SELECT * FROM category WHERE root_cat = 0");
        while($category = mysql_fetch_array($categories)) 
        {
            $sub = 1;
            echo "<option value=\"".$category['cat_id']."\">
            ".$category['name_cat']."<br>";
            subcategory($category['cat_id'], $sub);
        }
        echo "</select><br /><br />
        Стоимость: <input type=text maxlength=9 name=price><br /><br />
        Вид валюты: <select name=money_type>
        <option value=\"R\" selected>Рубли</option>
        <option value=\"D\">Доллары США</option>
        <option value=\"E\">Евро</option>
        <option value=\"G\">Гривны</option>
        </select><br /><br />
        Показывать на главной странице? <select name=print_to_index>
        <option value=\"yes\" selected>Да, показывать</option>
        <option value=\"no\">Нет</option>
        </select><br /><br />
        <input type=submit value=Добавить наименование товара>
        </form></td></tr></table>";
    }
}
    ###############    КОНЕЦ БЛОКА ДОБАВЛЕНИЯ ТОВАРОВ    ###############    

    ###############    БЛОК УДАЛЕНИЯ ТОВАРОВ    ###############    
elseif (@$_GET['op'] == "drop_item")
{
    // делаем запрос на удаление
    $delete = mysql_query("DELETE FROM item 
    WHERE id = '".$_GET['id_item']."' LIMIT 1");
    //если успешно, то...
    if ($delete) echo "<center><strong>
    Наименование успешно удалено</strong></center>";
    //иначе...
    else echo "<center><strong>
    Не удалось удалить наименование!</strong></center>";
}
    ###############    КОНЕЦ БЛОКА УДАЛЕНИЯ ТОВАРОВ    ###############    

    ###############    БЛОК РЕДАКТИРОВАНИЯ ТОВАРОВ    ###############    
elseif (@$_GET['op'] == "edit_item")
{
    if (@$_POST['title']) // если POST массив не пуст
    {
        // преобразовываем зарезервированные в HTML символы
        // и устанавливаем тип переменных в числа
        $id_category = intval            ($_POST['id_category']);
        $price         = intval            ($_POST['price']);
        $title         = htmlspecialchars    ($_POST['title']);
        $description = htmlspecialchars    ($_POST['description']);

        // Проверим наличие стоимости
        if (!$price) die ("<br /><br /><center><strong>
        Введите нормальную стоимость!</strong></center>");

        // экранируем
        if (!get_magic_quotes_gpc())
        {
             $title = mysql_escape_string($title);
             $description = mysql_escape_string($description);
        }
        else
        {
            $title = str_replace("'","'",$title);
            $description = str_replace("'","'",$description);
        }

        // обновляем данные в БД
        $query = mysql_query("
        UPDATE item  
        SET id_category = '$id_category', 
        title = '$title', 
        description = '$description', 
        price = '$price', 
        money_type = '".$_POST['money_type']."', 
        print_to_index = '".$_POST['print_to_index']."' 
        WHERE  id = '".$_GET['id_item']."' 
        LIMIT 1 
        ");
        // если удачно, то...
        if($query) echo "<center><strong>
        Товар изменен</strong></center>";
        // если не удачно, то
        else echo "<center><strong>
        Ошибка при изменении товара</strong></center>";
    }
    // иначе выводим форму для заполнения
    else
    {
        // достаем данные для этого товара
        $query_edit = mysql_query ("SELECT * FROM item
         WHERE id = '".$_GET['id_item']."'");
        if (mysql_num_rows ($query_edit))
        {
            // лепим ассоциативный массив
            $items = mysql_fetch_assoc ($query_edit);
            // выводим форму
            echo "<table align=center cellspacing=2 cellpadding=2 border=0>
            <tr><td align=right><FORM METHOD=POST
             ACTION=\"http://".$_SERVER['HTTP_HOST']."/admin/cat/".$items['id_category']."/".$items['id']."/edit_item/\">
            Название: 
            <input type=text maxlength=250 name=title value=\"".$items['title']."\">
            <br /><br />
            Описание: 
            <textarea name=description>".$items['description']."
            </textarea><br /><br />
            Выберите категорию: <select name=id_category>";
            // ф-ия обхода дерева категорий
            function subcategory($id, $sub)
            {
                $categories = mysql_query("SELECT * FROM category
                 WHERE root_cat = $id");
                while($category = mysql_fetch_array($categories)) 
                {    
                    for($i = 0; $i < $sub; $i++) echo "";
                    echo "<option value=".$category['cat_id']."
                    ".( $category['cat_id'] == $_GET['id_cat'] ? " selected " : "" ).">
                    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;".$category['name_cat'];
                    subcategory($category['cat_id'], $sub+1);
                }
            }
            $categories = mysql_query("SELECT * FROM category
             WHERE root_cat = 0");
            while($category = mysql_fetch_array($categories)) 
            {
                $sub = 1;
                echo "<option value=".$category['cat_id']."
                ".( $category['cat_id'] == $_GET['id_cat'] ? " selected " : "" ).">
                ".$category['name_cat'];
                subcategory($category['cat_id'], $sub);
            }
            echo "</select><br /><br />
            Стоимость: 
            <input type=text maxlength=9 name=price value=\"".$items['price']."\">
            <br /><br />
            Вид валюты: <select name=money_type>
            <option value=R".($items['money_type']=="R"?" selected":"").">Рубли
            <option value=D".($items['money_type']=="D"?" selected":"").">Доллары США
            <option value=E".($items['money_type']=="E"?" selected":"").">Евро
            <option value=G".($items['money_type']=="G"?" selected":"").">Гривны
            </select><br /><br />
            Показывать на главной странице? <select name=print_to_index>
            <option value=yes".($items['print_to_index']=="yes"?" selected":"").">
            Да, показывать</option>
            <option value=no".($items['print_to_index']=="no"?" selected":"").">Нет</option>
            </select><br /><br />
            <input type=submit value=Изменить наименование товара>
            </form></td></tr></table>";
        }
    }
}
    ###############    КОНЕЦ БЛОКА РЕДАКТИРОВАНИЯ ТОВАРОВ    ###############    

    ###############    БЛОК ВЫВОДА ТОВАРОВ КАКОЙ-ЛИБО ИЗ КАТЕГОРИЙ    ###############    
elseif (!@$_GET['op'] && intval(@$_GET['id_cat']) > 0 && !@$_GET['id_item'])
{
    // запрашиваем все товары для нужной категории
    $query = mysql_query("SELECT * FROM item as A,
     category as B
      WHERE A.id_category = B.cat_id AND
       A.id_category = ".$_GET['id_cat']."
        ORDER by A.id DESC");
    // узнаем количество товаров в этой категории    
    $num = mysql_num_rows ($query);
    echo "<strong><center>Количество товаров в данной категории:
     ".$num."</strong></center><br><br>";
    // используем ф-ию для постраничной навигации
    @$start = page_list ($_GET['page'], $num, $COUNT_SHOW_ITEMS_IN_ADMINPAGE);
    // запрашиваем товары, но уже зная, с какого товара выводить,
    // сколько штук на странице,
    // и как их сортировать
    $query2 = mysql_query("SELECT * FROM item as A,
     category as B
      WHERE A.id_category = B.cat_id AND
       A.id_category = ".$_GET['id_cat']."
        ORDER by $SORT_FIELD_ITEMS_IN_ADMINPAGE $DESC_ASC_ITEMS_IN_ADMINPAGE
         LIMIT $start, $COUNT_SHOW_ITEMS_IN_ADMINPAGE");
    
    echo "<table cellpadding=10 cellspacing=5 align=center>";
    // лепим массив в цикле
    while($list = mysql_fetch_assoc($query2))
    {    
        // узнаем, какую валюту печатать на странице у каждого товара
        if         ($list['money_type'] == "D") $money_type = "$";
        elseif     ($list['money_type'] == "E") $money_type = "&euro;";
        elseif     ($list['money_type'] == "G") $money_type = "гривен";
        else $money_type = "руб.";
        //
        if ($list['print_to_index'] == "yes")
        $print_to_index = "выводится";
        else $print_to_index = "<strong>не</strong> выводится";
        // выводим данные
        echo "<tr bgcolor=#EFEFEF valign=top><td>
        <a href=\"http://".$_SERVER['HTTP_HOST']."/cat/".$list['id_category']."/".$list['id']."/\">
        ".$list['title']."</a></td>";
        $list['description'] = substr($list['description'], 0, 100);
        echo "<td>".nl2br($list['description'])."...</td>";
        echo "<td>Цена: ".$list['price']." ".$money_type."</td>";
        echo "<td>Просмотров: ".$list['hits']."</td>";
        echo "<td>На главной ".$print_to_index."</td>";
        
        echo "<td><a href=\"http://".$_SERVER['HTTP_HOST']."/admin/cat/".$list['id_category']."/".$list['id']."/edit_item/\">
        Редактировать</a></td>";
        echo "<td><a href=\"http://".$_SERVER['HTTP_HOST']."/admin/cat/".$list['id_category']."/".$list['id']."/drop_item/\">
        Удалить</a></td></tr>";
    }
    echo "</table>";
    // выводим постраничную навигацию
    $path_to_page = "admin/cat";
    @show_page_list($_GET['page'], $num, $COUNT_SHOW_ITEMS_IN_ADMINPAGE, $_GET['id_cat'], $path_to_page);
    echo "<br /><br /><center>
    <a href=\"http://".$_SERVER['HTTP_HOST']."/admin/cat/add_item/\"> Добавить товар </a>
    </center>";
}
    ###############    КОНЕЦ БЛОКА ВЫВОДА ТОВАРОВ КАКОЙ-ЛИБО ИЗ КАТЕГОРИЙ    ###############    


Открываем файл scat.php и ищем в нём такие строки:
############### КОНЕЦ БЛОКА СОЗДАНИЯ КАТЕГОРИЙ ############### 
############### ВЫВОД КАТЕГОРИЙ ############### 


и между них вставляем этот код.

Теперь работа над кодом по операциям с товаром в нашем Бэк_Офисе закончена. В следующей статье мы примемся за разработку Фронт-Офиса, вывод нужных товаров на главной странице, вывод списка наших категорий и количества товаров в каждой категории.
Напоминаю, что возникшие вопросы по данному циклу статей Вы можете опубликовать на форуме. А я в свою очередь попробую Вам на них ответить.

Кстати код, который получится в итоге этого цикла статей лёг в основу скрипта JOKER_vitrina 1.0 FREE, описание которого и ссылки для скачивания Вы найдете на странице http://allpublication.ru/blog/p15-novyy_besplatnyy_PHP_skript_katalog_tovarov_JOKER_vitrina_1_0_FREE.html
 

Комментарии

Rss-лента комментариев к этому посту
1
AnubysAnubys16.08.2010Спасибо за статью! Лучше не видел!
ОГРОМНОЕ спасибо!
2
programmakerprogrammaker30.11.2010статья и вправду чудная. есть где поучиться


Открываем файл scat.php и ищем в нём такие строки:

php############### КОНЕЦ БЛОКА СОЗДАНИЯ КАТЕГОРИЙ ###############
############### ВЫВОД КАТЕГОРИЙ ###############

и между них вставляем этот код.

какой собственно код???
3
JokerJoker03.12.2010
для programmaker: Тот большоооой код, который перед этими словами...
4
ЮрийЮрий04.07.2012Не советую учится на таких примерах.

Так делать нельзя: WHERE id = '".$_GET['id_item']."' любые данные полученные от пользователя нужно фильтровать как минимум через mysql_real_escape_string

Использовать это mysql_query плохо, есть PDO

Оставьте свой комментарий

Заменить картинку
жирный курсив цитата

С правилами ознакомлен
 

Правила публикования комментариев
1. Не информативные комментарии вида "Спасибо, замечательная статья", имеющие ссылку на сайт, скорее всего будут удалены.
2. В поле "сайт" указывается ссылка на главную страницу сайта для людей.
Владелец этого блога незамедлительно удалит спам в любом его проявлении.

 
Для комфортного доступа к этому сайту, в вашем браузере должен быть включен JavaScript