Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/26: Рейтинг темы: голосов - 26, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 12.05.2012
Сообщений: 69

Подключение к Бд через ООП. Написание класса корзины

03.12.2012, 14:16. Показов 5006. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот небольшой пример кода, как будет использоваться подключение. Правильно ли это?
Или как вообще лучше сделать?

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php 
class cart() {
    
    private $db; 
    private $db_server;
    private $db_login;
    private $db_password;
    private $db_name;
    
    
    public $user_id;
    
    //Инициализация параметров при создании класса
    function __construct() {
        //Получение $user_id пользователя
        //Соединение с базой данных
        $this->db = @mysqli_connect($this->db_server, $this->db_login, $this->db_password, $this->db_name) or die("Ошибка соединения с базой данных: ".mysqli_connect_error());
        
        
    }
    //Операция соединения с базой данных
    function db_connect() {
        
        
    }
    
    //Операзция вывода содержания корзины
    function show_cart() {
        $query="select * from cart";
        $result=mysqli_query($this->db,$query) or die("MySQL error: " . mysqli_error($this->db) . "<hr>\nQuery: $query");
        return TRUE;
    }
    
    //Операция добавления товара в корзину
    function add_in_cart($node_id) {
        
    }
    
    //Операция удаления товара из корзины
    function delet_from_cart() {
        
    }
    
    //
    
}
?>
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.12.2012, 14:16
Ответы с готовыми решениями:

Создание корзины PHP MVC ООП
Всем добра. У меня такая вот запара. Я не могу понять как правильно написать и поделить код по MVC да и еще так что бы через ссессию....

ООП. Обращение к свойству дочернего класса через базовый абстрактный
Всем привет, появился у меня такой вопрос Есть у меня абстрактный класс Animal у которого есть 2 поля - имя и год рождения. Дальше есть...

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

19
26 / 26 / 1
Регистрация: 30.09.2011
Сообщений: 196
03.12.2012, 15:32
а на фига корзину в БД запихивать? достаточно держать в сессии.
0
 Аватар для Василий Макогон
270 / 226 / 11
Регистрация: 20.04.2012
Сообщений: 817
03.12.2012, 16:05
Цитата Сообщение от caballero Посмотреть сообщение
а на фига корзину в БД запихивать? достаточно держать в сессии.
как минимум - восстановление данных для зарегистрированного пользователя.

Правильно ли это?
нет
http://wiki.agiledev.ru/doku.p... n_php_code

наилучшее решение - впрыскивать в объект корзины инстанс класса БД. но поскольку у тебя такого нет, то делай как знаешь.

Добавлено через 1 минуту
PHP
1
or die
огоспади, да забудьте вы про этот дурацкий die() и изучите исключения (хотя там изучать особо нечего) и в случае чего показывайте пользователям нормальные страницы, а не ничего для него не значащий mysql error

Добавлено через 1 минуту
UPD: не увидел, что ты юзаешь mysqli, думал это mysql обычный. передавай в конструктор корзины $db и будет все ок.
1
26 / 26 / 1
Регистрация: 30.09.2011
Сообщений: 196
03.12.2012, 16:26
как минимум - восстановление данных для зарегистрированного пользователя.
думаете пользователь в течение месяца будет складывать товар в корзину?
в подавляющем числе случаев покупается один товар, поэтому приличные инет магазины кроме кнопки "в корзину" имеют кнопку "купить" чтобы юзер сразу попадал на формирование заказа а не лазил по корзинам, не говоря уже о мало кому нужной регистрации.
0
 Аватар для Василий Макогон
270 / 226 / 11
Регистрация: 20.04.2012
Сообщений: 817
03.12.2012, 16:34
это вам кажется)
пользователь добавил товар, но денег купить нет или он тупо ушел покурить
0
26 / 26 / 1
Регистрация: 30.09.2011
Сообщений: 196
03.12.2012, 16:49
пользователь добавил товар, но денег купить нет или он тупо ушел покурить
так никто не делает - не совецкие времена что надо очередь занять
если человеку надо сделать заказ и он уже сделал выбор он просто делает заказ - секунда делов.

Просто у новичкоы есть веще которые они считают сакральными - ООП, MVC, корзина, админака, регистрация и т.д.
На самом деле псетителям сайта большинство которых не програмисты на это начхать - им либу удоьно пользоватся сайтом либо нет.
Как показывает статистика, около 40% процентов юзеров уходят на другой аналогичный сайт только потому что их регистрировтся заставляют.
Если товар пропал с корзины гораздо быстрее его туда опять закинуть чем регистрироватся чтобы его вытащили с БД.
0
0 / 0 / 0
Регистрация: 12.05.2012
Сообщений: 69
03.12.2012, 18:45  [ТС]
Я решил, что корзина будет в БД. Мне так лучше. Причин для этого дстаточно.
0
 Аватар для Василий Макогон
