Содержание


Реальные проекты на PHP и MySQL. Работа с Web-службами с помощью XML и SOAP

Часть 2. Построение каталога товаров для Интернет-магазина с помощью локальной базы-данных и Web-служб

Comments

Серия контента:

Этот контент является частью # из серии # статей: Реальные проекты на PHP и MySQL. Работа с Web-службами с помощью XML и SOAP

Следите за выходом новых статей этой серии.

Этот контент является частью серии:Реальные проекты на PHP и MySQL. Работа с Web-службами с помощью XML и SOAP

Следите за выходом новых статей этой серии.

В рамках поставленной задачи будут рассматриваться вопросы использования стороннего программного обеспечения, например, Web-сайта компании Amazon, который позволяет размещать товары, поставляемые Amazon, на сайтах других компаний. Также подобный сценарий позволяет с помощью Web-служб организовать поиск по базе данных, принадлежащей другому Web-узлу.

В данной статье рассматривается пример, относящийся к электронной торговле, но подобные технологии можно использовать и для других предметных областей, чтобы обеспечить собственный Web-сайт информацией с других ресурсов. Подобная интеграция позволяет увеличить количество клиентов основного ресурса. Также, если заключить договор со сторонним сайтом, то действия пользователей можно «монетизировать», получая определенную выплату каждый раз, когда покупатель, находясь на основном сайте, решает приобрести какой-либо товар, поставляемый с сайта Amazon. В этом случае Web-служба позволяет использовать сайт Amazon (или подобный) не только для расширения списка доступных товаров, но и для осуществления покупок.

Постановка задачи

Разрабатываемый проект предлагает поиск товаров в собственной базе данных и базе данных удаленного ресурса с последующим заполнением покупательской корзины. В общем случае, основной сайт используется в полном объеме до тех пор, пока не подошла необходимость оплатить товар, найденный на другом сайте, так как оплата должна выполняться через Web-сайт, с которого поступила информация о товаре. Подобная процедура крайне удобна и дает пользователю возможность совершать покупки на разных ресурсах, не покидая основной Web-сайт.

Чтобы реализовать описанную функциональность потребуется разработать Web-интерфейс для отображения каталога товаров и заполнения покупательской корзины, а также код для подключения к Web-службам другого сайта через протоколы SOAP или REST. Таким способом можно подключиться к любому ресурсу, достаточно, чтобы он просто предоставлял Web-службу по протоколу SOAP или REST. Также для повышения общей производительности необходимо будет обеспечить Web-сайт механизмом кэширования.

Базовый Web-сайт будет представлять собой Интернет-магазин для торговли книгами. В статье будет частично рассмотрена технология его построения с упором на то, что пользователь магазина обладает и правами администратора. Важно понимать, что администратор книжного Интернет-магазина является обычным пользователем для другого сайта, к которому он обращается с помощью Web-служб. Поэтому в дальнейшем оба эти понятия объединяются и используются применительно к общему контексту.

Пользователь (администратор) сможет управлять размещением товаров на сайте и использовать поиск по другому сайту. Другой Web-сайт должен будет для этого предоставить Web-службы через протоколы SOAP или REST, позволяющие дополнить локальный каталог товаров информацией из удаленного каталога. В последующих статьях этого цикла будет подробно рассмотрена реализация описанной функциональности. Данная статья будет посвящена вопросам построения каталога товаров на основе локальной базы данных.

Построение каталога товаров

Данный цикл является завершающим и подразумевает понимание и знание материала из предыдущих циклов, посвященных использованию PHP и MySQL. Наиболее сложные моменты будут рассмотрены детально, но подробное описание реализации всего проекта выходит далеко за рамки этого цикла.

Основная цель при создании каталога товаров сводится к программной реализации Web-интерфейса для взаимодействия с базой данных, при котором применяется входная аутентификация. Для реализации этих функций необходимо обеспечить аутентификацию пользователя при входе в систему, как показано в листинге 1:

Листинг 1. PHP-сценарий для входа в систему.
<?php
 require_once('book_sc_fns.php');
 do_html_header('Администрирование');
 display_login_form();
 do_html_footer();
?>

Данный сценарий требует подключения ряда функций, перечисленных в листинге 2.

Листинг 2. Подключение необходимых функций.
<?php
  include_once('db_fns.php');
  include_once('data_valid_fns.php');
  include_once('output_fns.php');
  include_once('book_fns.php');
  include_once('user_auth_fns.php');
  include_once('admin_fns.php');
  include_once('order_fns.php');
