Только для читателей Lifeexample возможно открыть интернет-магазин на Moguta.CMS со скидкой в 15%
Корзина товаров и оформление заказа
Здравствуйте уважаемые читатели блога LifeExample, наконец-то пришло время продолжить создание интернет магазина на php. В предыдущих уроках мы многое сделали, и для начальной работы, нашему интернет магазину не хватает только формы редактирования корзины и модуля оформления заказа. Сегодня мы завершим начальный этап создания интернет магазина, и доведем нашу mvc систему до первого релиза.
Работы предстоит много, поэтому больше воды не будет, далее только по существу.
Чтобы вам было удобно ориентироваться в коде, скачайте последнюю версию системы.
Модуль корзины товаров
Поехали! Начнем с реализации модуля корзины товаров. Так как интерфейс управления корзиной будет находиться на отдельной странице, давайте создадим соответствующие одноименные файлы cart.php в папках views, model, controller. Напомню, что файл в папке views отвечает за внешний вид компонента, и выводит его на страницу. С него мы и начнем, вот как мы хотим видеть форму корзины в итоге:

Наша корзина должна уметь:
- Изменять количество товаров;
- Удалять выбранные позиции;
- Пересчитывать сумму к оплате;
Такой минимальный функционал доступен в любом интернет магазине, поэтому остановимся пока на этом. А в дальнейшем, когда узнаем что такое формат 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 ленту блога.
Комментарии
Марк, наконец-то! Спасибо!
На здоровье,задавайте вопросы, если чего не понятно. 😉
Извиняюсь за беспокойство, я в этом деле вообще 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,название и цена товара и мне надо как у Вас сделать чтоб можно было увеличивать кол-во или удалить товар а потом все это подсчитать и отправить даные на обработку?
Конечно можно, нужно будет изменить, представление вашей корзины, в соответствии с представлением из данного примера, и все будет работать.
Спасибо а какие файлы мне нужны будут (из скачаных выше)?
Grey в какой момент у вас появляется эта ошибка? При загрузке любой страницы магазина? Или при добавлении в корзину, товара.
Игорь я не совсем понял, а вы разрабатываете магазин по ходу выпуска статей, на рассмотренном в них патерне MVC? Или же вы хотите прикрутить корзину к другому коду?
К другому коду
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
$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;
}
Тогда я думаю нет смысла пытаться прикручивать php скрипты из данного урока, проще разработать индивидуальное решение для вашей системы. В противном случае, вам придется перелопатить все что у вас есть, и сделать максимально похожим на то что предлагаю я. Как следствие из этого, я могу вам посоветовать просто скопировать весь архив моего движка, импортировать дамп базы данных и пробовать разбираться с системой, либо уже ее дорабатывать. Вот ссылка по которой можно посмотреть демо версию Демо версия рассматриваемого интернет магазина
Марк, два вопроса!
1. (По этой статье) Кнопку «пересчитать» в будущем планируете убрать и заменить AJAX-овским автообновлением? Я угадал? 🙂
2. Планируется ли раздел «обратная связь» с формуляром, когда клиент отсылает сообщение в формуляре feedback,
а админ получает его по емейлу?
Спасибо!
Alexey
Угадали, в будущем корзина будет на аяксе, уже готовлю статью на эту тему. По части feedback, в планах нечего не было.
1. Ясно!
2. Насчет feedback — жалко, вещь важная, но не смею Вам ничего навязывать, Вам виднее, как строить курс.
Буду искать, как это сделать, своими силами, так сказать 🙂
Чтобы реализовать feedback много телодвижений делать не надо, там все очень просто. Делаете форму, и в скрипте обработав данные отправляете их на укаханный e-mail стандартной функцией mail().
При нажатии «оформить заказ»
Grey 07.04.2012 в 07:22
Та же проблема
«Mark
Чтобы реализовать feedback много телодвижений делать не надо, там все очень просто. Делаете форму, и в скрипте обработав данные отправляете их на укаханный e-mail стандартной функцией mail().»
Знать бы еще, как формуляр для фидбека грамотно внедрить в вашу mvc-парадигму 🙂
Насчет функции mail(), я слышал, используют в основном опенсорс framework phpMail для
таких задач.
Olexiy и Grey
Попробуйте заменить функции в модели cart.php
2
3
unset($_SESSION['cart']);
}
и
2
3
4
if($_SESSION['cart']) return true;
else return false;
}
Alexey Хорошо, в следующей публикации сделаю обратную связь.
Ура! Спасибо заранее!
Добавлю пять копеек по теме, не все же мне флейм разводить 🙂
Вместо этого:
2
3
4
if($_SESSION['cart']) return true;
else return false;
}
Я бы написал так:
2
3
4
5
6
7
8
{
if($_SESSION['cart'])
{
return true;
}
return false;
}
То есть, else, на мой взгляд лишний, прошу простить, если я неправ!
Можно и так, сути не меняет.
Да, мелочь, конечно. Надеюсь, в будущем смогу высказываться здесь и по более существенным проблемам 🙂
Mark 07.04.2012 в 15:37
Спасибо, помогло!
Mark Спасибо огромное)
Марк, не помню, спрашивал или нет — шаблонизаторы вроде 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
Евгений проблема решается заменой функций
clearCart()и isEmptyCart(), смотрите выше в комментариях.
Благодарю Марк, внедрить бы только эту корзинку к себе на сайт и можно е-комерцией заняться
Я надеюсь уроки ещё будут. 🙂 Было б неплохо прикрутить к сайту категории товаров. Ну и админку. Статья супер. Респект и уважуха автору.
Нашел ещё одну ошибку, когда не выбран товар и пытаетесь сделать заказ вываливаются ворнинги, чтобы исправить нужно добавить инициализацию массивов:
function printCart()
{
$product_positions=array();
$array_product_id=array();
я считаю во избежании данной ошибки при отсутствии заказа и массива $product_positions просто не создавать интерфейс корзины $table_cart (66 строка models/cart):
if($product_positions){
$table_cart=»№НаименованиеСтоимостьКоличествоСуммаУдалить»;…
и далее по коду, в конце закрыв «}»
не могу скачать листинги.((
В связи с переездом на другой хостинг получилась такая ерунда. Приношу извинения, теперь все работает. Можете скачивать.
благодарю.
Надеюсь продолжения ещё будет 🙂
Начал разбираться со скриптами при использования foreach c массивами лучше делать приведения типов (array) перед переменной, так как переменная может быть не инициализированы и будут выводится предупреждения.
rosomaha256 Продолжение обязательно будет. Но по срокам пока ничего не скажу. В следующем уроке будут учтены все ваши замечания.
Даже приблизительные сроки не скажите? Очень надо знать. Буду очень признателен если скажите.
Приблизительно 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, чем раньше тем лучше, буду очень благодарен, если раньше выйдет.
Представьте, что покупатель добавил три модема в корзину, и стал дальше бродить по сайту. И спустя время, когда он решил оформить заказ, модемов «В наличии» стало 2 шт (один модем купил кто-то другой) . А в корзине у него висит 3 модема, сейчас у него получится оформить заказ на 3 модема. И тогда в поле «В наличии» число изменится на «-1».
далее
Чтобы человек не мог оформить заказ на большее кол-во товара, чем есть на складе, нужно всегда после того как пользователь нажимает кнопку «Оформить заказ» делать проверку на соответствие: Число товаров, указанное в корзине, не должно превышать числа, указанного в поле «В наличии» относительно одного товара. Если превосходит, то выдавать сообщение: «Такового-то(здесь указать какой товар) товара на складе: n штук. Пожалуйста, измените кол-во товара в одноименном поле и нажмите «пересчитать» «.
Это складской учет, как на меня идея конечно хорошая но рано это делать. Данная ситуация в инет магазинах решается по другому ( после заказа менеджер смотрит есть ли в наличии и если нет то заказывает или сообщает покупателю что данный товар будет позже).
в прицепе я понял как делать,мы должны после нажатия на кнопку оформить заказ, вызвать БД сравнить кол. товара на складе и количество в корзине, если они >= то происходит оформление товара, если же<= то выводит сообщение что "сори бла бла бла"
вот только в коде я не могу написать))))
Ваше предложение взято на заметку, и возможно будет реализовано в следующем уроке.
эх мне 3 часа осталось=(
Ответьте пожалуйста, в каком виде хранятся товары в таблице заказов? и как обратно получить из таблицы список заказанных товаров по № заказа?
Денис, товары хранятся в поле order_content в сериализованном виде.
для того, чтобы понять как их от туда извлечь советую почитать статью:
Сериализация php
$array_product_id = unserialize(stripcslashes($useritem[‘order_content’]));
Получит таблицу где ид будет номером строки, доступ так
foreach(array_keys($array_product_id) as $id){
Хотя в статье про Сериализацию написано не плохо.
Кстати, Марк, по поводу работы магазина заметил такую штуку что когда будет готова адмника столкнетесь с проблемой заказов и товара, представте ситуацию что на сайте работает два менеджера один отвечает за товар а второй за заказы, при сериализованым методе хранения данных в заказах могут оказаться не актуальные данные 🙂 Может стоить чуток подправить базу добавив таблицу заказаныетовары(заказ_ид,товар_ид)и сделать зависимость полей, так надежней будет.
rosomaha256 Вы все очень правильно говорите, если бы я разрабатывал магазин именно для серьезной его работы, то обязательно все это было бы учтено, и вобще многое было бы реализовано иначе. В целях этих уроков, не стоит столь масштабных задач, все опубликованное здесь — направленно на развитие собственного мышления у читателей.
К сожалению пока не многие также как и вы пытаются разбираться в коде, основная масса просто ждет выхода следующих уроков, чтобы скопипастить готовый функционал. Что немного печалит. Но радует то, что данный цикл статей способствует увеличению подписчиков. )
По поводу вашего замечания, я думал об этом когда разрабатывал функционал, и частично нашел простой выход из этой ситуации, добавив в таблицу поле — сумма заказа. Т.е. при оформлении заказа, кроме его содержимого записывается сумма всего заказа, и в будущем, если цены на позиции изменятся, это никак не повлияет на информацию о заказе. Проблемой будет только удаление товара, но это можно будет учесть при обработке данных. А и еще сейчас в таблицу не записываются цены по каждой позиции заказа.
1. AXAJ -> AJAX;
2. clearCart()-оТчищает корзину; — буква «Т» тут явно лишняя, аж по глазам режет)
>>По плану в следующем выпуске, я собираюсь начать писать админскую часть системы
Ждёмс)
Марк не понимаю почему нету новых уроков смысл не в том чтобы кто то научился, а в том что бы скрипт жил. Какая разница, кто умнее тот найдет и усовершенствует скрипт. А так получается, что ВЫ КАК АВТОР ЗАЖАЛИ СКРИПТ, А ЭТО НЕ ХОРОШО ПО ОТНОШЕНИЮ К ЧИТАТЕЛЯМ. ДА ВОЗМОЖНО ВЫ ПРАВЫ МЫ НЕ ХОТИМ РАЗОБРАТЬСЯ, НО МЫ И НЕ ВИДИМ РЕЗУЛЬТАТА. тОГДА ВСТАЕТ ВОПРОС НЕ ПОЧЕМУ, А ЗАЧЕМ ВСЕ ЭТО СЛУШАТЬ … если НЕ ЗНАЕШЬ ВЕРНО ЛИ РЕШЕНИЕ
А Вы уважаемый Евгений попробуйте поработать на двух работах, и вести одновременно другие проекты, а также писать статьи к блогу? Быть может тогда поймете почему нет продолжения. Относительно ЗАЖАЛИ скрипт, что — то я ничего не понял… Если бы я его зажал, так и не было бы никаких статей…
если НЕ ЗНАЕШЬ ВЕРНО ЛИ РЕШЕНИЕ, нужно слушать, и проовать разбираться, чтобы понять действительно ли оно верное. В программировании нету единственного верного решения — это вам не математика.
МЫ НЕ ХОТИМ РАЗОБРАТЬСЯ, НО МЫ И НЕ ВИДИМ РЕЗУЛЬТАТА
Какой результат вы ждете? Если нужна готовая CMS, так скачайте опенсорс какойнить, или оплатите комерческое решение. Я выкладываю продолжение по мере его появления. И это не главная моя цель в жизни, поэтому существуют не маленькие задержки между уроками.
Евгений, простите, что вмешиваюсь, попробую ваше недовольство направить в конструктивное русло.
Что, если нам всем по мере сил начать работать по доработке цмс (а делать тут очень многое нужно).
Марк, что скажете?
Я, только — «За!».
На самом деле мне на почту часто пишут заинтересованные в развитии проекта люди, с различными своими предложениями, и пробами дописать самостоятельно что-то.
Возможно в скором будущем будет создан отдельный раздел на блоге, в котором можно будет вести обсуждение относительно разрабатываемой системы. И там высказывать свои довольства и недовольства.
Если вы считаете, что такой раздел действительно нужен , присылайте свои голоса, мне на почту. После набора весомого количества голосов, я создам раздел, а вероятнее всего группу в одной из соц. сетях, для продуктивного общения с разработчиками и просто интересующимися.
Марк, стараюсь глубже вникнуть с суть процесса, возникает много вопросов по поводу класса Lib_DateBase введенного тут, а именно:
1. в строке 45 в функции sprintf выражение » %s = ‘%s'». Понимаю что то то связанно c типом «s — аргумент трактуется как строка», что именно означает данное выражение??
2. в функции query() в 11 строке для чего необходимо проверять количество аргументов >1 ?? Возможна ли такая ситуация??
3. строка 27 функция preg_match, параметр $null. если я правильно понимаю в эту переменную «складывются» результат работу этой функции, но зачем? где используется?
4. Там же в строке 28 для чего эти условия? как то «не красиво» написано, можно же условия объединить «and»?
С нетерпением жду ответов, будут еще вопросы)
Спасибо
Уважаемые Знатоки, я дождусь ответов на свои вопросы???)))
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 пункт.
Спасибо за ответ!
Хотел бы еще уточнить, по поводу п.2 моего вопроса. Нашел пример использования функции с переменным количеством аргументов в следующем уроке, но если имеем такую функцию
function query($arg)
{
)
и вызываем ее с тремя аргументами
query(a1,a2,a3);
то @arg = a1, те в @arg передается первый аргумент??? так ли это?
У меня есть подозрение что в таком случае функция вобще не сработает. Нужно проверить.
«Интересно девки пляшут…» (С)
В нашем (с позволения сказано) магазине мы так и используем,
в модели каталога 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() для создания функций с переменным количеством аргументов.
Согласен, это понятно. Вопрос в другом, в данном случае я правильно понимаю что в переменную $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
в сессии похоже данные из каталога не сохраняются массивом?
Елена, что-то много у вас странных, ошибок. Вы самостоятельно не вносили изменения в файлы архива? Теоретически выложенная версия не должна вызывать таких ошибок ( Если файлый не подвергались изменениям, то такая ошибка могла быть вызвана только если в браузере отключены куки, что мало вероятно.
Спасибо, Марк! Извините за странные ошибки. Куки, конечно, включены. Переписала еще раз файлы из архива и все заработало. Видимо когда боролась с предыдущими проблемами что-то закомментировала.
Здравствуйте! У меня почему то хостер ругается на эту строчку 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, какой там массив проверяется?
Давно не заходил.
Изменения много. 🙂
И спасибо за Ваши старания!
—
Это элементарно, но у Вас опечатка:
$array_product_id[$id]=(int)$count;
если не ошибаюсь, должен быть:
$array_product_id[$id]=int($count);
Спасибо.
Нет это не опечатка, так и должно быть.
Это специальный формат приведение типа в php. В данном случае к целому числу типа int.
Подробности можно прочесть тут
А я не знал о таком «Манипуляции с типами».
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 отображает шайтан коды неизвестного происхождения и ни как не получается в место всего этого отобразить название товара который пользователь заказал.