270 / 226 / 11
Регистрация: 20.04.2012
Сообщений: 817
03.12.2012, 18:50
Цитата Сообщение от caballero Посмотреть сообщение
так никто не делает - не совецкие времена что надо очередь занять
если человеку надо сделать заказ и он уже сделал выбор он просто делает заказ - секунда делов.

Просто у новичкоы есть веще которые они считают сакральными - ООП, MVC, корзина, админака, регистрация и т.д.
На самом деле псетителям сайта большинство которых не програмисты на это начхать - им либу удоьно пользоватся сайтом либо нет.
Как показывает статистика, около 40% процентов юзеров уходят на другой аналогичный сайт только потому что их регистрировтся заставляют.
Если товар пропал с корзины гораздо быстрее его туда опять закинуть чем регистрироватся чтобы его вытащили с БД.
про юзабилити я понимаю..

но сессия - это не очень хорошее решение для хранения данных, которые можно хранить в БД.
вероятность того, что чел вернется на сайт - высока и заново искать товар возможно не захочет
и регистрация тут не нужна, достаточно кидать уникальную куку и использовать её как ID корзины
захотел пользователь авторизоваться или зарегиться - берем корзину не авторизованного пользователя и вытягиваем данные, кладем в корзину авторизованного пользователя. удобно. ушел юзер - данные сохранены в корзине. а сессии это фи, мусорщик сессию удалит и плакал возможный заказ.
0
0 / 0 / 0
Регистрация: 12.05.2012
Сообщений: 69
03.12.2012, 18:54  [ТС]
да я решил что будет именно так. товары хранятся в БД, оттуда же формируется уникальный идентификатор товара данного юзера, наподобие номера заказа.

мне бы вот примеры работы с базой данных через ООП
0
 Аватар для Василий Макогон
270 / 226 / 11
Регистрация: 20.04.2012
Сообщений: 817
03.12.2012, 18:56
Цитата Сообщение от picusus Посмотреть сообщение
мне бы вот примеры работы с базой данных через ООП
Сложно, но понять стоит:
http://wiki.agiledev.ru/doku.p... ata_mapper
http://www.design-pattern.ru/p... apper.html

http://habrahabr.ru/post/148701/ - что должна делать обертка над БД
1
0 / 0 / 0
Регистрация: 12.05.2012
Сообщений: 69
03.12.2012, 18:57  [ТС]
Цитата Сообщение от Василий Макогон Посмотреть сообщение
Сложно, но понять стоит:
http://wiki.agiledev.ru/doku.p... ata_mapper
http://www.design-pattern.ru/p... apper.html

http://habrahabr.ru/post/148701/ - что должна делать обертка над БД
постараюсь разобраться. спасибо
0
26 / 26 / 1
Регистрация: 30.09.2011
Сообщений: 196
03.12.2012, 19:00
вероятность того, что чел вернется на сайт - высока и заново искать товар возможно не захочет
гораздо более высока вероятность что он закажет товар сразу после того как решит его купить.
подавляющее число инет магазинов - электронные гаджеты и иже с ними а не каждодневные продукты питания.
хранение в БД не помешает но смысла в таком функционале немного с учетом того что мало кто станет регистрироватся чтобы купить товар.

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

Добавлено через 1 минуту
мне бы вот примеры работы с базой данных через ООП
PDO - уже готоые классы
0
 Аватар для Василий Макогон
270 / 226 / 11
Регистрация: 20.04.2012
Сообщений: 817
03.12.2012, 19:04
caballero, вы идете по принципу наименьшего сопротивления. это хорошо, но простотам в дальнейшем обернется переписыванием кода )

Добавлено через 4 минуты
PDO - уже готоые классы
http://habrahabr.ru/post/148701/
хорошо про PDO написано в пункте "Многословность".
0
26 / 26 / 1
Регистрация: 30.09.2011
Сообщений: 196
03.12.2012, 19:15
вы идете по принципу наименьшего сопротивления. это хорошо, но простотам в дальнейшем обернется переписыванием кода )
как показывает практика - переписывается или просто путается под руками код который написан "на всякий случай"

Бритва Оккама - не создавайте сущности сверх необходимого.

хорошо про PDO написано в пункте "Многословность".
Код написаный новичками такими как ТС будет не только намного более многословен но и намного менее работоспособен.
0
0 / 0 / 0
Регистрация: 12.05.2012
Сообщений: 69
03.12.2012, 23:02  [ТС]
Даже не знаю, жду критики от вас. Чтобы вы изменили???

По сути написал я корзину. Потом буду модифицировать её.
А так полностью рабочий код.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
<?php 
class cart {
    