?>

Большая часть этих функций была рассмотрена ранее, в предыдущих статьях цикла. Однако самые важные функции, относящиеся к библиотеке book_fns.php, приведены в листинге 3.

Листинг 3. Функции для работы с каталогом товаров и покупательской корзиной.
<?php
function calculate_shipping_cost()
{
  // стоимость доставки фиксирована
  return 20.00;
}

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;
   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();
   $query = "select catname
             from categories
             where catid = $catid";
   $result = $conn->query($query);
   if (!$result)
     return false;
   $num_cats = $result->num_rows;
   if ($num_cats == 0)
     return false;
   $row = $result->fetch_object();
   return $row->catname;
}

function get_books($catid)
{
   // найти в базе данных книги, относящиеся к определенной категории
   if (!$catid || $catid=='')
     return false;
   
   $conn = db_connect();
   $query = "select * from books where catid='$catid'";
   $result = @$conn->query($query);
   if (!$result)
     return false;
   $num_books = @$result->num_rows;
   if ($num_books ==0)
      return false;
   $result = db_result_to_array($result);
   return $result;
}

function get_book_details($isbn)
{
  // найти в базе данных подробную информацию о книге
  if (!$isbn || $isbn=='')
     return false;

   $conn = db_connect();
   $query = "select * from books where isbn='$isbn'";
   $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);
      if ($result)
      {
        $item = $result->fetch_object();
        $item_price = $item->price;
        $price +=$item_price*$qty;
      }
    }
  }
  return $price;
}

function calculate_items($cart)
{
  // подсчитать общее количество элементов в корзине
  $items = 0;
  if(is_array($cart))
  {
    $items=array_sum($cart);
  }
  return $items;
}

?>

В листинге 5 приведена функция из библиотеки user_auth_fns.php, используемая для авторизации пользователя.

Листинг 5. Функция для авторизации пользователя function check_admin_user()
// проверить - обладает ли пользователь полномочиями администратора
{
  if (isset($_SESSION['admin_user']))
    return true;
  else
    return false;
}
?>

В листинге 6 приведен PHP-сценарий, использующийся для аутентификации пользователя, при успешном выполнении которого пользователь получит доступ к функциям для управления каталогом товаров.

Листинг 6. PHP-сценарий для аутентификации пользователя.
<?php
// подключить необходимые библиотеки
require_once('book_sc_fns.php'); 
session_start();

if ($_POST['username'] && $_POST['passwd'])
// пользователь только что вошел в систему
{
    $username = $_POST['username'];
    $passwd = $_POST['passwd'];

    if (login($username, $passwd))
    {
      // если указанный пользователь зарегистрирован в базе данных,
      // то сохранить его идентификатор в переменной HTTP-сеанса
      $_SESSION['admin_user'] = $username;
    }  
    else
    {
      // не удалось войти в систему, так как пользователь не зарегистрирован в базе
      do_html_header('Ошибка:');
      echo	'Вход в систему невозможен.
		Для просмотра этой страницы необходимо войти в систему.';
      do_html_url('login.php', 'Вход');
      do_html_footer();
      exit;
    }      
}

do_html_header('Администрирование');
if (check_admin_user())
  display_admin_menu();
else
  echo 'Недостаточно прав для доступа на страницу администрирования.';

do_html_footer();
?>

Идентификация администратора после входа в систему осуществляется через переменную HTTP-сеанса admin_user и функцию check_admin_user(), приведенную в листинге 4. Как только пользователь входит в систему с полномочиями администратора, он получает возможность изменить свой пароль или выйти из системы. Для добавления в каталог новой категории товаров или книги используются сценарии, приведенные в листинге 7.

Листинг 7. PHP-cценарии для управления каталогом товаров.
<?php
// сценарий для добавления новой категории товаров в каталог
require_once('book_sc_fns.php'); 
session_start();

do_html_header('Добавление новой категории');
if (check_admin_user())
{
  display_category_form();
  do_html_url('admin.php', 'Назад в меню администрирования');
}
else
  echo 'Отказано в доступе к административному интерфейсу.';

do_html_footer();
?>
<?php
// сценарий для добавления новой книги в каталог
require_once('book_sc_fns.php'); 
session_start();

