Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Увеличение числа на 1


Автор: Agares 19.8.2007, 17:26
Делаю я и-нет магазин, когда чувак добавляет товар в корзину, то счетчик должен увеличиться на единицу.
вот код:

Код

<?php

 include ("system.php");
 include ("config.php");

 $login = $_SESSION['login'];
 $gds = $_SESSION['gds'];
 $desc = $_SESSION['gds_desc'];
 $pay = $_SESSION['gds_pay'];

 if (!isset($_GET['act']))
 {
         $page_text = " ";
 }
 else
 {

         $act = $_GET['act'];
         if ($act == "add")
         {
                 $section = "gds_{$_GET['s']}";
                 $gdsb = $_GET['gds'];

                 if (!$mysql_id = mysql_connect($db_host,$db_user,$db_pass))
                 {
                         $page_txt = "Не пашет БД!";
                         exit(1);
                 }

                 mysql_select_db($db_name,$mysql_id);

                 $result = mysql_query("SELECT * FROM $section",$mysql_id);

                 while ($myrow = mysql_fetch_row($result))
                 {
                         if ($gdsb == $myrow[4])
                         {
                                 $gds = $_SESSION['gds'];
                                 $gds++;
                                 $_SESSION['gds'] = $gds;
                                 $page_text = "Добавлен товар! ";
                         }
                 }

                 //$page_text = "OK";
         }


 }

 //$page_text = " ";

 include("pages/ban.php");

 include("pages/menu.php");
 include("pages/auth_form.php");

 include("skins/skin.php");
 include("skins/{$skin}.php");

 echo $page;

?>


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

Автор: HackMan 19.8.2007, 17:37
а где start_session()?

Автор: Agares 19.8.2007, 17:49
Он прописан в system.php

Автор: SelenIT 19.8.2007, 17:52
Agares, переменная
Код

 $gds = $_SESSION['gds']; // строка 7
где-нибудь ниже используется?

Зачем вообще переопределять все на свете? Зачем карусель с
Код

                                 $gds = $_SESSION['gds']; // строки 38-40
                                 $gds++;
                                 $_SESSION['gds'] = $gds;

, почему бы не сделать просто
Код

                                 $_SESSION['gds']++; // вот так? ;)

По-моему, отлаживать код и отслеживать значения станет проще...

Автор: Agares 19.8.2007, 18:01
Изменил код:
Код

$login = $_SESSION['login'];
 //$gds = $_SESSION['gds'];
 $desc = $_SESSION['gds_desc'];
 $pay = $_SESSION['gds_pay'];

 if (!isset($_GET['act']))
 {
         $page_text = " ";
 }
 else
 {

         $act = $_GET['act'];
         if ($act == "add")
         {
                 $section = "gds_{$_GET['s']}";
                 $gdsb = $_GET['gds'];

                 if (!$mysql_id = mysql_connect($db_host,$db_user,$db_pass))
                 {
                         $page_txt = "Íå ìîãó ñîåäèíèòüñÿ ñ áàçîé äàííûõ!";
                         exit(1);
                 }

                 mysql_select_db($db_name,$mysql_id);

                 $result = mysql_query("SELECT * FROM $section",$mysql_id);

                 while ($myrow = mysql_fetch_row($result))
                 {
                         if ($gdsb == $myrow[4])
                         {
                                 $_SESSION['gds']++;

                                 $page_text = "<p align=\"center\">Òîâàð <b>$myrow[0]</b> áûë äîáàâëåí â âàøó êîðçèíó.<br>Öåíà äàííîãî òîâàðà <b>$myrow[0]</b> ãðí.</p>
                                              <br><br>
                                              <a href=\"basket.php\">[Îôîðìèòü çàêàç]</a>
                                              ";
                         }
                 }

                 //$page_text = "OK";
         }


 }


Тоже самое ...