    private $db; 
    private $db_server="localhost";
    private $db_login="";
    private $db_password="";
    private $db_name="";
    
    //Установка параметров для оплаты через робокассу
    private $mrh_login = "";
    private $mrh_pass1 = "";
 
    // номер заказа
    // number of order
    private $inv_id = 0;
 
    // описание заказа
    // order description
    private $inv_desc = "ROBOKASSA Advanced User Guide";
 
    // сумма заказа
    // sum of order
    private $out_summ = 0;
 
    // тип товара
    // code of goods
    private $shp_item = "";
 
    // предлагаемая валюта платежа
    // default payment e-currency
    private $in_curr = "";
 
    // язык
    // language
    private $culture = "ru";
    
    public $user_id;
    public $products_qty_in_cart=0;
    public $summ_products_prices=0;
    public $products=array();
    
    //Паарметры для оплаты.
    
    //Инициализация параметров при создании класса
    function __construct($user_id) {
        //Соединение с базой данных
        $this->db = @mysqli_connect($this->db_server, $this->db_login, $this->db_password, $this->db_name) or die("Ошибка соединения с базой данных: ".mysqli_connect_error());
        
        //Установка значения $user_id для класса
        $this->user_id=$user_id;    
    }
    
    //Операзция вывода содержания корзины
    function show_cart() {
        if($this->products_qty_in_cart==0) {
            echo "В вашей корзине пока ещё нет товаров.";
        }
        else {
            echo '<form id="cart" name="cart" method="post" action="http://test.robokassa.ru/Index.aspx">';
            echo '<table width="200" border="1">';
            for($i=0;$i<$this->products_qty_in_cart; $i++) {
            echo "<tr>";
            echo "<td>Описание: ".$this->products[$i][2]."</td>";
            echo "<td>Количество: ".$this->products[$i][4]."</td>";
            echo "<td>Цена: ".$this->products[$i][3]."</td>";
            echo "<td><a href='http://www.approbo.ru/cart?action=delete&id=".$this->products[$i][0]."'>Удалить</a>";
            echo "</tr>";
            }
            echo "<tr><td>&nbsp;</td><td>&nbsp;</td><td>Сумма: <b>".$this->summ_products_prices."</b></td><td>&nbsp;</td></tr>";
            echo '</table>';
            //Передача значений для оплаты.
    print   "<input type=hidden name=MrchLogin value=$this->mrh_login>".
            "<input type=hidden name=OutSum value=$this->out_summ>".
            "<input type=hidden name=InvId value=$this->inv_id>".
            "<input type=hidden name=Desc value='$this->inv_desc'>".
            "<input type=hidden name=SignatureValue value=$this->crc>".
            "<input type=hidden name=Shp_item value='$this->shp_item'>".
            "<input type=hidden name=IncCurrLabel value=$this->in_curr>".
            "<input type=hidden name=Culture value=$this->culture>";
            echo '<input type="submit" name="payment" id="payment" value="Оплатить" /></form>';
        }   
 
    }
    
    //Операция добавления товара в корзину
    function add_in_cart($node_id) {
    $query="INSERT INTO cart VALUES (NULL, '".$this->user_id."', '".$node_id."', '1')";
    $result=mysqli_query($this->db,$query) or die("MySQL error: " . mysqli_error($this->db) . "<hr>\nQuery: $query");
    return TRUE; 
    }
    
    //Операция удаления товара из корзины
    function delete_from_cart($id) {
        $query="DELETE FROM cart WHERE id = ".$id." and uid=".$this->user_id;
        $result=mysqli_query($this->db,$query) or die("MySQL error: " . mysqli_error($this->db) . "<hr>\nQuery: $query");
        return TRUE;
    }
    
    //Операция получения стоимости товара по его $node_id
    function get_node_price($node_id) {
        $query="select field_price_value from field_data_field_price where entity_id='".$node_id."'";
    $result=mysqli_query($this->db,$query) or die("MySQL error: " . mysqli_error($this->db) . "<hr>\nQuery: $query");
    $num_results=mysqli_num_rows($result);
        if($num_results==1) {
            $row=mysqli_fetch_assoc($result);
            $price=$row['field_price_value'];
        }
        else {
            exit("Error 1");
        }
        
    return $price;  
    }
    
    
    //Получение массива параметров корзины пользователя
    function get_products_param() {
        $this->summ_products_prices=0;
        
        $query="select * from cart where uid=".$this->user_id;
        $result=mysqli_query($this->db,$query) or die("MySQL error: " . mysqli_error($this->db) . "<hr>\nQuery: $query");
        $this->products_qty_in_cart=mysqli_num_rows($result); //Кол-во товаров в корзине
        for($i=0;$i<$this->products_qty_in_cart; $i++) {
            $row=mysqli_fetch_assoc($result);
            $this->products[$i][0]=$row['id']; //Идентификатор товара в корзине
            $this->shp_item.=$row['id'].";";
            $this->products[$i][1]=$row['uid']; //Идентификатор пользователя
            $this->products[$i][2]=$row['pid']; //Номер товара $node_id
            $this->products[$i][3]=$this->get_node_price($row['pid']); //Стоимость товара
            $this->summ_products_prices=$this->summ_products_prices+$this->products[$i][3];
            $this->out_summ=$this->summ_products_prices;
            $this->products[$i][4]=$row['qty']; //Кол-во
        }
        // формирование подписи
        // generate signature
        $this->crc  = md5("$this->mrh_login:$this->out_summ:$this->inv_id:$this->mrh_pass1:Shp_item=$this->shp_item");
        
    }
    
}
 