do_html_header('Добавление новой книги');
if (check_admin_user())
{
  display_book_form();
  do_html_url('admin.php', 'Назад в меню администрирования');
}
else
  echo 'Отказано в доступе к административному интерфейсу.';

do_html_footer();
?>

В листинге 8 приведен исходный код функции display_book_form(), использующейся для добавления новых книг или редактирования параметров уже существующих книг.

Листинг 8. Функция для отображения HTML-формы для добавления/редактирования книги.
function display_book_form($book = '')
// функция для отображения HTML-формы с информацией о книге.
// форма может применяться для добавления или редактирования информации о книге.

// для добавления новой книги передавать параметр $book не нужно. 
// тогда параметр $edit будет равен false и будет вызван сценарий insert_book.php.

// для обновления данных следует передать массив, содержащий данные о книге.
// тогда в форме будут отображены данные о книге и кнопка для их обновления.
// также форма будет содержать кнопку для удаления книги из каталога.
{
  // если передается существующая книга, перейти в "режим редактирования".
  $edit = is_array($book);

// форма представляет собой HTML-код с небольшими вставками PHP.
?>
  <form method='post'
        action="<?php echo $edit?'edit_book.php':'insert_book.php';?>">
  <table border="0">
  <tr>
    <td>ISBN:</td>
    <td><input type='text' name='isbn' 
         value="<?php echo $edit?$book['isbn']:''; ?>"></td>
  </tr>
  <tr>
    <td>Название:</td>
    <td><input type='text' name='title' 
         value="<?php echo $edit?$book['title']:''; ?>"></td>
  </tr>
  <tr>
    <td>Автор:</td>
    <td><input type='text' name='author' 
         value="<?php echo $edit?$book['author']:''; ?>"></td>
   </tr>
   <tr>
      <td>Категория:</td>
      <td><select name='catid'>
      <?php
          // загрузить из базы данных список доступных категорий
          $cat_array=get_categories();
          foreach ($cat_array as $thiscat)
          {
               echo '<option value="';
               echo $thiscat['catid'];
               echo '"';
               // в режиме редактирования – поместить книгу в нужную категорию
               if ($edit && $thiscat['catid'] == $book['catid'])
                   echo ' selected';
               echo '>'; 
               echo $thiscat['catname'];
               echo "</option>\n"; 
          }
          ?>
          </select>
        </td>
   </tr>
   <tr>
    <td>Цена:</td>
    <td><input type='text' name='price' 
               value="<?php echo $edit?$book['price']:''; ?>"></td>
   </tr>
   <tr>
     <td>Описание:</td>
     <td><textarea rows='3' cols='50' 
          name='description'>
          <?php echo $edit?$book['description']:''; ?>
          </textarea></td>
    </tr>
    <tr>
      <td <?php if (!$edit) echo 'colspan=\'2\''; ?> align="center">
         <?php 
            if ($edit)
             // если был обновлен номер ISBN, для поиска книги
             // в базе данных понадобится старый номер ISBN
             echo '<input type="hidden" name="oldisbn" 
                    value="'.$book['isbn'].'">';
         ?>
        <input type='submit'
               value="<?php echo $edit?'Обновить':'Добавить'; ?> книгу">
        </form></td>
        <?php 
           if ($edit)
           {  
             echo '<td>';
             echo '<form method="post" action="delete_book.php">';
             echo '<input type="hidden" name="isbn" 
                    value="'.$book['isbn'].'">';
             echo '<input type="submit" 
                    value="Удалить книгу">';
             echo '</form></td>';
            }
          ?>
         </td>
      </tr>
  </table>
  </form>
<?php
}

Если в сценарий передается массив с данными о книге, то форма переходит в режим редактирования и поля заполняются информацией о редактируемой книге, загруженной из базы, как показано ниже:

<input type='text' name='price' 
               value="<?php echo $edit?$book['price']:''; ?>">

При этом на странице появляется кнопка для удаления книги. По сути, при редактировании видны две кнопки – одна существует для редактирования данных о книге, другая несет в себе функцию полного удаления книги вообще. Нажатие этих кнопок приводит к вызову соответствующих PHP-сценариев для обновления информации о книге и ее удалении, приведенных в листинге 9.

Листинг 9. PHP-сценарии для обновления информации о книге и ее удаления из каталога.
<?php
// файл 'edit_book.php' - PHP-сценарий для обновления информации о книге
require_once('book_sc_fns.php'); 
session_start();

