Только для читателей Lifeexample возможно открыть интернет-магазин на Moguta.CMS со скидкой в 15%

<<< Защита от SQL инъекций || Сериализация php >>>

Корзина товаров и оформление заказа

02.04.2012
Корзина товаров и оформление заказа

Здравствуйте уважаемые читатели блога LifeExample, наконец-то пришло время продолжить создание интернет магазина на php. В предыдущих уроках мы многое сделали, и для начальной работы, нашему интернет магазину не хватает только формы редактирования корзины и модуля оформления заказа. Сегодня мы завершим начальный этап создания интернет магазина, и доведем нашу mvc систему до первого релиза.

Работы предстоит много, поэтому больше воды не будет, далее только по существу.

Чтобы вам было удобно ориентироваться в коде, скачайте последнюю версию системы.

Скачать листинг №4. ( Скачали: 5571 чел. ) 

Модуль корзины товаров

Поехали! Начнем с реализации модуля корзины товаров. Так как интерфейс управления корзиной будет находиться на отдельной странице, давайте создадим соответствующие одноименные файлы cart.php в папках views, model, controller. Напомню, что файл в папке views отвечает за внешний вид компонента, и выводит его на страницу. С него мы и начнем, вот как мы хотим видеть форму корзины в итоге:

Интерфейс корзины интернет магазина

Наша корзина должна уметь:

  1. Изменять количество товаров;
  2. Удалять выбранные позиции;
  3. Пересчитывать сумму к оплате;

Такой минимальный функционал доступен в любом интернет магазине, поэтому остановимся пока на этом. А в дальнейшем, когда узнаем что такое формат JONS, и технология AXAJ можно будет модернизировать работу этого и многих других модулей интернет магазина.

Начнем с файла представления (application/views/cart.php):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 <h2>Корзина</h2>
<?if($empty_cart):?>
<form action="/cart" method="post">
<?=$big_cart;?>
<input type="submit" name="refresh" value="Пересчитать"  style="margin-left:10px; margin-top:10px;" />
</form>

<form action="/order" method="post" style="margin-left:600px;">
<input type="submit" name="order" value="Оформить заказ" style=" height:30px; padding: 0px 20px;" />
</form>

<?else:?>
Ваша корзина пуста!
<?endif;?>

В этом файле мы выводим форму редактирования корзины, которая хранится в переменной $big_cart , а также кнопки пересчитать и оформить заказ.

Форма корзины генерируется моделью корзины в файле application/model/cart.php с помощью метода printCart(). Метод получает данные о каждом продукте корзины, из таблицы product используя модель класса Application_Models_Product. Полученную информацию формирует в виде html таблицы, добавляя элементы графического оформления в виде чередующихся цветных строк. Важным моментом в процессе генерации таблицы является добавление таких элементов как checkbox – для удаления строк, и text – для ввода количества. В имена этих элементов подставляются $id товаров и специальные префиксы del_ и item_ позволяющие в дальнейшем распознать, какая позиция была изменена.

Я не стану выкладывать код модели корзины, потому что он достаточно объемный, но вы можете посмотреть его в скачанном архиве по адресу ..application/model/cart.php . Также в этом файле созданы методы:

  • addToCart() -добавляет в корзину товар;
  • getListItemId()-возвращает список id продуктов из корзины;
  • getTotalSumm()-возвращает итоговую сумму корзины;
  • clearCart()-очищает корзину;
  • refreshCart()-обновляет содержимое корзины;
  • isEmptyCart()-проверяет корзину на наличие товаров;
  • printCart()-генерирует html код корзины;

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
foreach($list_Item_Id as $Item_Id => $new_count){
    $id="";
    if(substr($Item_Id, 0, 5)=="item_") {
    $id=substr($Item_Id, 5);
    $count=$new_count;
    }
    elseif(substr($Item_Id, 0, 4)=="del_"){
    $id=substr($Item_Id, 4);
    $count=0;
    }
    if($id){
    $array_product_id[$id]=(int)$count;                
    }
}

