Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   пишем примитивный тырнет-магазин : помогите с сессиями в PHP (http://forum.oszone.net/showthread.php?t=70515)

koresaram 29-08-2006 17:53 478157

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

E-mail 29-08-2006 18:12 478164

session_name()
если без параметра - то выведет имя установленное до,
если с параметром, то изменит имя на указанное,

еще удобно использовать переменные $_SESSION

а также куки, тоже неплохая весч, но не гарантированная,

хотя сессии тоже иногда не дают гарантию "настоящей" аунтификации, если директория где они хранятся используется другими проектами ну и т.п..


koresaram 29-08-2006 18:28 478168

E-mail а как я буду определять какое имя там задалось? я просто только начал php учить поэтому ничего не знаю :)

E-mail 29-08-2006 18:38 478171

koresaram а вы его запишите сразу как задали, зачем вам его определять?

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

koresaram 29-08-2006 18:47 478174

E-mail
алгоритм примерно такой:
имеется страница index.php на которой выводятся изначально все мои товары (на эту страницу попадает каждый новый пользователь). под каждым товаром кнопка "заказать" с value=ID. ID берется из MySQL базы. на кнопке "заказать" action=zakaz.php на этой странице все то же самое что и в index.php но уже открывается сессия для пользователя (наверное метод деревянный, но со своим уровнем знаний я ничего другого придумать не смог :) ). и дальше пользователь гуляет по страницам zakaz.php уже с сессией и набирает товары (кстати они будут где-то сохраняться при таком подходе?) также на странице zakaz.php появляется подпункт меню "корзина" в которую записыватся выбранные им товары. и форма "Отправить заказ". по задумке пользователь наберет товары, заполняет форму ФИО, тел. и e-mail и посылает мне письмо в котором также содержатся ID заказанных им товаров.

benya 29-08-2006 19:00 478178

koresaram,
А почему сразу не открывать сессию для всех пользователей? А при клике на "заказать" только прилепливать товар к сессии.

koresaram 29-08-2006 19:14 478183

benya я прочитал пример в котором сперва вводилось имя в форму и на следующем файле открывалась сессия с введенным именем ну вот по аналогии и "изобрел".

то есть теперь мы сразу открываем сессию. а каким образом приклеивать товары в эту сессию?

разъясните плиз как для полного идиота :) или ткните в руководство для полных идиотов, а то все что нашел в инете я как-то не осиливаю :(

Prisoner 30-08-2006 12:10 478452

В самом деле, почему не стартовать сессию ВСЕГДА и как можно раньше? Это нормально. К примеру в таких сложных вещах как PEAR::LiveUser так и делается. Итак, сессию стартуем и дальше оперируем с массивом $_SESSION. Это автоглобальный ассоциативный массив. Присвоение его елементам какого-то значения означает запись значения в сессию. Т.о. досаточно при обработке каждого клика по кнопке "купить" выполнять примерно следующий код:
Код:

$_SESSION['tovarIDs'][] = $_REQUEST['ID'];
Здесь $_REQUEST['ID'] - значения gпараметра с name='ID' переданного скрипту. Вот в сессии и будет храниться подмассив айдишников товаров, "накликанных" посетителем.

P.S. Помните о безопасности, выражение $_REQUEST['ID'] без фильтрации и обработки потенциальная дыра в срипте.

E-mail 30-08-2006 13:03 478490

koresaram
Цитата:

benya я прочитал пример в котором сперва вводилось имя в форму и на следующем файле открывалась сессия с введенным именем
ну так и есть,
на странице zakaz.php

делаете sesion_start()
а далее читаете переменные, те что передали скрипту и записываете в ассоциативный массив $_SESSION
ну а после того как нажимаете "отправить заказ", уже на другой странице, например send.php делаете опять session_start() и читаете массив $_SESSION в тело письма

koresaram 30-08-2006 17:26 478654

PrisonerE-mail чего-то я недопонимаю блин 100%. дело еще в том, что
Код:

= $_REQUEST['ID'];
оно у меня динамическое. и плюс к этому на одной странице две формы. я вам сейчас поподробнее опишу что у меня творится.
Код:

<html>

<head>
  <title>Примитивный тырнет магазин</title>
</head>

<body>
<input type="hidden" name="action" value="post">
<form name='realtyform' action='realty.php' method=post>
<table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="100%" id="AutoNumber1">
  <tr>
    <td width="20%">
    <select size=9 name=direction[] multiple>
<option value=Север>Север</option>
<option value=Северо-Восток>Северо-Восток</option>
<option value=Восток>Восток</option>
<option value=Юго-Восток>Юго-Восток</option>
<option value=Юг>Юг</option>
<option value=Юго-Запад>Юго-Запад</option>
<option value=Запад>Запад</option>
<option value=Северо-Запад>Северо-Запад</option>
<option value=Центр>Центр</option>

</select>
    </td>
    <td width="50%">
    <select name=dogovor>
    <option value="аренда">Аренда</option>
    <option value="продажа">Продажа</option>
    <option value="" type="hidden" selected>&nbsp;</option>
    </select> <br>
    Площадь: от <input type=text name=minsquare value=""> до <input type=text name="maxsquare"  value=""><br>
    Цена: от <input type=text name="minprice" value=""> до <input type=text name="maxprice" value="">
    </td>

  </tr>
  <tr>
    <td width="100%" colspan="2"><INPUT TYPE=Submit VALUE=Искать style=font-size: 8pt>&nbsp;<input type=reset value=Сброс style=font-size: 8pt></td>
  </tr>
</table>
</form>

<?php
session_start();
$_SESSION['tovarIDs'] = $_REQUEST['$myrow[0]'];

echo 'В вашей корзине' . $_SESSION['tovarIDs'] . "<br>";


// Данные для MySQL сервера
$DBHost = "xxx"; // Хост
$DBUser = "xxx"; // Имя пользователя
$DBPassword = "xxx"; // Пароль
$DB="xxx"; //


// Подключаемся к MySQL серверу
$Link = mysql_connect($DBHost, $DBUser, $DBPassword);
  if(!$Link) die ("Невозможно подключиться к MySQL" .mysql_error());
// Выбираем нашу базу данных
mysql_select_db($DB, $Link)or die ("дошло до строки с выбором базы!" .mysql_error());

$direction_values=$HTTP_POST_VARS['direction'];
$dogovor_values=$HTTP_POST_VARS['dogovor'];
$minsquare_values=$HTTP_POST_VARS['minsquare'];
$maxsquare_values=$HTTP_POST_VARS['maxsquare'];
$minprice_values=$HTTP_POST_VARS['minprice'];
$maxprice_values=$HTTP_POST_VARS['maxprice'];
for ($i = 0; $i <= 9; $i++) {

print "$direction_values[$i]&nbsp;";
};

if ($minsquare_values=="" and $maxsquare_values=="") {$square_query="WHERE field7 >= 0";}
elseif ($minsquare_values=="" and $maxsquare_values!="") {$square_query="WHERE field8 >= $maxsquare_values";
        }
elseif ($minsquare_values!="" and $maxsquare_values=="") {$square_query="WHERE field7 >= $minsquare_values";
        }
else {
$square_query="WHERE NOT(field8 < $minsquare_values or field7 > $maxsquare_values)";
}

if ($minprice_values=="") {$minprice_query="";}

else {
$minprice_query="AND field5 >= $minprice_values";
}

if ($maxprice_values=="") {$maxprice_query="";}

else {
$maxprice_query="AND field5 <= $maxprice_values";
}

if ($dogovor_values=="") {$dogovor_query="";}

else {
$dogovor_query="AND field4 = '$dogovor_values'";
}

if ($direction_values=="") {$direction_query="";}

else {
$direction_query="AND (field1='$direction_values[0]' or field1='$direction_values[1]' or field1='$direction_values[2]' or field1='$direction_values[3]' or field1='$direction_values[4]' or field1='$direction_values[5]' or field1='$direction_values[6]' or field1='$direction_values[7]' or field1='$direction_values[8]' or field1='$direction_values[9]')";
}

print "$dogovor_values $minsquare_values $maxsquare_values $minprice_values $maxprice_values";
print "<table width='100%' border=1><tr><td>Лот</td><td>Направление</td><td>Договор</td><td>Мин./Макс. цена</td><td>Мин./Макс. площадь</td><td>&nbsp;</td></tr>";

$result = mysql_query("SELECT * FROM realty $square_query $minprice_query $maxprice_query $dogovor_query $direction_query" ) or die ("Попробуйте повторить запрос через некоторое время" .mysql_error());

while ($myrow = mysql_fetch_row ($result))
{
$myrow[0]=rtrim($myrow[0]);
print "<tr><td>$myrow[0]</td><td>$myrow[1]</td><td>$myrow[4]</td><td>$myrow[5]/$myrow[6]</td><td>$myrow[7]/$myrow[8]</td><td><FORM style=\"MARGIN: 0px\" action=realty.php method=post><INPUT type=image alt=\"В корзину\" src=arrow.gif  name=\"$myrow[0]\" value=\"$myrow[0]\"></FORM></td></tr>";
}
print "</table>";


?>

</body>

</html>

вот такая мощная зарисовка :)
имеем. БД MySQL и собственно сам этот "скрипт" пользователь задает ограничения на поиск вариантов после чего ему выдается сводная таблица в которой он соответственно начинает выбирать нужное. выборка, коннект к базе и вывод результата все работает.
собственно я поставил код как вы мне сказали но не работает. либо я не туда его поставил либо неправильно поставил вобщем что-то не так. а вот что именно? :)

koresaram 30-08-2006 18:17 478678

стоп стоп. чего-то я натупил...
name мне нужен 1 value разные это во-первых а во-вторых надо наверное запомнить еще и параметры выборки чтобы в списке оставался только выбранный товар а то сейчас после нажатия "в корзину" список полностью выводится.
народ, вы мне советуйте и объяняйте плиз (а если вдруг кто видит, что тут делов на 10 минут при знании предмета и не влом будет может напишете готовое решение :))

E-mail 30-08-2006 18:28 478681

koresaram

Цитата:

$_SESSION['tovarIDs'] = $_REQUEST['$myrow[0]'];
$myrow[0] - это что?

вы что сюда выложили подряд код из всех скриптов или это все один index.php ?

вообще совет - использовать один срипт для всех шагов, заодно не придется показывать в html в теге form имя исполняемого скрипта (опятьже метод безопасности)

далее,
$HTTP_POST_VARS такие массивы уже устарели и их уже никто не использует, а если использует то это смотрится крайне "ламерски" бебе:) используйте массив $_POST или $_GET в зависимости от метода передачи (у вас post), иначе при переходе на следующую ожидаемую версию php ваш скрипт не будет работать, так как эти массивы более не будут поддерживаться и работать.

далее,

<option value=Север>Север</option>
кто так пишет? у вас должна быть создана таблица в бд, где есть два элемента:
1) id
2) direction

где id - уникальный ключ таблицы
а значение элемента direction является одним из округов

ну и соответственно форма должна выводить результат этой таблицы но в value (то что передается) надо писать id

будет выглядеть вот так например:
<option value=1>Север</option>
<option value=2>Юг</option>
и т.д.

-----

после отправки этой формы пишите в следующем скрипте в самом начале:
session_start();
$_SESSION['direction_id'] = $_POST['direction'];

если вы не знаете что такое $_REQUEST и как правильно записывать.

далее после нажатия на "отправить письмо" в следующем скрипте пишите
session_start();
и работайте с массивом $_SESSION['direction_id']
ВСЕ!

управился за 5 минут:)
а не за
Цитата:

кто видит, что тут делов на 10 минут
))

E-mail 30-08-2006 18:52 478699

кстати говоря использования print рекомендую изменить на echo, не говоря уже про форматирование..

koresaram 30-08-2006 19:08 478706

E-mail
это все один index.php все в одном как шампунь :)

$myrow[0] - это что?
это по ламерски вывод значений ID объектов из БД. с ассоциативным массивом я не разобрался поэтому пришлось использовать определение по номеру столбца в базе 0-в этом столбце у меня ID объектов (стыдицца)

$HTTP_POST_VARS
по ламерски, согласен, но какгрится что осилил то и использовал :)

<option value=Север>Север</option>
кто так пишет? у вас должна быть создана таблица в бд, где есть два элемента:
1) id
2) direction

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

вобщем будем осмысливать и пробовать. а насчет 10 минут у меня еще такая проблема что по отдельности я как бы все понимаю а вот в одно целое это все собрать не могу хз почему :)
так что далеко не отходите вопросов будет еще множество :)

E-mail 30-08-2006 22:10 478752

Цитата:

$myrow[0] - это что?
это по ламерски вывод значений ID объектов из БД
угу это я своими телепатическими возможностями догодался, но вопервых почему ты его используешь ДО того как обратился с запросом к базе??
в третьих (я не сбился со счету) почему объявление сессий ПОСЛЕ любого вывода?

Demiurg 05-09-2006 11:58 481114

...заранее сорри, что не совсем в тему... :)
...написал скрипт (тоже что-то вроде корзины)... данные, выбранные из базы, передавал через форму с параметром hidden... пришло время, когда передаваемых данных стало "ну просто завались"... вычитал про сессии, понравилось... но!... стоит добавить строчку "session_start();" в скрипт, как он "превращается" в нерабочий (выдает пустую страницу)... маюсь уже второй день... :)
P.S. (FreeBSD 6.1-p2, Apache 2.0.58, PHP 5.1.4, PostgreSQL 8.0.8)

Prisoner 05-09-2006 12:21 481129

Попробуйте поглядеть логи ошибок php. Также попробуйте установить error_reporting(E_ALL); в самом начале скрипта, может чего покажет. Также убедитесь, что до выражения session_start() не делалось никакого вывода в броузер. Почему это необходимо соблюдать читайте здесь.

Demiurg 05-09-2006 15:04 481198

Prisoner
В логах пишет - PHP Fatal error: Call to undefined function session_start()... заглянул в /usr/local/etc/php.ini, есть вот такие строчки:
session.use_cookies = 1
;session.use_only_cookies = 1
в браузере куки отключены, хоть и поменял потом на 0, результат тот же...

P.S. ...кругом говорят "отключайте куки, они не безопасны"... в то же время читая литературу, пишут что куки - это самое надежное из стандартных решений для сохранения состояния... .... истина где-то рядом...

Prisoner 05-09-2006 16:19 481251

1) Опасность кук - фикция. Что-то из области "обжегшись на молоке на воду дуют". Ну не нравится кому-то, что кто-то (сайты) пишут через кого-то (броузеры) что-то (код кук) на винты их машин. Кому как. То, что это отголосок старых времен - волна недовольства после введения данной технологии, никому почему в голову не приходит. В общем юзайте их, юзайте, но... проверяйте, а вдруг вам повезло и к вам зашел наглухо запечатанный параноик с отрубленными куками, горячей водой, отоплением и светом %).
2) Неопределенная функция session_start() вероятнее всего вызвана компиляцией модуля с опцией --disable-session или --disabled-all. Если не вы администратор хостинга, то обратитесь к его администратору с просьбой пересобрать пакет с поддержкой сессий, это его обязанность. Если же вы, то придется поглядеть в сторону мануалов по сборке моделя php из исходных кодов.

Demiurg 06-09-2006 16:15 481748

...вроде нашел... в портах при сборке lang/php5 выбор сборки с поддержкой сессий нет... она валяется в www/php5-session... сейчас скомпилирую и попробую...

Demiurg 06-09-2006 17:37 481773

ура, заработала... :)

Prisoner 06-09-2006 19:11 481805

Рад за Вас :).


Время: 10:35.

Время: 10:35.
© OSzone.net 2001-