do_html_header('Обновление сведений о книге');
if (check_admin_user())
{ 
  if (filled_out($_POST)) 
  {
    $oldisbn = $_POST['oldisbn'];
    $isbn = $_POST['isbn'];
    $title = $_POST['title'];
    $author = $_POST['author'];
    $catid = $_POST['catid'];
    $price = $_POST['price'];
    $description = $_POST['description'];

    if(update_book($oldisbn, $isbn, $title, $author, $catid,
                      $price, $description))
      echo 'Сведения о книге обновлены.<br />';
    else
      echo 'Невозможно обновить сведения о книге.<br />';
  } 
  else 
    echo 'Были введены не все данные.  Пожалуйста, повторите попытку.';
  do_html_url('admin.php', 'Назад в меню администрирования');
}
else 
  echo 'Отказано в доступе на эту страницу.'; 

do_html_footer();
?>
<?php
// файл 'delete_book.php' - PHP-сценарий для удаления книги из приложения
require_once('book_sc_fns.php'); 
session_start();

do_html_header('Удаление книги');
if (check_admin_user())
{
  if (isset($_POST['isbn'])) 
  {
    $isbn = $_POST['isbn'];
    if(delete_book($isbn))
      echo 'Книга '.$isbn.' удалена.<br />';
    else
      echo 'Книга '.$isbn.' не может быть удалена.<br />';
  } 
  else 
    echo 'Для удаления книги необходимо ввести ISBN. Пожалуйста, повторите 
	попытку.<br />';
  do_html_url('admin.php', 'Назад в меню администрирования');
}
else 
  echo 'Отказано в доступе на эту страницу.'; 

do_html_footer();
?>

Функциональность для управления категориями товаров построена по схожему принципу. При попытке удаления категории проверяется, есть ли в ней книги. Если это так, то удалить категорию невозможно, если же категория пуста, то она может быть удалена из каталога. При этом минимизируется опасность случайного удаления информации.

Заключение

В статье описан принцип использования Web-служб для расширения возможностей Интернет-магазина. Также в статье приведен исходный код сценариев, используемых для управления каталогом товаров Интернет-магазина. Подробная реализация кода для доступа к Web-службам будет рассматриваться в следующих статьях.

Данный проект опирается на цикл статей «Реальные проекты на PHP и MySQL. Основа Интернет–магазина - покупательская тележка» и является «связующим звеном», охватывая темы, рассматривавшиеся ранее в других циклах статей, посвященных программированию на PHP.


Ресурсы для скачивания


Похожие темы

  • Программирование с использованием PHP и MySQL в разработке Web-приложений. Часть 1.
  • Программирование с использованием PHP и MySQL в разработке Web-приложений. Часть 2.
  • Программирование с использованием PHP и MySQL в разработке Web-приложений. Часть 3.
  • Программирование с использованием PHP и MySQL в разработке Web-приложений. Часть 4.
  • Программирование с использованием PHP и MySQL в разработке Web-приложений. Часть 5.
  • Программирование с использованием PHP и MySQL в разработке Web-приложений. Часть 6.
  • Программирование с использованием PHP и MySQL в разработке Web-приложений. Часть 7.
  • Программирование с использованием PHP и MySQL в разработке Web-приложений. Часть 8.
  • Программирование с использованием PHP и MySQL в разработке Web-приложений. Часть 9.
  • Программирование с использованием PHP и MySQL в разработке Web-приложений. Часть 10.
  • Программирование с использованием PHP и MySQL в разработке Web-приложений. Часть 11.
  • Программирование с использованием PHP и MySQL в разработке Web-приложений. Часть 12.
  • Программирование с использованием PHP и MySQL в разработке Web-приложений. Часть 13.
  • Программирование с использованием PHP и MySQL в разработке Web-приложений. Часть 14.
  • Реальные проекты на PHP и MySQL. Работа с Web-службами с помощью XML и SOAP. Часть 1.
  • Реальные проекты на PHP и MySQL. Работа с Web-службами с помощью XML и SOAP. Часть 2.

Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux, Open source
ArticleID=644735
ArticleTitle=Реальные проекты на PHP и MySQL. Работа с Web-службами с помощью XML и SOAP: Часть 2. Построение каталога товаров для Интернет-магазина с помощью локальной базы-данных и Web-служб
publish-date=04052011