global $user;
$user_id=$user->uid;
 
 
//Отображение корзины. 
 
if(isset($_POST['action']) && isset($_POST['node_id'])) {
    if($_POST['action']=="add") {
        $cart=new cart($user_id);
        $cart->add_in_cart($_POST['node_id']);
        $cart->get_products_param();
        $cart->show_cart();
    }
}
elseif(isset($_GET['action']) && isset($_GET['id'])) {
    if($_GET['action']=="delete") {
        $cart=new cart($user_id);
        $cart->delete_from_cart($_GET['id']);
        $cart->get_products_param();
        $cart->show_cart();
    }
}
else {
    $cart=new cart($user_id);
    $cart->get_products_param();
    $cart->show_cart();
}
 
?>
0
26 / 26 / 1
Регистрация: 30.09.2011
Сообщений: 196
03.12.2012, 23:51
вывод HTML через echo?
Мде...
0
03.12.2012, 23:56

Не по теме:

caballero, через print тоже.. :victory:

0
 Аватар для Василий Макогон
270 / 226 / 11
Регистрация: 20.04.2012
Сообщений: 817
04.12.2012, 00:09
picusus, http://www.phpinfo.su/articles... v_php.html
0
0 / 0 / 0
Регистрация: 12.05.2012
Сообщений: 69
04.12.2012, 00:59  [ТС]
Мне не надо никакой шаблонизации, мне только форму оплаты надо вывести со списком товаров. Вообще я пишу это на друпале, просто решил создать магаз а готового решения не нашёл, т.е. модуля какой мне надо. вот просто надо было самому написать корзину для drupal. Затестил, этот код работает.

Всё нормально добавялется и удаляется. Там ещё сделаю кое какие ограничения.

Ну а почему не выводят через echo? Через print проще? всегда почему то пользовался этой функцией.

Лучше скажите что вам не нравится? Какие ошибки при программировании и построении класса? Как лучше бы было?

Что коряво написанно и лучше изменить?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
04.12.2012, 09:30
picusus, echo - это конструкция языка, а не функция. Также как и print. И работает он быстрее чем print, и не возвращает число. А то, что вы не хотите делать шаблонизацию - вам как раз это и говорят исправить в первую очередь, потому что смешивать php-код и html-код - плохая практика. И намного лучше будет и выглядеть, и отладка будет проще если вид будет в отдельном файле и вы его будете просто подключать. Потом, при каждом создании объекта от этого класса у вас будет создаваться новое подключение. А смысл с этого в данном коде? Я лично не вижу. Если вы используете ООП - зачем тогда использовать die()? Кидайте исключение вместо этого, о чем вам уже говорили выше.
и вообще:
Цитата Сообщение от picusus Посмотреть сообщение
PHP
1
2
$result=mysqli_query($this->db,$query) or die("MySQL error: " . mysqli_error($this->db) . "<hr>\nQuery: $query");
* * * * return TRUE;
лучше так тогда уж
PHP
1
return mysqli_query($this->db,$query);
но - то, что запрос вернет true не означает что сам запрос выполнен успешно и эта запись добавилась/удалилась. Используйте тогда уже mysqli_affected_rows().
Зачем использование global? Зачем внутри так "зажимать" настройки для коннекта? В общем, имхо - здесь больше просто функции, засунутые в класс, а не ООП..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.12.2012, 09:30
Помогаю со студенческими работами здесь

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

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

Написание модуля к существующему проекту. ООП
Здравствуйте. Есть необходимость дописать небольшой существующий проект и добавить модуль управления рассылкой писем с сайта в качестве...

ООП: написание классов «Треклист» и «Песня»
Пожалуйста, помогите написать классы «Треклист» и «Песня» (название и время звучания). В треклисте необходимо перегрузить оператор ...

Подключение PDO в ООП
Делаю маленький сайт обьявлений, на ооп и mvc. Есть подключение к БД. class Db { public static function getConnection() { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru