UPDATE всех строк

Тема в разделе "PHP", создана пользователем fredis69, 4 сен 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. fredis69

    fredis69 Постоялец

    Регистр.:
    25 окт 2008
    Сообщения:
    84
    Симпатии:
    2
    Здравствуйте!
    Есть корзина товар, в которой пользователь меняет колличество заказываемого товар (автоматом количество ставится 1, пользователь только в корзине может поменять количество товара).
    Вот мой скрипт корзины:
    PHP:
    <?php if(empty($_POST)) { ?>
    <form method="post">
    <?php
    $res_basket 
    mysql_query("SELECT * FROM basket WHERE id_user='$order_user_id' ORDER BY id ASC");
    $row_basket mysql_fetch_array($res_basket);
    if (
    $row_basket){
    do{
    $id_product $row_basket['id_product'];
    $res_product mysql_query("SELECT * FROM product WHERE id='$id_product'");
    $row_product mysql_fetch_array($res_product);
    if (
    $row_product){?>
    <table><tr>
    <td><?=$row_product['title']?></td>
    <td><input type="text" name="item[]" value="<?=$row_basket['quantity']?>"></td>
    </tr></table>
    <?php }}
    while (
    $row_basket mysql_fetch_array($res_basket));
    }
    ?>
    <input type="submit" name="submitcount" value="Пересчитать стоимость заказа" />
    </form>
    <?php }
    else{
    if(isset(
    $_POST['item']))
    {
        
    $items = array();
        foreach(
    $_POST['item'] as $value)
        {
            if(
    ctype_digit($value)) $items[] = $value;
        }
        if(
    count($items) > 0)
        {
            
    $ids implode(','$items);
            
    $query "UPDATE basket SET quantity='$ids' WHERE id_user='$order_user_id' ";
            
    mysql_query($query);
        }
        if(
    $query)
        {
    echo 
    "<META HTTP-EQUIV=\"refresh\" content=\"1;URL=/basket/\">";  
        }
    }
    }
    ?>
    Данный скрипт меняет количество заказываемых товаров во всех строка на число указанное в самом первом input,

    Допустим в корзине выводится:
    молоко - 1
    хлеб - 1
    мороженое - 1



    Если мне надо заказать хлеба 3шт, я меняю 1 на 3:
    молоко - 1
    хлеб - 3
    мороженое - 1


    После чего нажимаю на кнопку пересчитать сумму, и у меня происходит перезагрузка и выводится:
    молоко - 1
    хлеб - 1
    мороженое - 1


    А если я меняю количество первого товара (молоко:(
    молоко - 3
    хлеб - 1
    мороженое - 1


    То выводится:
    молоко - 3
    хлеб - 3
    мороженое - 3


    Подскажите как это исправить, я так понимаю надо еще передавать id строки корзины, и изменить в БД именно строку с этим id.
    $order_user_id - это ид пользователя.
     
  2. horpah

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    200
    Симпатии:
    55
    Ошибка в том, что
    PHP:
    $ids implode(','$items); 
            
    $query "UPDATE basket SET quantity='$ids' WHERE id_user='$order_user_id' "
            
    mysql_query($query);
    выдаст ошибку в запросе в случае если в $items 2 товара и более
    поскольку SQL запрос приобретает неверный синтаксис типа
    UPDATE basket SET quantity='1,3,4,6'
    Далее не совсем очевидный баг. У тебя в цикле WHILE стоит SQL запрос. Это значит что выбрав большой ассортимент и пересчитав его твой прибьеш свой сервер. 1000 товаров = 1000 запросов :))
    Перепеиши запрос так:
    SELECT B.*,P.* FROM basket B
    LEFT JOIN product P ON P.id=B.id_product
    WHERE B.id_user='$order_user_id' ORDER BY B.id ASC"
    Таким образом объединишь таблицы корзина-товары. И вообще, если SQL запрос попадает в цикл, подумай, скорее всего ты делаешь что-то не правильно.
     
  3. fredis69

    fredis69 Постоялец

    Регистр.:
    25 окт 2008
    Сообщения:
    84
    Симпатии:
    2

    Несовсем понял, что делать. можно поподробнее пожалуйсто
     
  4. horpah

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    200
    Симпатии:
    55
    1)
    Пусть items у нас массив с одним значением 3
    тогда
    $ids = implode(',', $items); сделает $ids равным 3
    и запрос
    $query = "UPDATE basket SET quantity='3' WHERE id_user='$order_user_id' ";
    имеет верный синтаксис.
    2)
    Пусть items у нас массив с тремя значениями 3,5,7
    тогда
    $ids = implode(',', $items); сделает $ids строкой вида"3,5,7"

    и запрос
    $query = "UPDATE basket SET quantity='3,5,7' WHERE id_user='$order_user_id' ";
    имеет не верный верный синтаксис, т.е. апдейта не будет.

    Далее о цикле. Сейчас он выглядит так:
    PHP:
    $res_basket mysql_query("SELECT * FROM basket WHERE id_user='$order_user_id' ORDER BY id ASC"); 
    $row_basket mysql_fetch_array($res_basket); 
    if (
    $row_basket){ 
    do{ 
    $id_product $row_basket['id_product']; 
    $res_product mysql_query("SELECT * FROM product WHERE id='$id_product'"); 
    $row_product mysql_fetch_array($res_product);
    ............. 
    while (
    $row_basket mysql_fetch_array($res_basket)); 
    }
    Ты сначала получаешь все товары из корзиныа потом в цикле для каждого корзинного товара ищешь в товарной таблице "title" товара.
    Смотри SQL запрос в моем посте вышетак ты порлучишь одним запросом набор данныхгде к каждому товару из корзины присоединены столбцы из  product в соответствии  product.id=Basket.id_product:
    _____________________________________________________________________________
    то что пришло из 
    "Корзины"                   то что пришло из   "товаров"  |
    _____________________________________________|_______________________________|
    useridprodunctid,itemcount,....и.т.п       title,........                |
    ...............
    и таких по строке на 1 вид товара.............................|
    _____________________________________________________________________________|
     
    fredis69 нравится это.
  5. fredis69

    fredis69 Постоялец

    Регистр.:
    25 окт 2008
    Сообщения:
    84
    Симпатии:
    2
    А как поменять количество заказа именно в той строке в которой надо, точнее как определить в какой строке(для какого товара) менять количество
     
  6. horpah

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    200
    Симпатии:
    55
    А вот тут в цикле :))
    PHP:
    $itemIDs массив из ID товаровлегко получается при фетче предыдущего запроса.
    $quantities массив из количеств единиц товара в корзине пришел из ПОСТа
    foreach(
    $itemIDs as $i=>$id){
     
    запрос UPDATE basket SET quantity='$quantities[$i]' WHERE id_user='$order_user_id' AND поле_для_IDтовара=$itemIDs[$i]
    }
     
    fredis69 нравится это.
  7. fredis69

    fredis69 Постоялец

    Регистр.:
    25 окт 2008
    Сообщения:
    84
    Симпатии:
    2
    horpah
    Извени пожалуйсто, но я нече немогу понять, я не спец в php, так маленько знаком.

    Можеш пожалуйсто написать как будет все выглядеть полностью(готовый скрипт), если нетрудно.

    ---------- Post added at 18:23 ---------- Previous post was at 16:33 ----------

    Ребята, помогите пожалуйсто разобраться, очень надо.
     
Статус темы:
Закрыта.