Добавлено через 5 минут и 12 секунд
Он увеличивает до единицы и все ... больше не увеличивает(

Автор: HackMan 19.8.2007, 19:23
Вы точно уверены, что сессия нормально инициализируется?
Может start_session() вызывается неправильно?
Проверьте значения переменных
Код

 $login
 $gds
 $desc
 $pay

Автор: Mal Hack 19.8.2007, 20:13
Agares, мой Вам совет. Реализуйте сессию через БД, отдавая пользователю только ID сессии. Так построен OSCommerce - лидер, на сегодняшний день, в области интернет-магазинов общего распространния...
У Вас будет проблем раз в 4-5 меньше, чем сейчас...

Автор: Agares 19.8.2007, 21:14
Сессия нормально проходит ...
А не подскажете сам алгоритм сессий через БД?

Автор: Agares 19.8.2007, 21:29
Кстати, я вот тоже подумывал над тем, что бы через БД реализовать сэссию ...

Автор: aktuba 19.8.2007, 21:30
Цитата

А не подскажете сам алгоритм сессий через БД? 


Мне тоже интересно. Можно подробнее?

Автор: Mal Hack 19.8.2007, 21:48
А что подробнее. Создаем таблицу sessions с полями, которые нам нужны. Что раньше писали в сессию пишем в Базу, при этом для каждой записи записываем session_id, который идет пользователю и еще одно дополнительное поле - время записи, чтобы потом удалять старые. Все. Пользователь заходит, по пользовательскому сиду достаем запись в базе и работаем.

Автор: -=Ustas=- 19.8.2007, 22:10
Но как мне кажется, стандартный механизм сессий будет работать быстрее, нежели с базой... разве нет?

Автор: Mal Hack 19.8.2007, 22:13
-=Ustas=-, скорее всего быстрее, но не намного, данные все равно в файл пишутся...
Зато надежность - на порядок выше. И удобство работы.

Автор: GiV 19.8.2007, 22:53
Собственно пример с сессиями в БД:

http://ru2.php.net/manual/ru/function.session-set-save-handler.php#60316

А вообще если о скорости, то лучше использовать shared memory

Автор: WIPS 19.8.2007, 23:38
Цитата(GiV @  19.8.2007,  21:53 Найти цитируемый пост)
А вообще если о скорости, то лучше использовать shared memory 

А можно поподробнее об этом?

Автор: GiV 20.8.2007, 00:41
Да собственно рассказывать не о чем, потому как на шаред хостинге или включено или нет (обычно нет).

Варианта использования shared memory 2-а:

1. Собрать PHP с поддержкой shared memory allocation (http://www.ossp.org/pkg/lib/mm/) --with-mm=[DIR]
Однако в комментариях этого делать не советуют из-за конфликтов при работе всего этого дела под Apache (PHP просто вылетает в корку при попытке создании сессии)

2. Воспользоваться возможностями ОС (кроме Windows). А именно tmpfs или md.
Собственно у меня под FreeBSD сделано так:

Код

mdconfig -a -t malloc -s 256m
newfs -U /dev/md0

mount /dev/md0 /var/tmp

chmod 1777 /var/tmp


Добавлено через 10 минут и 51 секунду
Да... БД, в частности MySQL, тоже позволяют хранить таблицы в памяти, так что по сути доступное всем решение это создание таблиц сессий в базе данных типа HEAP ( или ENGINE = MEMORY )

Так что если не смущает дополнительная нагрузка на сервер БД, то это выход для получения достаточно производительного механизма сессий.

Хотя работа напрямую с shared memory все же быстрее, ИМХО.

Автор: Agares 20.8.2007, 11:30
У меня вопрос стоит не в скорости работы, а в качестве, думаю, лучше будет на БД осуществить сессии. Спасибо за тот код, который вы привели, очень помог. Сейчас буду сидеть переписывать ... 

Вот еще один вопрос, как передавать session_id пользователю? не делать же постоянно ссылку типа mysite.com?id=clf265k264g265j4okf5glkf242ghpd

Есть вариант этот id в куки записывать, но я с куками не умею работать :(

Автор: Severyanin 20.8.2007, 11:32
Так в них нет ничего сложного. Устанавливаешь куку функцией setcookie(), а при необходимости берешь из глобального массива $_COOCIES. Вот и все smile 

Автор: Agares 20.8.2007, 11:33
У меня появилась мысль, можно ведь сделать так:
Код

   $session_id = md5($_SERVER['REMOTE_ADDR']);


Как думаете?

Добавлено через 55 секунд
Severyanin, можна примерчик кода записи в куки и чтения из него?  smile 

Автор: GiV 20.8.2007, 11:48
Цитата(Agares @  20.8.2007,  11:30 Найти цитируемый пост)
Вот еще один вопрос, как передавать session_id пользователю? не делать же постоянно ссылку типа mysite.com?id=clf265k264g265j4okf5glkf242ghpd

В случае если будете переопределять session_handler (http://ru2.php.net/manual/ru/function.session-set-save-handler.php), то сессия будет сохранятся в куках (особенное если включен session.use_only_cookies)


Цитата(Agares @  20.8.2007,  11:33 Найти цитируемый пост)
У меня появилась мысль, можно ведь сделать так:

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

Идентификатор сессии должен быть:
а) уникальным
б) с большим элементом случайности

Как вариант
Код
$session_id = md5( uniqid(microtime()) ); 


Цитата(Agares @  20.8.2007,  11:33 Найти цитируемый пост)
можна примерчик кода записи в куки и чтения из него? 

http://ru2.php.net/setcookie - достаточно примеров и записи и чтения.

Да еще при чтении сессии из кук, стоит проверять полученные данные на "внешнюю похожесть" на ид сессии, либо удалять то чего в ид не может быть, например так:
Код
$session_id = preg_replace("/([^a-zA-Z0-9])/", "", $session_id);


Автор: Agares 20.8.2007, 12:09
по поводу куков, я правильно понял:
Код

<?php

   if (!isset($_COOKIE['id'])) //Если куков нет, создаем
   {
             $session_id = md5( uniqid(microtime()) );
             $session_id = preg_replace("/([^a-zA-Z0-9])/", "", $session_id);

             setcookie("id", $session_id); //устанавливаем куки
   }

  $session_id = $_COOKIE["TestCookie"]; //Читаем куки

?> 


И еще вопрос, зачем вот эта строчка:
Код

   $session_id = preg_replace("/([^a-zA-Z0-9])/", "", $session_id);

что она делает?

Добавлено через 1 минуту и 28 секунд
и еще вопрос:

Код

uniqid()
microtime()


Что это за функции?

Добавлено через 4 минуты и 59 секунд
да и еще, как удалить куки?

Добавлено через 6 минут и 41 секунду
Слушайте, так с помощью куков ведь можно сделать автологин!! 

Автор: GiV 20.8.2007, 12:28
Цитата(Agares @  20.8.2007,  12:09 Найти цитируемый пост)
И еще вопрос, зачем вот эта строчка:

Для проверки того, что вместо md5-хэша в  session_id в куке плохой дядя не воткнул SQL/CSS инъекцию.


Цитата(Agares @  20.8.2007,  12:09 Найти цитируемый пост)
Что это за функции?

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


Цитата(Agares @  20.8.2007,  12:09 Найти цитируемый пост)
да и еще, как удалить куки?

Код
 setcookie("id", "0" );


Сам код должен быть приблизительно таким
Код

<?php
   if (!isset($_COOKIE['id'])) //Если куков нет, создаем
   {
             $session_id = md5( uniqid(microtime()) );
             setcookie("id", $session_id); //устанавливаем куки
   } else {
             $session_id = $_COOKIE["id"]; //Читаем куки
             $session_id = preg_replace("/([^a-zA-Z0-9])/", "", $session_id);
   }
?> 

Автор: Agares 20.8.2007, 12:36
Аааа понятно, спасибо БОЛЬШОЕ!!!!
Было б у меня 100 сообщений, поставил бы плюсик ;)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)