Контролер корзины, пробегает по полученным измененным данным массива POST, находит по префиксам нужные элементы, парсит из них ID продуктов, и производит соответствующую префиксам операцию. Далее запускается механизм обновления данных заложенный в метод модели refreshCart().

Модуль оформления заказа

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

Перейдем к скриптам оформления заказа. Также как и у модуля корзины, создадим три файла отвечающие концепции паттерна MVC. Посмотрим как должна выглядеть форма ввода контактных данных:

Форма оформления заказа

В файле вида application/views/oder.php расположен html код выводящий данную форму. Ничего сложного и интересного там не наблюдается, поэтому переходим к файлу контролера. Контролер данного модуля запрограммирован на три варианта поведения:

  • Обычный вывод формы;
  • Проверка входящих данных и запись заказа в БД;
  • Вывод информации об успешном сохранении заказа;

Рассмотрим обработку данных — наиболее сложный момент поведения.

1
2
3
4
5
6
7
8
9
10
11
12
if(isset($_REQUEST["to_order"])){  // если пришли данные с формы
$model = new Application_Models_Order;  //создаем модель заказа
$error=$model->isValidData($_REQUEST);  //проверяем на корректность вода
if($error)$this->error=$error; // если есть ошиби заносим их в переменную
else{          
//если ошибок нет, то добавляем заказ в БД
$order_id=$model->addOrder();
Lib_SmalCart::getInstance()->setCartData(); // пересчитываем маленькую корзину
header('Location: /order?thanks='.$order_id);
exit;
}
}

Из комментариев должно быть все ясно, сначала создаем модель для работы с заказом Application_Models_Order, проверяем корректность введенных данных функцией isValidData(), в положительном случае записываем заказ в базу $model->addOrder() . Далее отчищаем корзину и перенаправляем пользователя на страницу приветствия. На самом деле страница остается той же, а вот параметры, переданные в $_GET запросе, заставляют этот же контролер вывести информационное сообщение об успешности сохранения заказа в базу. В идеале еще можно дописать отправку писем на мыло покупателя.

Защита от SQL инъекций на практике

Особое внимание в этой статье я бы хотел уделить не столько этим двум модулям сколько практическому применению механизма защиты от SQL инъекций . В папку lib нашей, mvc системы я добавил фаил datebase.php содержащий в себе класс для защищенной работы с базой данных. Перечень методов данного класса:

  • query – выполняет переданный запрос , прогоняя через mysql_real_escape_string() полученные со стороны пользователя параметры;
  • build_query-делает тоже что и query но позволяет передать ассоциативный массив параметров;
  • fetch_object— обрабатывает ряд результата запроса и возвращает объект;
  • num_rows — возвращает количество рядов результата запроса;
  • affected_rows — возвращает количество рядов, затронутых последним INSERT, UPDATE, DELETE запросом к серверу;
  • insert_id — Возвращает ID, сгенерированный при последнем INSERT-запросе;

Особой полезностью являются методы query и build_query, т.к. реализовывают защищенную работу с БД, исключая всякий мусор, который могут попытаться передать злоумышленники.

Для того чтобы пользоваться данными методами в той или иной модели нужно унаследовать ее от класса Lib_DateBase как это сделано в модели заказа:

1
class Application_Models_Order extends Lib_DateBase

Благодаря этому наследованию мы можем в коде модели выполнять такие операции:

1
2
3
4
5
6
7
8
9
10
11
12
13
//формируем массив параметров SQL запроса
$array=array(
    "name"=>$this->fio,
    "email"=>$this->email,
    "phone"=>$this->phone,
    "adres"=>$this->adres,
    "date"=>$date,
    "summ"=>$summ,
    "order_content"=>$order_content
    );
// отдаем на обработку  родительской функции build_query
parent::build_query("INSERT INTO `order` SET",$array);
$id=parent::insert_id(); //заказ номер id добавлен в базу

На мой взгляд достаточно удобно, и можно не переживать о безопасности. На некоторых хостингах, для корректной работы такого метода защиты от SQL инъекций, возможно придется в файл .htaccess прописать строку:

1
php_flag magic_quotes_gpc Off

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

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

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

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

Подписывайтесь на новые выпуски статей о программировании интернет магазина на php следите за выходом новых статей с помощью rss ленты.

По плану в следующем выпуске, я собираюсь начать писать админскую часть системы.

<<< Предыдущий урок | Следующий урок >>>

Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.

Нравится

Комментарии

  • Alexey

    Марк, наконец-то! Спасибо!

    • Mark

      На здоровье,задавайте вопросы, если чего не понятно. 😉

  • Grey

    Извиняюсь за беспокойство, я в этом деле вообще 0, у меня выдает такую штуку: Warning: strlen() expects parameter 1 to be string, array given in Z:\home\1.ru\www\application\models\cart.php on line 53
    и мол корзина пуста, подскажите пожалуйста.

  • Игорь

    Скажите пожалуйста — даную форму корзины можно прикрутить — у меня уже выводятся в цикле id,название и цена товара и мне надо как у Вас сделать чтоб можно было увеличивать кол-во или удалить товар а потом все это подсчитать и отправить даные на обработку?

  • Mark

    Конечно можно, нужно будет изменить, представление вашей корзины, в соответствии с представлением из данного примера, и все будет работать.

  • Игорь

    Спасибо а какие файлы мне нужны будут (из скачаных выше)?

  • Mark

    Grey в какой момент у вас появляется эта ошибка? При загрузке любой страницы магазина? Или при добавлении в корзину, товара.
    Игорь я не совсем понял, а вы разрабатываете магазин по ходу выпуска статей, на рассмотренном в них патерне MVC? Или же вы хотите прикрутить корзину к другому коду?

  • Игорь

    К другому коду

    • sreg
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      public function actionIndex()
          {
              $categories = array();
              $categories = Category::getCategoriesList();

              $productsInCart = false;

              // Получим данные из корзины
              $productsInCart = Cart::getProducts();

              if ($productsInCart) {
                  // Получаем полную информацию о товарах для списка
                  $productsIds = array_keys($productsInCart);
                  $products = Product::getProdustsByIds($productsIds);

                  // Получаем общую стоимость товаров
                  $totalPrice = Cart::getTotalPrice($products);
              }

              require_once(ROOT . '/views/cart/index.php');

              return true;
          }
  • Mark

    Тогда я думаю нет смысла пытаться прикручивать php скрипты из данного урока, проще разработать индивидуальное решение для вашей системы. В противном случае, вам придется перелопатить все что у вас есть, и сделать максимально похожим на то что предлагаю я. Как следствие из этого, я могу вам посоветовать просто скопировать весь архив моего движка, импортировать дамп базы данных и пробовать разбираться с системой, либо уже ее дорабатывать. Вот ссылка по которой можно посмотреть демо версию Демо версия рассматриваемого интернет магазина

  • Alexey

    Марк, два вопроса!

    1. (По этой статье) Кнопку «пересчитать» в будущем планируете убрать и заменить AJAX-овским автообновлением? Я угадал? 🙂
    2. Планируется ли раздел «обратная связь» с формуляром, когда клиент отсылает сообщение в формуляре feedback,
    а админ получает его по емейлу?

    Спасибо!

  • Mark

    Alexey
    Угадали, в будущем корзина будет на аяксе, уже готовлю статью на эту тему. По части feedback, в планах нечего не было.

  • Alexey

    1. Ясно!
    2. Насчет feedback — жалко, вещь важная, но не смею Вам ничего навязывать, Вам виднее, как строить курс.
    Буду искать, как это сделать, своими силами, так сказать 🙂

  • Mark

    Чтобы реализовать feedback много телодвижений делать не надо, там все очень просто. Делаете форму, и в скрипте обработав данные отправляете их на укаханный e-mail стандартной функцией mail().

  • Grey

    При нажатии «оформить заказ»

  • Olexiy

    Grey 07.04.2012 в 07:22
    Та же проблема

  • Alexey

    «Mark

    Чтобы реализовать feedback много телодвижений делать не надо, там все очень просто. Делаете форму, и в скрипте обработав данные отправляете их на укаханный e-mail стандартной функцией mail().»

    Знать бы еще, как формуляр для фидбека грамотно внедрить в вашу mvc-парадигму 🙂
    Насчет функции mail(), я слышал, используют в основном опенсорс framework phpMail для
    таких задач.

  • Mark

    Olexiy и Grey
    Попробуйте заменить функции в модели cart.php

    1
    2
    3
     function clearCart(){
        unset($_SESSION['cart']);
      }

    и

    1
    2
    3
    4
    function isEmptyCart(){
        if($_SESSION['cart']) return true;
        else return false;
        }
  • Mark

    Alexey Хорошо, в следующей публикации сделаю обратную связь.

  • Alexey

    Ура! Спасибо заранее!

  • Alexey

    Добавлю пять копеек по теме, не все же мне флейм разводить 🙂

    Вместо этого:

    1
    2
    3
    4
    function isEmptyCart(){
        if($_SESSION['cart']) return true;
        else return false;
        }

    Я бы написал так:

    1
    2
    3
    4
    5
    6
    7
    8
    function isEmptyCart()
    {
        if($_SESSION['cart'])
            {
                 return true;
             }
        return false;
    }

    То есть, else, на мой взгляд лишний, прошу простить, если я неправ!

  • Mark

    Можно и так, сути не меняет.

  • Alexey

    Да, мелочь, конечно. Надеюсь, в будущем смогу высказываться здесь и по более существенным проблемам 🙂

  • Olexiy

    Mark 07.04.2012 в 15:37
    Спасибо, помогло!

  • Grey

    Mark Спасибо огромное)

  • Alexey

    Марк, не помню, спрашивал или нет — шаблонизаторы вроде smarty вы не будете использовать?
    Просто вроде как считается, php-шный код в файлах представления — не самый лучший стиль.

  • Евгений

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

  • Евгений

    Что то в файле config.php

  • Евгений

    Все файлы(после 3 го урока) кроме config.php пригрузил Warning: strlen() expects parameter 1 to be string, array given in Z:\home\test1.ru\www\application\models\cart.php on line 53

  • Mark

    Евгений проблема решается заменой функций
    clearCart()и isEmptyCart(), смотрите выше в комментариях.

  • Евгений

    Благодарю Марк, внедрить бы только эту корзинку к себе на сайт и можно е-комерцией заняться

  • rosomaha256

    Я надеюсь уроки ещё будут. 🙂 Было б неплохо прикрутить к сайту категории товаров. Ну и админку. Статья супер. Респект и уважуха автору.

  • rosomaha256

    Нашел ещё одну ошибку, когда не выбран товар и пытаетесь сделать заказ вываливаются ворнинги, чтобы исправить нужно добавить инициализацию массивов:

    function printCart()
    {
    $product_positions=array();
    $array_product_id=array();

    • Дiмка

      я считаю во избежании данной ошибки при отсутствии заказа и массива $product_positions просто не создавать интерфейс корзины $table_cart (66 строка models/cart):
      if($product_positions){
      $table_cart=»№НаименованиеСтоимостьКоличествоСуммаУдалить»;…
      и далее по коду, в конце закрыв «}»

  • Денис

    не могу скачать листинги.((

    • Mark

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

  • Денис

    благодарю.

  • rosomaha256

    Надеюсь продолжения ещё будет 🙂
    Начал разбираться со скриптами при использования foreach c массивами лучше делать приведения типов (array) перед переменной, так как переменная может быть не инициализированы и будут выводится предупреждения.

  • Mark

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

  • Макс

    Даже приблизительные сроки не скажите? Очень надо знать. Буду очень признателен если скажите.

  • Mark

    Приблизительно 1 — 2 недели, я сейчас готовлю три другие статьи.

  • Денис

    не подскажите в чем может быть проблема.»
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘.$item[» at line 1″

    после импровизаций с выводом данных начало постоянно выскакивать. если закомментить в «smalcart.php» function getCartData() именно структуру if($this->getCokieCart() && $_SESSION[‘cart’])то ошибка пропадает

  • Денис

    вообще мистика, причем эта ошибка вылазит только Chrome в firefox все работает стабильно

  • Денис

    проблему решил очисткой Cookies

  • Макс

    Mark, чем раньше тем лучше, буду очень благодарен, если раньше выйдет.

  • Andrey

    Представьте, что покупатель добавил три модема в корзину, и стал дальше бродить по сайту. И спустя время, когда он решил оформить заказ, модемов «В наличии» стало 2 шт (один модем купил кто-то другой) . А в корзине у него висит 3 модема, сейчас у него получится оформить заказ на 3 модема. И тогда в поле «В наличии» число изменится на «-1».
    далее
    Чтобы человек не мог оформить заказ на большее кол-во товара, чем есть на складе, нужно всегда после того как пользователь нажимает кнопку «Оформить заказ» делать проверку на соответствие: Число товаров, указанное в корзине, не должно превышать числа, указанного в поле «В наличии» относительно одного товара. Если превосходит, то выдавать сообщение: «Такового-то(здесь указать какой товар) товара на складе: n штук. Пожалуйста, измените кол-во товара в одноименном поле и нажмите «пересчитать» «.

  • rosomaha256

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

  • Andrey

    в прицепе я понял как делать,мы должны после нажатия на кнопку оформить заказ, вызвать БД сравнить кол. товара на складе и количество в корзине, если они >= то происходит оформление товара, если же<= то выводит сообщение что "сори бла бла бла"
    вот только в коде я не могу написать))))

  • Mark

    Ваше предложение взято на заметку, и возможно будет реализовано в следующем уроке.

  • Andrey

    эх мне 3 часа осталось=(

  • Денис

    Ответьте пожалуйста, в каком виде хранятся товары в таблице заказов? и как обратно получить из таблицы список заказанных товаров по № заказа?

  • Mark

    Денис, товары хранятся в поле order_content в сериализованном виде.
    для того, чтобы понять как их от туда извлечь советую почитать статью:
    Сериализация php

  • rosomaha256

    $array_product_id = unserialize(stripcslashes($useritem[‘order_content’]));
    Получит таблицу где ид будет номером строки, доступ так
    foreach(array_keys($array_product_id) as $id){

    Хотя в статье про Сериализацию написано не плохо.

    Кстати, Марк, по поводу работы магазина заметил такую штуку что когда будет готова адмника столкнетесь с проблемой заказов и товара, представте ситуацию что на сайте работает два менеджера один отвечает за товар а второй за заказы, при сериализованым методе хранения данных в заказах могут оказаться не актуальные данные 🙂 Может стоить чуток подправить базу добавив таблицу заказаныетовары(заказ_ид,товар_ид)и сделать зависимость полей, так надежней будет.

  • Mark

    rosomaha256 Вы все очень правильно говорите, если бы я разрабатывал магазин именно для серьезной его работы, то обязательно все это было бы учтено, и вобще многое было бы реализовано иначе. В целях этих уроков, не стоит столь масштабных задач, все опубликованное здесь — направленно на развитие собственного мышления у читателей.
    К сожалению пока не многие также как и вы пытаются разбираться в коде, основная масса просто ждет выхода следующих уроков, чтобы скопипастить готовый функционал. Что немного печалит. Но радует то, что данный цикл статей способствует увеличению подписчиков. )
    По поводу вашего замечания, я думал об этом когда разрабатывал функционал, и частично нашел простой выход из этой ситуации, добавив в таблицу поле — сумма заказа. Т.е. при оформлении заказа, кроме его содержимого записывается сумма всего заказа, и в будущем, если цены на позиции изменятся, это никак не повлияет на информацию о заказе. Проблемой будет только удаление товара, но это можно будет учесть при обработке данных. А и еще сейчас в таблицу не записываются цены по каждой позиции заказа.

  • aleksey_ov

    1. AXAJ -> AJAX;
    2. clearCart()-оТчищает корзину; — буква «Т» тут явно лишняя, аж по глазам режет)

    >>По плану в следующем выпуске, я собираюсь начать писать админскую часть системы

    Ждёмс)

  • Евгений

    Марк не понимаю почему нету новых уроков смысл не в том чтобы кто то научился, а в том что бы скрипт жил. Какая разница, кто умнее тот найдет и усовершенствует скрипт. А так получается, что ВЫ КАК АВТОР ЗАЖАЛИ СКРИПТ, А ЭТО НЕ ХОРОШО ПО ОТНОШЕНИЮ К ЧИТАТЕЛЯМ. ДА ВОЗМОЖНО ВЫ ПРАВЫ МЫ НЕ ХОТИМ РАЗОБРАТЬСЯ, НО МЫ И НЕ ВИДИМ РЕЗУЛЬТАТА. тОГДА ВСТАЕТ ВОПРОС НЕ ПОЧЕМУ, А ЗАЧЕМ ВСЕ ЭТО СЛУШАТЬ … если НЕ ЗНАЕШЬ ВЕРНО ЛИ РЕШЕНИЕ

    • А Вы уважаемый Евгений попробуйте поработать на двух работах, и вести одновременно другие проекты, а также писать статьи к блогу? Быть может тогда поймете почему нет продолжения. Относительно ЗАЖАЛИ скрипт, что — то я ничего не понял… Если бы я его зажал, так и не было бы никаких статей…

      если НЕ ЗНАЕШЬ ВЕРНО ЛИ РЕШЕНИЕ, нужно слушать, и проовать разбираться, чтобы понять действительно ли оно верное. В программировании нету единственного верного решения — это вам не математика.

      МЫ НЕ ХОТИМ РАЗОБРАТЬСЯ, НО МЫ И НЕ ВИДИМ РЕЗУЛЬТАТА

      Какой результат вы ждете? Если нужна готовая CMS, так скачайте опенсорс какойнить, или оплатите комерческое решение. Я выкладываю продолжение по мере его появления. И это не главная моя цель в жизни, поэтому существуют не маленькие задержки между уроками.

    • Alexey

      Евгений, простите, что вмешиваюсь, попробую ваше недовольство направить в конструктивное русло.
      Что, если нам всем по мере сил начать работать по доработке цмс (а делать тут очень многое нужно).
      Марк, что скажете?

    • Я, только — «За!».
      На самом деле мне на почту часто пишут заинтересованные в развитии проекта люди, с различными своими предложениями, и пробами дописать самостоятельно что-то.
      Возможно в скором будущем будет создан отдельный раздел на блоге, в котором можно будет вести обсуждение относительно разрабатываемой системы. И там высказывать свои довольства и недовольства.
      Если вы считаете, что такой раздел действительно нужен , присылайте свои голоса, мне на почту. После набора весомого количества голосов, я создам раздел, а вероятнее всего группу в одной из соц. сетях, для продуктивного общения с разработчиками и просто интересующимися.

  • Дiмка

    Марк, стараюсь глубже вникнуть с суть процесса, возникает много вопросов по поводу класса Lib_DateBase введенного тут, а именно:
    1. в строке 45 в функции sprintf выражение » %s = ‘%s'». Понимаю что то то связанно c типом «s — аргумент трактуется как строка», что именно означает данное выражение??
    2. в функции query() в 11 строке для чего необходимо проверять количество аргументов >1 ?? Возможна ли такая ситуация??
    3. строка 27 функция preg_match, параметр $null. если я правильно понимаю в эту переменную «складывются» результат работу этой функции, но зачем? где используется?
    4. Там же в строке 28 для чего эти условия? как то «не красиво» написано, можно же условия объединить «and»?

    С нетерпением жду ответов, будут еще вопросы)
    Спасибо

    • Дiмка

      Уважаемые Знатоки, я дождусь ответов на свои вопросы???)))

    • 1. %s = ‘%s’ — это выражение означает что в строку будут подставлены ключ=>значение из перезанного в функцию массива.
      2. Не просто возможно, а даже часто встречается пример:
      query(‘select * from [таблица] left join [таблица 2] on [таблица 2].id=’%d’ where [таблица].name like ‘%s’ ‘, $id, $str);
      3. Важен не столько $null сколько результат который возвращает preg_match. Если в запросе не встретились операторы INSERT|UPDATE|DELETE|REPLACE, то можно вернуть количество измененных рядов, иначе, только количество возвращаемых строк. В случае если не то ни другое получить не удалось, значит запрос не прошел, и функция вернет false;
      4. См. 3 пункт.

  • Дiмка

    Спасибо за ответ!
    Хотел бы еще уточнить, по поводу п.2 моего вопроса. Нашел пример использования функции с переменным количеством аргументов в следующем уроке, но если имеем такую функцию

    function query($arg)
    {
    )

    и вызываем ее с тремя аргументами
    query(a1,a2,a3);

    то @arg = a1, те в @arg передается первый аргумент??? так ли это?

    • У меня есть подозрение что в таком случае функция вобще не сработает. Нужно проверить.

    • Дiмка

      «Интересно девки пляшут…» (С)
      В нашем (с позволения сказано) магазине мы так и используем,
      в модели каталога models/catalog в методе getList строка 9 вызываем родительский метод query() с тремя аргументами:
      «SELECT * FROM `product` ORDER BY id LIMIT %d , %d»
      $lower_bound
      $step
      а в родительском классе Lib_DateBase метод query() принимает только один!!! аргумент $query (строка 6)

    • Метод query() как разтаки благодаря функциям func_num_args() и func_get_args(), может принять более одного параметра.

      func_num_args() может быть использована совместно с with func_get_arg() и func_get_args() для создания функций с переменным количеством аргументов.

    • Дiмка

      Согласен, это понятно. Вопрос в другом, в данном случае я правильно понимаю что в переменную $query родительского класса Lib_DateBase попадает именно первый переданный аргумент “SELECT * FROM `product` ORDER BY id LIMIT %d , %d”, к другим мы получаем доступ уже использую функцию func_get_args()?
      Без перечисленных тобой функций мы просто не получим доступ к другим аргументам (хоть сотню), и метод query($query) будет работать только с первым преданным ему аргументом?

    • Да, все верно. Просто я думал что если не использовать эти функции, то при попытке передать больше одного параметра, вывалится — ошибка. Сейчас проверил — ошибка не выходит, передается только первый параметр. Ты был прав.

  • Евгений

    Почему при в ходе в админ панель выкидывает непонятно куда ищет путь> enter что делать стоит последний денвер а все Ваши сборки не могут запуститься то был не правильно в конфиге указан путь к файлам mg-core то кучу други ошибок выдает как решить проблемы?

  • Елена

    Марк, у меня опять проблема. В корзине товар не добавляется, каждый раз количество =1, меняется только сумма, и при нажатии на оформить заказ, выдает «корзина пуста» и
    Warning: array_keys() [function.array-keys]: The first argument should be an array in T:\home\proba\www\application\models\cart.php on line 12

    Warning: Invalid argument supplied for foreach() in T:\home\proba\www\application\models\cart.php on line 62

    Warning: Invalid argument supplied for foreach() in T:\home\proba\www\application\models\cart.php on line 68
    в сессии похоже данные из каталога не сохраняются массивом?

    • Елена, что-то много у вас странных, ошибок. Вы самостоятельно не вносили изменения в файлы архива? Теоретически выложенная версия не должна вызывать таких ошибок ( Если файлый не подвергались изменениям, то такая ошибка могла быть вызвана только если в браузере отключены куки, что мало вероятно.

  • Елена

    Спасибо, Марк! Извините за странные ошибки. Куки, конечно, включены. Переписала еще раз файлы из архива и все заработало. Видимо когда боролась с предыдущими проблемами что-то закомментировала.

  • maksim

    Здравствуйте! У меня почему то хостер ругается на эту строчку php_flag magic_quotes_gpc Off выдает 500 ошибку.Можно обойтись без этой строчки?

    • Если на вашем хостинге нельзя выключить магические кавычки, попробуйте удалить эту строку. Теоретически движок работать будет, но возможно будет менее защищен от sql инъекций.

  • Евгений

    При оформлении заказа , если карзина пуста, выбивает
    Warning: Invalid argument supplied for foreach() in Z:\home\…\application\models\cart.php on line 68
    Каким образом это можно поправить ?

    • Евгений К

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

    • Нужно проверить массив на пустоту перед работой с ним посмотрите на строку 68 в cart.php, какой там массив проверяется?

  • Samigo

    Давно не заходил.
    Изменения много. 🙂
    И спасибо за Ваши старания!

    Это элементарно, но у Вас опечатка:
    $array_product_id[$id]=(int)$count;
    если не ошибаюсь, должен быть:
    $array_product_id[$id]=int($count);

    • Спасибо.
      Нет это не опечатка, так и должно быть.

    • Дiмка

      Это специальный формат приведение типа в php. В данном случае к целому числу типа int.
      Подробности можно прочесть тут

  • Samigo

    А я не знал о таком «Манипуляции с типами».
    Mark, Дiмка спасибо!

  • Сергей

    Notice: Undefined index: User in C:\WebServers\home\korzina\www\lib\menu.php on line 20

    Notice: Undefined index: cart in C:\WebServers\home\korzina\www\lib\smalcart.php on line 30

    нету инициализации сесионной переменной … где её прописать

    if (isset($_SESSION[‘cart’])) $_SESSION[‘cart’]=» else …. где эта строка??

  • Катерина

    Марк,подскажите как сделать корзину на ajax, буду очень благодарна

  • Александр

    Добрый день!
    Читаю Ваш блог и хочу связать с Вами, есть несколько вопросов по интернет магазину, хочу попросить помощи. Не подскажите Ваш email, можно мне прислать на почту письмо.

  • Ирина

    Здравствуйте, Марк. Подскажите, пожалуйста, что означает ошибка Warning: array_keys() expects parameter 1 to be array, null given in Z:\home\shop.ru\www\application\models\cart.php on line 12 и почему она возникает?

    • Ошибка говорит о том, что в функцию array_keys() передается пустое значение, а должен передаваться массив.

  • Ирина

    Добрый вечер, Марк.
    Прошу прощения за навязчивость, но нельзя ли чуток доработать корзину следующим образом: в колонке «количество» добавить счетчики слева «-«, а справа «+» от количества заказанного товара?
    С уважением, читатель блога.

  • Дарья

    Добрый вечер.
    Никак не могу разобраться с сериализацией. Как же просмотреть полученный заказ из базы данных? И где Вы реализовали просмотр заказов в Вашем примере?

    • Полученную строку надо десериализировать применив предварительно удалив из нее слеши.

  • Алена

    Важный момент очень упущен, как администратору посмотрит что заказали на сайте. То есть без знаний php это сделать очень проблематично.

  • Катерина

    Подскажите пожалуйста, хочу добавить на страницу продуктов выборку размера обуви, создала базу sizen, в которой указала размер обуви (size), url продукта. Как мне записать этот код в виде функции…

    <? $result = mysql_query("SELECT size FROM sizen,product WHERE product.url=sizen.url=product.code");

    while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
    printf (" %s» , $row[«size»]);
    }
    mysql_free_result($result);
    ?>

    он работает, только на странице views и нет привязки к выбранному url

  • Лолита

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

    Спасибо.

  • Сергей Успенский

    Марк, выражаю благодарность за ваш труд, вы большой молодец! Материал подаёте лаконично и понятно. Лично мной, ещё на этапе прочтения первой части этой статьи стало понятно: у вас большие перспективы. Удачи вам в ваших делах!

  • Лис

    Доброго времени суток! Подскажите пожалуйста.
    Вот я из таблицы order вывожу содержимое на страницу.
    Все содержимое выводится и как я вижу оформленные заказы, но в поле order_content отображает шайтан коды неизвестного происхождения и ни как не получается в место всего этого отобразить название товара который пользователь заказал.

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

    Подписаться на комментарии к этой статье по RSS

    Яндекс.Метрика