Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Корзина на сессиях работает при register_global=on, при register_global off не хочет 
V
    Опции темы
americanets
Дата 26.3.2007, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1100
Регистрация: 27.9.2006

Репутация: 5
Всего: 12





Вот код, не знаю что и делать, совсем замучился, как заставить корзину считать при выключеном register_global? 
Код

<?
if (isset($_GET['add']) && $_GET['add']>0) { //добавить товар в корзину
        //$gids[] -- массив, составленный из ID товаров в корзине
        //$counts[] -- из количеств соответствующих товаров (т.е. $gids[$i]'ому соответствует $counts[$i])
        //если $gids[$i] == 0, то считается, что ячейка пуста -- такое может случиться при удалении товара из корзины
        if (!isset($gids)) {
            $gids = array();
            $counts = array();
        };
        //посмотреть -- есть ли уже такой товар в корзине
        $i=0;
        while ($i<count($gids) && $gids[$i] != $_GET['add']) $i++;
        if ($i < count($gids)) //такой товар уже есть -- увеличиваем его количество
            $counts[$i]++;
        else { //товара нет -- добавляем его в конец массива
            $gids[] = $_GET['add'];
            $counts[] = 1;
        };
        //добавить изменения в сеанс
      $_SESSION['gids'];
      $_SESSION['counts'];
    };
    if (isset($remove) && $remove>0) { //удалить товар из корзины -- $remove - это индекс удаляемого товара
        //удалить товар "из переменных сеанса"
        $i=0;
        while ($i<count($gids) && $gids[$i] != $_GET[remove]) $i++;
        if ($i<count($gids)) $gids[$i]=0;
        //добавить изменения в сеанс
          $_SESSION['gids'];
          $_SESSION['counts'];
    };
if (isset($_GET[update])) { //"пересчитать" корзину
$vars = get_defined_vars();
foreach ($vars as $key => $val)
if (strstr($key, "count_")) {
//в переменных сеанса
if ($val>0) {
for ($i=0; $i<count($gids); $i++)
if ($gids[$i] == str_replace("count_","",$key)) {
$counts[$i] = $val;
};
}
else { //удалить
$i=0;
while ($gids[$i] != str_replace("count_","",$key) && $i<count($gids)) $i++;
$gids[$i]=0;
//добавить изменения в сеанс
$_SESSION['gids'];
$_SESSION['counts'];
};
};
};
if (isset($_GET[clear_cart])) { //очистить корзину
        //удалить все переменные саенса
        unset($_SESSION['counts']);
        unset($_SESSION['gids']);

    };
?>



--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
mishaSL
Дата 26.3.2007, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: 19
Всего: 54



1. $gids - если это массив который храниться в сессии, то к нему надо обращаться как $_SESSION['gids']
2. Что ты этим хочешь сделать:
Код

        //добавить изменения в сеанс
          $_SESSION['gids'];
          $_SESSION['counts'];

коменты я прочитал, объясни подробнее smile 

3. $_GET[update] , $_GET[remove] и т.д. - должно быть $_GET['update'] ,$_GET['remove'] и т.д.

4. 
Код

 if (isset($remove) && $remove>0)


откуда передается $remove?

В логику пока не вникал, поправь сначало это smile 


--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
americanets
Дата 26.3.2007, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1100
Регистрация: 27.9.2006

Репутация: 5
Всего: 12



Код взял в старом Shop Script менял но не помогло, вот весь код

Код

<? //корзина пользователя
session_start();
//соединиться с БД
require("config.php");
mysql_connect($CFG->db_host, $CFG->db_user, $CFG->db_pass);
mysql_select_db($CFG->db_name);


if (isset($_GET['add']) && $_GET['add']>0) { //добавить товар в корзину
        //$gids[] -- массив, составленный из ID товаров в корзине
        //$counts[] -- из количеств соответствующих товаров (т.е. $gids[$i]'ому соответствует $counts[$i])
        //если $gids[$i] == 0, то считается, что ячейка пуста -- такое может случиться при удалении товара из корзины
        if (!isset($gids)) {
            $gids = array();
            $counts = array();
        };
        //посмотреть -- есть ли уже такой товар в корзине
        $i=0;
        while ($i<count($gids) && $gids[$i] != $_GET['add']) $i++;
        if ($i < count($gids)) //такой товар уже есть -- увеличиваем его количество
            $counts[$i]++;
        else { //товара нет -- добавляем его в конец массива
            $gids[] = $_GET['add'];
            $counts[] = 1;
        };
        //добавить изменения в сеанс
      $_SESSION['gids'];
      $_SESSION['counts'];
    };
    if (isset($remove) && $remove>0) { //удалить товар из корзины -- $remove - это индекс удаляемого товара
        //удалить товар "из переменных сеанса"
        $i=0;
        while ($i<count($gids) && $gids[$i] != $_GET[remove]) $i++;
        if ($i<count($gids)) $gids[$i]=0;
        //добавить изменения в сеанс
          $_SESSION['gids'];
          $_SESSION['counts'];
    };
if (isset($_GET[update])) { //"пересчитать" корзину
$vars = get_defined_vars();
foreach ($vars as $key => $val)
if (strstr($key, "count_")) {
//в переменных сеанса
if ($val>0) {
for ($i=0; $i<count($gids); $i++)
if ($gids[$i] == str_replace("count_","",$key)) {
$counts[$i] = $val;
};
}
else { //удалить
$i=0;
while ($gids[$i] != str_replace("count_","",$key) && $i<count($gids)) $i++;
$gids[$i]=0;
//добавить изменения в сеанс
$_SESSION['gids'];
$_SESSION['counts'];
};
};
};
if (isset($_GET[clear_cart])) { //очистить корзину
        //удалить все переменные саенса
        unset($_SESSION['counts']);
        unset($_SESSION['gids']);

    };
?>
<html>

<head>
<link rel=STYLESHEET href="style.css" type="text/css">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Корзина</title>
<script>

function order_shopping() { //оформление заказа -- закрыть окно и перейти к странице оформления заказа в главном окне
    window.opener.location = 'order.php';
    window.close();
};

</script>
</head>

<body><center>

<?

    //берем товары из $gids[]

    //посчитаем кол-во товаров в корзине
    $c=0;
    if (isset($gids))
        for ($j=0; $j<count($gids); $j++) if ($gids[$j]) $c++;

    //если корзинa не пуста
    if (isset($gids) && $c) {

?>

<table width=100%><tr><td><font color=#3551C7><b>Ваша корзина:</b></font></td>
<td align=right><a href="cart.php?clear_cart=yes"><font color=#2531A7><img src="images/remove.jpg" border=0> <u>очистить</u></font></a></td></table>

<form action="cart.php?update=yes" method=post>
<table border=0 cellspacing=1 cellpadding=2 bgcolor=#E1E6FC width=100%>
<tr align=center bgcolor=#D1D9F8>
<td><font color=#3551C7>Наименование</font></td><td><font color=#3551C7>Количество</font></td><td><font color=#3551C7>Стоимость, $</font></td><td width=20></td>
</tr>

<?
        $k=0; //общая стоимость корзины
        for ($i=0; $i<count($gids); $i++)
          if ($gids[$i]) {
            $q = mysql_query("SELECT * FROM shop WHERE ID='".$gids[$i]."'") or die (mysql_error());
            if ($r = mysql_fetch_row($q)) {
                echo "<tr bgcolor=white >\n<td>".$r[2]."</td>\n";
                echo "<td align=center>\n";
                echo "<input type=\"text\" name=\"count_$gids[$i]\" size=5 value=\"".$counts[$i]."\">\n</td>\n";
                echo "<td align=center>".($counts[$i]*$r[4])."</td>\n";
                echo "<td align=center><a href=\"cart.php?remove=$gids[$i]\" class=small><img src=\"images/remove.jpg\" border=0 alt=\"удалить\"></a></td>\n</tr>\n";
                $k += $counts[$i]*$r[4];
            };
          };

        //итого...
?>

<tr bgcolor=white><td><font class=cat><b>Итого:</b></font></td><td><br><br></td><td bgcolor=#F1F6FC align=center><font class=cat><b><nobr><?=$k; ?>$</nobr></b></font></td><td></td></tr>

</table>

<table width=100% border=0>
<tr>
<td align=right><input class="bluebutton" type="submit" value="Пересчитать"></td>
</tr>
</table>

</form>


<form action="javascript:order_shopping();" method=post>

<table width=100% border=0>
<tr>
<td align=center><input type="submit" class="redbutton" value="Оформить заказ!"></td>
<td align=center><input type="button" class="bluebutton" value="Закрыть" onClick="window.close();"></td>
</tr>
</table>

</form>

<?
    }
    else {
        echo "<p><font>Ваша корзина пуста!</font></p>\n";
        echo "<form><input type=\"button\" class=\"bluebutton\" value=\"Закрыть\" onClick=\"window.close();\"></form>\n";
    };

?>
</center></body>

</html>



--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
mishaSL
Дата 26.3.2007, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: 19
Всего: 54



Цитата(americanets @  26.3.2007,  20:17 Найти цитируемый пост)
вот весь код

И что вы мне предлагаете с ним сделать. Переписать?
Цитата(americanets @  26.3.2007,  20:17 Найти цитируемый пост)
менял но не помогло

Если до этого работало, значит не все поменяли или поменяли не правильно.

Я вам и объясняю, что еще нужно поменять smile 



--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
GZep
Дата 26.3.2007, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


участник Винграда
***


Профиль
Группа: Завсегдатай
Сообщений: 1528
Регистрация: 7.7.2006
Где: Москва

Репутация: 8
Всего: 32



$gids переделайте в $_SESSION['gids']

Это сообщение отредактировал(а) GZep - 26.3.2007, 20:25


--------------------
user posted imageuser posted image
PM MAIL WWW ICQ Skype GTalk   Вверх
americanets
Дата 26.3.2007, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1100
Регистрация: 27.9.2006

Репутация: 5
Всего: 12



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

Код

<? //корзина пользователя
session_start();
//соединиться с БД
require("config.php");
mysql_connect($CFG->db_host, $CFG->db_user, $CFG->db_pass);
mysql_select_db($CFG->db_name);


if (isset($_GET['add']) && $_GET['add']>0) { //добавить товар в корзину
        //$gids[] -- массив, составленный из ID товаров в корзине
        //$counts[] -- из количеств соответствующих товаров (т.е. $gids[$i]'ому соответствует $counts[$i])
        //если $gids[$i] == 0, то считается, что ячейка пуста -- такое может случиться при удалении товара из корзины
        if (!isset($_SESSION['gids'])) {
            $_SESSION['gids'] = array();
            $_SESSION['counts'] = array();
        };
        //посмотреть -- есть ли уже такой товар в корзине
        $i=0;
        while ($i<count($_SESSION['gids']) && $_SESSION['gids'][$i] != $_GET['add']) $i++;
        if ($i < count($_SESSION['gids'])) //такой товар уже есть -- увеличиваем его количество
            $_SESSION['counts'][$i]++;
        else { //товара нет -- добавляем его в конец массива
            $_SESSION['gids'] = $_GET['add'];
            $_SESSION['counts'][] = 1;
        };
        //добавить изменения в сеанс
      $_SESSION['gids'];
      $_SESSION['counts'];
    };
    if (isset($_GET[remove]) && $_GET[remove]>0) { //удалить товар из корзины -- $remove - это индекс удаляемого товара
        //удалить товар "из переменных сеанса"
        $i=0;
        while ($i<count($_SESSION['gids']) && $_SESSION['gids'][$i] != $_GET[remove]) $i++;
        if ($i<count($_SESSION['gids'])) $_SESSION['gids'][$i]=0;
        //добавить изменения в сеанс
          $_SESSION['gids'];
          $_SESSION['counts'];
    };
if (isset($_GET[update])) { //"пересчитать" корзину
$vars = get_defined_vars();
foreach ($vars as $key => $val)
if (strstr($key, "count_")) {
//в переменных сеанса
if ($val>0) {
for ($i=0; $i<count($_SESSION['gids']); $i++)
if ($_SESSION['gids'][$i] == str_replace("count_","",$key)) {
$_SESSION['counts'][$i] = $val;
};
}
else { //удалить
$i=0;
while ($_SESSION['gids'][$i] != str_replace("count_","",$key) && $i<count($_SESSION['gids'])) $i++;
$_SESSION['gids'][$i]=0;
//добавить изменения в сеанс
$_SESSION['gids'];
$_SESSION['counts'];
};
};
};
if (isset($_GET[clear_cart])) { //очистить корзину
        //удалить все переменные саенса
        unset($_SESSION['counts']);
        unset($_SESSION['gids']);

    };
?>
<html>

<head>
<link rel=STYLESHEET href="style.css" type="text/css">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Корзина</title>
<script>

function order_shopping() { //оформление заказа -- закрыть окно и перейти к странице оформления заказа в главном окне
    window.opener.location = 'order.php';
    window.close();
};

</script>
</head>

<body><center>

<?

    //берем товары из $gids[]

    //посчитаем кол-во товаров в корзине
    $c=0;
    if (isset($_SESSION['gids']))
        for ($j=0; $j<count($_SESSION['gids']); $j++) if ($_SESSION['gids'][$j]) $c++;

    //если корзинa не пуста
    if (isset($_SESSION['gids']) && $c) {

?>

<table width=100%><tr><td><font color=#3551C7><b>Ваша корзина:</b></font></td>
<td align=right><a href="cart.php?clear_cart=yes"><font color=#2531A7><img src="images/remove.jpg" border=0> <u>очистить</u></font></a></td></table>

<form action="cart.php?update=yes" method=post>
<table border=0 cellspacing=1 cellpadding=2 bgcolor=#E1E6FC width=100%>
<tr align=center bgcolor=#D1D9F8>
<td><font color=#3551C7>Наименование</font></td><td><font color=#3551C7>Количество</font></td><td><font color=#3551C7>Стоимость, $</font></td><td width=20></td>
</tr>

<?
        $k=0; //общая стоимость корзины
        for ($i=0; $i<count($_SESSION['gids']); $i++)
          if ($_SESSION['gids'][$i]) {
            $q = mysql_query("SELECT * FROM shop WHERE ID='".$_SESSION['gids'][$i]."'") or die (mysql_error());
            if ($r = mysql_fetch_row($q)) {
                echo "<tr bgcolor=white >\n<td>".$r[2]."</td>\n";
                echo "<td align=center>\n";
                echo "<input type=\"text\" name=\"count_".$_SESSION['gids'][$i]."\" size=5 value=\"".$_SESSION['counts'][$i]."\">\n</td>\n";
                echo "<td align=center>".($_SESSION['counts'][$i]*$r[4])."</td>\n";
                echo "<td align=center><a href=\"cart.php?remove=".$_SESSION['gids'][$i]."\" class=small><img src=\"images/remove.jpg\" border=0 alt=\"удалить\"></a></td>\n</tr>\n";
                $k += $_SESSION['counts'][$i]*$r[4];
            };
          };

        //итого...
?>

<tr bgcolor=white><td><font class=cat><b>Итого:</b></font></td><td><br><br></td><td bgcolor=#F1F6FC align=center><font class=cat><b><nobr><?=$k; ?>$</nobr></b></font></td><td></td></tr>

</table>

<table width=100% border=0>
<tr>
<td align=right><input class="bluebutton" type="submit" value="Пересчитать"></td>
</tr>
</table>

</form>


<form action="javascript:order_shopping();" method=post>

<table width=100% border=0>
<tr>
<td align=center><input type="submit" class="redbutton" value="Оформить заказ!"></td>
<td align=center><input type="button" class="bluebutton" value="Закрыть" onClick="window.close();"></td>
</tr>
</table>

</form>

<?
    }
    else {
        echo "<p><font>Ваша корзина пуста!</font></p>\n";
        echo "<form><input type=\"button\" class=\"bluebutton\" value=\"Закрыть\" onClick=\"window.close();\"></form>\n";
    };

?>
</center></body>

</html>



--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
-=Ustas=-
Дата 27.3.2007, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 32
Всего: 69



americanets, что у тебя за проблемы?!
элементарный пример:
Код

<?php

session_start();

function action_cart( $item, $action, &$cart )
{
    $is_exists = FALSE;
    $count     = sizeof( $cart['gids'] );
    for ( $i = 0; $i < $count; $i++ ) {
        if ( $cart['gids'][ $i ] == $item ) {
            $is_exists = TRUE;
            break;
        }
    }
    
    switch ( $action ) {
        
        case ( 'add' ):
            if ( ! $is_exists ) {
                array_push( $cart['gids'], $item );
                $cart['counts'][ $item ] = 1;
            } else {
                $cart['counts'][ $item ] += 1;
            }
            break;
        
        case ( 'remove' ) :
            if ( $is_exists ) {
                unset( $cart['counts'][ $item ] );
                unset( $cart['gids'][ $i ] );
                
                $cart['gids'] = array_values( $cart['gids'] );
            }
            break;
    }
    return( 0 );
}

if ( ! empty( $_GET['add'] ) ) {
    
    $item = intval( $_GET['add'] );
    
    if ( ! isset( $_SESSION['gids'] ) ) {
        $_SESSION['gids']   = array();
        $_SESSION['counts'] = array();
    }
    
    action_cart( $item, 'add', $_SESSION );
}

if ( ! empty( $_GET['remove'] ) ) {
    
    $item = intval( $_GET['remove'] );
    
    action_cart( $item, 'remove', $_SESSION );
}

?>

добавляем как cart.php?add=22, удаляем - cart.php?remove=22, где 22 - это ID товара. Посмотри как это работает, список и вывод списка сам уже допишешь.

Добавлено через 1 минуту и 53 секунды
Имеем такую структуру в сессии
Код

Array
(
    [gids] => Array
        (
            [0] => 25
            [1] => 21
            [2] => 22
            [3] => 23
        )

    [counts] => Array
        (
            [25] => 1
            [21] => 1
            [22] => 2
            [23] => 1
        )

)



--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
americanets
Дата 27.3.2007, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1100
Регистрация: 27.9.2006

Репутация: 5
Всего: 12



Сделал так, работоспособность увеличелась, те почти работает,  но выводит не все цены и количество пишет 0, если добавляю одну позицию может прибавить к другой 


Код

<? //корзина пользователя
//соединиться с БД
require("config.php");
mysql_connect($CFG->db_host, $CFG->db_user, $CFG->db_pass);
mysql_select_db($CFG->db_name);

session_start();
function action_cart( $item, $action, &$cart )
{
    $is_exists = FALSE;
    $count     = sizeof( $cart['gids'] );
    for ( $i = 0; $i < $count; $i++ ) {
        if ( $cart['gids'][ $i ] == $item ) {
            $is_exists = TRUE;
            break;
        }
    }
    switch ( $action ) {
        case ( 'add' ):
            if ( ! $is_exists ) {
                array_push( $cart['gids'], $item );
                $cart['counts'][ $item ] = 1;
            } else {
                $cart['counts'][ $item ] += 1;
            }
            break;
        case ( 'remove' ) :
            if ( $is_exists ) {
                unset( $cart['counts'][ $item ] );
                unset( $cart['gids'][ $i ] );
                $cart['gids'] = array_values( $cart['gids'] );
            }
            break;
    }
    return( 0 );
}
if ( ! empty( $_GET['add'] ) ) {    
    $item = intval( $_GET['add'] );   
    if ( ! isset( $_SESSION['gids'] ) ) {
        $_SESSION['gids']   = array();
        $_SESSION['counts'] = array();
    } 
    action_cart( $item, 'add', $_SESSION );
}
if ( ! empty( $_GET['remove'] ) ) { 
    $item = intval( $_GET['remove'] );
    action_cart( $item, 'remove', $_SESSION );
}
?>
<html>
<head>
<link rel=STYLESHEET href="style.css" type="text/css">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Корзина</title>
<script>
function order_shopping() { //оформление заказа -- закрыть окно и перейти к странице оформления заказа в главном окне
window.opener.location = 'order.php';
window.close();
};
</script>
</head>
<body><center>
<?
    //берем товары из $gids[]
    //посчитаем кол-во товаров в корзине
    $c=0;
    if (isset($_SESSION['gids']))
    for ($j=0; $j<count($_SESSION['gids']); $j++) if ($_SESSION['gids'][$j]) $c++;
    //если корзинa не пуста
    if (isset($_SESSION['gids']) && $c) {
?>
<table width=100%><tr><td><font color=#3551C7><b>Ваша корзина:</b></font></td>
<td align=right><a href="cart.php?clear_cart=yes"><font color=#2531A7><img src="images/remove.jpg" border=0> <u>очистить</u></font></a></td></table>
<form action="cart.php?update=yes" method=post>
<table border=0 cellspacing=1 cellpadding=2 bgcolor=#E1E6FC width=100%>
<tr align=center bgcolor=#D1D9F8>
<td><font color=#3551C7>Наименование</font></td><td><font color=#3551C7>Количество</font></td><td><font color=#3551C7>Стоимость, $</font></td><td width=20></td>
</tr>
<?
$k=0; //общая стоимость корзины
for ($i=0; $i<count($_SESSION['gids']); $i++)
if ($_SESSION['gids'][$i]) {
$q = mysql_query("SELECT * FROM shop WHERE ID='".$_SESSION['gids'][$i]."'") or die (mysql_error());
if ($r = mysql_fetch_array($q)) {
echo "<tr bgcolor=white >\n<td>".$r[name]."</td>\n";
echo "<td align=center>\n";
echo "<input type=\"text\" name=\"count_".$_SESSION['gids'][$i]."\" size=5 value=\"".$_SESSION['counts'][$i]."\">\n</td>\n";
echo "<td align=center>".($_SESSION['counts'][$i]*$r[cena])."</td>\n";
echo "<td align=center><a href=\"cart3.php?remove=".$_SESSION['gids'][$i]."\" class=small><img src=\"images/remove.jpg\" border=0 alt=\"удалить\"></a></td>\n</tr>\n";
$k += $_SESSION['counts'][$i]*$r[cena];
};
};    //итого...
?>
<tr bgcolor=white><td><font class=cat><b>Итого:</b></font></td><td><br><br></td><td bgcolor=#F1F6FC align=center><font class=cat><b><nobr><?=$k; ?>$</nobr></b></font></td><td></td></tr>
</table>
<table width=100% border=0>
<tr>
<td align=right><input class="bluebutton" type="submit" value="Пересчитать"></td>
</tr>
</table>
</form>
<form action="javascript:order_shopping();" method=post>
<table width=100% border=0>
<tr>
<td align=center><input type="submit" class="redbutton" value="Оформить заказ!"></td>
<td align=center><input type="button" class="bluebutton" value="Закрыть" onClick="window.close();"></td>
</tr>
</table>
</form>
<?
}
else {
echo "<p><font>Ваша корзина пуста!</font></p>\n";
echo "<form><input type=\"button\" class=\"bluebutton\" value=\"Закрыть\" onClick=\"window.close();\"></form>\n";
    };
?>
</center></body>
</html>



--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
SelenIT
Дата 27.3.2007, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



Имхо, в примере -=Ustasа=- $_SESSION['gids'] вообще не нужен, т.к. всегда может быть получен как array_keys($_SESSION['counts']). А последний удобнее перебирать циклом foreach. Ну и для проверки вхождения элемента в массив лучше, разумеется, использовать ф-цию in_array, нежели сравнение с каждым элементом в цикле...

Даже in_array не нужна, достаточно проверить существование элемента по ключу...
Код

function action_cart( $item, $action, &$cart )
{
    switch ( $action ) {
        case 'add':
            if ( isset($cart['counts'][ $item ]) ) {
                $cart['counts'][ $item ]++;
            } else {
                $cart['counts'][ $item ] = 1;
            }
            break;
        case 'remove':
            if ( isset($cart['counts'][ $item ]) ) {
                unset( $cart['counts'][ $item ] );
            }
            break;
    }
    return( 0 );
}


Это сообщение отредактировал(а) SelenIT - 27.3.2007, 12:40


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
americanets
Дата 27.3.2007, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1100
Регистрация: 27.9.2006

Репутация: 5
Всего: 12



SelenIT, ничего не понимаю :( можно по подробнее раскыть суть сказанного в примерах smile

Добавлено через 1 минуту и 17 секунд
очень нужна эта корзинка 


--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
SelenIT
Дата 27.3.2007, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



americanets, суть проста - для хранения инфы о товарах в корзине достаточно одного ассоциативного массива: id_товара => количество. Все остальное (цену, название и т.п.) берем из базы по id.

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

А вот примерно так пойдет вывод товаров из базы:
Код

<table border=0 cellspacing=1 cellpadding=2 bgcolor=#E1E6FC width=100%>
<tr align=center bgcolor=#D1D9F8>
<td><font color=#3551C7>Наименование</font></td><td><font color=#3551C7>Количество</font></td><td><font color=#3551C7>Стоимость, $</font></td><td width=20></td>
<?
$k=0; //общая стоимость корзины
$query = "SELECT * FROM shop WHERE id IN(".implode(',', array_keys($_SESSION['count']).")";
$q = mysql_query($query) or die (mysql_error());
while ($r = mysql_fetch_array($q)) {
    echo "<tr bgcolor=white >\n<td>".$r['name']."</td>\n";
    echo "<td align=center>\n";
    echo "<input type=\"text\" name=\"count_".$r['id']."\" size=5   value=\"".$_SESSION['counts'][$r['id']]."\">\n</td>\n";
    echo "<td align=center>".($_SESSION['counts'][$r['id']]*$r['cena'])."</td>\n";
    echo "<td align=center><a href=\"cart3.php?remove=".$r['id']."\" class=small><img src=\"images/remove.jpg\" border=0 alt=\"удалить\"></a></td>\n</tr>\n";
    $k += $_SESSION['counts'][$r['id']]*$r['cena'];
}
//итого...
?>
<tr bgcolor=white>
     <td><font class=cat><b>Итого:</b></font></td>
     <td><br><br></td>
     <td bgcolor=#F1F6FC align=center><font class=cat><b><nobr><?= $k; ?>$</nobr></b></font></td>
     <td></td>
</tr>
</table>


Upd.: сорри, сначала не заметил и не исправил один остаток списанного в утиль $_SESSION['gids']. Теперь по идее верно.

Upd.2: вот по идее весь код переделанный ;)
Код

<? //корзина пользователя
//соединиться с БД
require ("config.php");
mysql_connect($CFG->db_host, $CFG->db_user, $CFG->db_pass);
mysql_select_db($CFG->db_name);
session_start();

function add_to_cart($item) {
    if (isset($_SESSION['counts'][$item])) {
        $_SESSION['counts'][$item]++;
    }
    else {
        $_SESSION['counts'][$item] = 1;
    }
}

function remove_from_cart($item) {
    if (isset($_SESSION['counts'][$item])) {
        unset($_SESSION['counts'][$item]);
    }
}

if (!empty($_GET['add'])) {
    $item = intval($_GET['add']);
    if (!isset($_SESSION['counts'])) {
        $_SESSION['counts'] = array();
    }
    add_to_cart($item);
}
if (!empty($_GET['remove'])) {
    $item = intval($_GET['remove']);
    remove_from_cart($item);
}
?>
<html>
<head>
<link rel=STYLESHEET href="style.css" type="text/css">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Корзина</title>
<script>
function order_shopping() { //оформление заказа -- закрыть окно и перейти к странице оформления заказа в главном окне
    window.opener.location = 'order.php';
    window.close();
};
</script>
</head>
<body><center>
<?
//берем товары из $_SESSION['counts'] : id-шки из ключей, кол-ва из значений
//если корзинa не пуста
if (isset($_SESSION['counts']) && array_sum($_SESSION['counts']))) {
?>
<table border=0 cellspacing=1 cellpadding=2 bgcolor=#E1E6FC width=100%>
<tr align=center bgcolor=#D1D9F8>
<td><font color=#3551C7>Наименование</font></td><td><font color=#3551C7>Количество</font></td><td><font color=#3551C7>Стоимость, $</font></td><td width=20></td>
<?
    $k = 0;//общая стоимость корзины
    $query = "SELECT * FROM shop WHERE id IN(" . implode(',', array_keys($_SESSION['counts'])) . ")";
    $q = mysql_query($query) or die(mysql_error());
    while ($r = mysql_fetch_array($q)) {
?>    
    <tr bgcolor=white >
        <td><?= $r['name'] ?></td>
     <td align=center><input type="text" name="count_<?= $r['id'] ?>" size=5   value="<?= $_SESSION
['counts'][$r['id']] ?>"></td>
     <td align=center><?= ($_SESSION['counts'][$r['id']] * $r['cena']) ?></td>
     <td align=center><a href="cart3.php?remove=<?= $r['id'] ?>" class=small><img src="images/remove.jpg" border=0 alt="удалить"></a></td>
    </tr>
<?
        $k += $_SESSION['counts'][$r['id']] * $r['cena'];
    }
    //итого...
?>
<tr bgcolor=white>
     <td><font class=cat><b>Итого:</b></font></td>
     <td><br><br></td>
     <td bgcolor=#F1F6FC align=center><font class=cat><b><nobr><?= $k; ?>$</nobr></b></font></td>
     <td></td>
</tr>
</table>
<table width=100% border=0>
<tr>
<td align=right><input class="bluebutton" type="submit" value="Пересчитать"></td>
</tr>
</table>
</form>
<form action="javascript:order_shopping();" method=post>
<table width=100% border=0>
<tr>
<td align=center><input type="submit" class="redbutton" value="Оформить заказ!"></td>
<td align=center><input type="button" class="bluebutton" value="Закрыть" onClick="window.close();"></td>
</tr>
</table>
</form>
<? } else { ?>
<p><font>Ваша корзина пуста!</font></p>
<form><input type=\"button\" class=\"bluebutton\" value=\"Закрыть\" onClick=\"window.close();\"></form>
<? } ?>
</center></body>
</html>


Это сообщение отредактировал(а) SelenIT - 27.3.2007, 14:00


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
americanets
Дата 27.3.2007, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1100
Регистрация: 27.9.2006

Репутация: 5
Всего: 12



сделал, пишет 

Код

Warning: array_keys() [function.array-keys]: The first argument should be an array in z:\home\1.ru\www\cart.php on line 69

Warning: implode() [function.implode]: Bad arguments. in z:\home\1.ru\www\cart.php on line 69
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 ')' at line 1



Код

<? //корзина пользователя
//соединиться с БД
require("config.php");
mysql_connect($CFG->db_host, $CFG->db_user, $CFG->db_pass);
mysql_select_db($CFG->db_name);

session_start();
function action_cart( $item, $action, &$cart )
{
    switch ( $action ) {
        case 'add':
            if ( isset($cart['counts'][ $item ]) ) {
                $cart['counts'][ $item ]++;
            } else {
                $cart['counts'][ $item ] = 1;
            }
            break;
        case 'remove':
            if ( isset($cart['counts'][ $item ]) ) {
                unset( $cart['counts'][ $item ] );
            }
            break;
    }
    return( 0 );
}


if ( ! empty( $_GET['add'] ) ) {    
    $item = intval( $_GET['add'] );   
    if ( ! isset( $_SESSION['gids'] ) ) {
        $_SESSION['gids']   = array();
        $_SESSION['counts'] = array();
    } 
    action_cart( $item, 'add', $_SESSION );
}
if ( ! empty( $_GET['remove'] ) ) { 
    $item = intval( $_GET['remove'] );
    action_cart( $item, 'remove', $_SESSION );
}
?>
<html>

<head>
<link rel=STYLESHEET href="style.css" type="text/css">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Корзина</title>
<script>
function order_shopping() { //оформление заказа -- закрыть окно и перейти к странице оформления заказа в главном окне
    window.opener.location = 'order.php';
    window.close();
};
</script>
</head>
<body><center>
<?
    //берем товары из $gids[]
    //посчитаем кол-во товаров в корзине 
    $c=0;
    if (isset($_SESSION['gids']))
    for ($j=0; $j<count($_SESSION['gids']); $j++) if ($_SESSION['gids'][$j]) $c++;
    //если корзинa не пуста
    if (isset($_SESSION['gids']) && $c) {
?>
<table border=0 cellspacing=1 cellpadding=2 bgcolor=#E1E6FC width=100%>
<tr align=center bgcolor=#D1D9F8>
<td><font color=#3551C7>Наименование</font></td><td><font color=#3551C7>Количество</font></td><td><font color=#3551C7>Стоимость, $</font></td><td width=20></td>
<?
$k=0; //общая стоимость корзины
$query = "SELECT * FROM shop WHERE id IN(".implode(',', array_keys($_SESSION['count'])).")";
$q = mysql_query($query) or die (mysql_error());
while ($r = mysql_fetch_array($q)) {
    echo "<tr bgcolor=white >\n<td>".$r['name']."</td>\n";
    echo "<td align=center>\n";
    echo "<input type=\"text\" name=\"count_".$_SESSION['gids'][$r['id']]."\" size=5   value=\"".$_SESSION['counts'][$r['id']]."\">\n</td>\n";
    echo "<td align=center>".($_SESSION['counts'][$r['id']]*$r['cena'])."</td>\n";
    echo "<td align=center><a href=\"cart3.php?remove=".$r['id']."\" class=small><img src=\"images/remove.jpg\" border=0 alt=\"удалить\"></a></td>\n</tr>\n";
    $k += $_SESSION['counts'][$r['id']]*$r['cena'];
}
//итого...
?>
<tr bgcolor=white><td><font class=cat><b>Итого:</b></font></td><td><br><br></td><td bgcolor=#F1F6FC align=center><font class=cat><b><nobr><?=$k; ?>$</nobr></b></font></td><td></td></tr>
</table>


<table width=100% border=0>
<tr>
<td align=right><input class="bluebutton" type="submit" value="Пересчитать"></td>
</tr>
</table>
</form>
<form action="javascript:order_shopping();" method=post>
<table width=100% border=0>
<tr>
<td align=center><input type="submit" class="redbutton" value="Оформить заказ!"></td>
<td align=center><input type="button" class="bluebutton" value="Закрыть" onClick="window.close();"></td>
</tr>
</table>
</form>
<?
}
else {
echo "<p><font>Ваша корзина пуста!</font></p>\n";
echo "<form><input type=\"button\" class=\"bluebutton\" value=\"Закрыть\" onClick=\"window.close();\"></form>\n";
    };
?>
</center></body>
</html>



--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
SelenIT
Дата 27.3.2007, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



americanets, гляньте последний вариант в моем прошлом отредактированном посте.

не хотелось уходить с 777 на счетчике... но так и быть, ради Вас... ;)


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
-=Ustas=-
Дата 27.3.2007, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 32
Всего: 69



Цитата(SelenIT @  27.3.2007,  12:32 Найти цитируемый пост)
Имхо, в примере -=Ustasа=- $_SESSION['gids'] вообще не нужен, т.к. всегда может быть получен как array_keys($_SESSION['counts']). А последний удобнее перебирать циклом foreach. Ну и для проверки вхождения элемента в массив лучше, разумеется, использовать ф-цию in_array, нежели сравнение с каждым элементом в цикле...


Да, ты прав, об оптимизации я не думал в этом примере.
Просто писал с утра на вскидку, опаздывая на работу и запивая кофем бутер smile


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
americanets
Дата 27.3.2007, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1100
Регистрация: 27.9.2006

Репутация: 5
Всего: 12



SelenIT, 

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

Код

if (!empty($_POST['update'])) {
    $vars = get_defined_vars();
    foreach ($vars as $key => $val)
    if ($val>0) {
    for ($i=0; $i<count($_SESSION['counts']); $i++)
    if ($_SESSION['counts'][$i] == str_replace("count_","",$key)) {
    $_SESSION['counts'][$i] = $val;
    };
}
}



--------------------
Пусть популярную музыку слушают те, среди кого она популярна
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0720 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.