if внутри запроса

peretc001

Новичок
Добрый день.

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

Код:
$zakaz_test = mysql_query("SELECT * FROM cart WHERE sid = '". session_id() ."' ");
            while($row = mysql_fetch_assoc($zakaz_test)) {
         
                if ( $number == $num and $number != "" ) {
                    $result = mysql_query("UPDATE `zakaz_test` SET id = '$row[id]',  name = '$row[name]',  model = '$row[model]'  WHERE number = '$num' and sid = '". session_id() ."' ");
            }
        else {
     
            $result = mysql_query("INSERT INTO `zakaz_test` (number, id, name, model) VALUES ('$number', '$row[id]', '$row[name]', '$row[model]' ) ");                     
        }
    }
Если заказ уже есть, при обновлении все товары меняются. ОБНОВЛЯЮТСЯ НА ПОСЛЕДНИЙ.
Т.е. Товар1, Товар2, Товар3 все меняются на Товар3 три раза.

Менял местами вложенность, сначала if потом $zakaz_test не помогло.
Помогите, пожалуйста.
 
Последнее редактирование:

antson

Новичок
Партнер клуба
UPDATE set ... where id= and sid=
или почитай про
INSERT… ON DUPLICATE KEY UPDATE
 

peretc001

Новичок
Я не понял про ON DUPLICATE но понял что это не то.

У меня получилось вместо UPDATE сделать DELETE и опять INSERT:

Код:
#Удаляем заказ
        $delit = mysql_query("DELETE FROM zakaz_test WHERE number= '$num' and sid = '". session_id() ."' ");
     
        #Записываем заново
        $zakaz_test = mysql_query("SELECT * FROM cart WHERE sid = '". session_id() ."' ");
            while($row = mysql_fetch_assoc($zakaz_test)) {
                    $input = mysql_query("INSERT INTO zakaz_test (...)  VALUES (...) ");           
                }
Понимаю что это как-то криво, но работает.

Проблема в том, что кроме полей из другой таблицы (cart) могут еще обновляться поля из формы через $_POST.
Через UPDATE не получается обновить
 

peretc001

Новичок
Полный код выглядит так:

PHP:
if ( $number == $num and $number != "" ) {
 
        #Удаляем заказ
        $delit = mysql_query("DELETE FROM zakaz_test WHERE number = '$num' and sid = '". session_id() ."' ");
     
        #Записываем заново
        $zakaz_test = mysql_query("SELECT * FROM cart WHERE sid = '". session_id() ."' ");
            while($row = mysql_fetch_assoc($zakaz_test)) {
                    $input = mysql_query("INSERT INTO zakaz_test (number, id, name, model, img, qty, price, color, sid, date, total, user_firstname, user_lastname, user_middlename, phone, mail, city, msg) 
                    VALUES ('$num', '$row[id]', '$row[name]', '$row[model]', '$row[img]', '$row[qty]', '$row[price]', '$row[color]', '$row[sid]', '$row[date]', '$total', '$_POST[user_firstname]', '$_POST[user_lastname]', '$_POST[user_middlename]', '$_POST[phone]', '$_POST[mail]', '$_POST[city]', '$_POST[msg]') ");                       
                 
                }
    }
    else {
     
            $zakaz_test = mysql_query("SELECT * FROM cart WHERE sid = '". session_id() ."' ");
            while($row = mysql_fetch_assoc($zakaz_test)) {
         
            $result = mysql_query("INSERT INTO `zakaz_test` (number, id, name, model, img, qty, price, color, sid, date, total, user_firstname, user_lastname, user_middlename, phone, mail, city, msg) 
            VALUES ('$number', '$row[id]', '$row[name]', '$row[model]', '$row[img]', '$row[qty]', '$row[price]', '$row[color]', '$row[sid]', '$row[date]', '$total', '$_POST[user_firstname]', '$_POST[user_lastname]', '$_POST[user_middlename]', '$_POST[phone]', '$_POST[mail]', '$_POST[city]', '$_POST[msg]') ");                     
        } 
       
    }
 

AnrDaemon

Продвинутый новичок
Что именно обновить не получается? Как именно не получатеся?
Показывайте уже SQL код и ошибки тоже SQL, раз у вас проблема с SQL.
 

peretc001

Новичок
Есть две таблицы: cart и zakaz_test
При оформлении заказа нужна проверка на наличие оформленного заказа, если покупатель оформил заказ, потом вернулся назад и решил поменять товар или номер телефона указал неверно, бывает такое, редко.

Оформление заказа происходит следующим образом:
PHP:
<?php session_start();
# Достаем sid
$sid = htmlspecialchars(trim($_GET['session_id']));
# Подключаем файл конфигурации
include ("../../inc/config.php");
error_reporting(E_ALL & ~E_NOTICE);

    # Определяем номер последнего договора
    $res = mysql_query("SELECT MAX(dogovor) FROM zakaz_test ");
    $row = mysql_fetch_row($res);
    $sum = $row[0]; // всего записей
    # Присваиваем следующий номер
    $dogovor = $sum + 1;
  
    # Определяем сумму всего заказа
    $query=mysql_query("SELECT *, SUM(total) as tot FROM cart WHERE sid = '". session_id() ."' ");
    $query=mysql_fetch_assoc($query);
    $total = $query['tot'];
  
    # Проверяем наличие ранее оформленного заказа данным покупателем
    $query=mysql_query("SELECT * FROM zakaz_test WHERE sid = '". session_id() ."' ");
    $query=mysql_fetch_assoc($query);
    # Далее будем использовать переменную $num
    $num = $query['dogovor'];
  
    # Если $dogovor равен $num, т.е. если этот номер договора уже есть, или пустой
    if ( $sum == $num and $sum != "" ) {
  
        # Удаляем ранее оформленный заказ
        $delit = mysql_query("DELETE FROM zakaz_test WHERE dogovor = '$num' and sid = '". session_id() ."' ");
      
        # Записываем заново исправленный
        $zakaz_test = mysql_query("SELECT * FROM cart WHERE sid = '". session_id() ."' ");
            while($row = mysql_fetch_assoc($zakaz_test)) {
                $input = mysql_query("INSERT INTO zakaz_test (dogovor, id, name, model, img, qty, price, color, sid, date, total, user_firstname, user_lastname, user_middlename, phone, mail, city, msg) 
                VALUES ('$num', '$row[id]', '$row[name]', '$row[model]', '$row[img]', '$row[qty]', '$row[price]', '$row[color]', '$row[sid]', '$row[date]', '$total', '$_POST[user_firstname]', '$_POST[user_lastname]', '$_POST[user_middlename]', '$_POST[phone]', '$_POST[mail]', '$_POST[city]', '$_POST[msg]') ");                      
                  
            }
    }
    else {
      
        $zakaz_test = mysql_query("SELECT * FROM cart WHERE sid = '". session_id() ."' ");
            while($row = mysql_fetch_assoc($zakaz_test)) {
                $result = mysql_query("INSERT INTO `zakaz_test` (dogovor, id, name, model, img, qty, price, color, sid, date, total, user_firstname, user_lastname, user_middlename, phone, mail, city, msg) 
                VALUES ('$dogovor', '$row[id]', '$row[name]', '$row[model]', '$row[img]', '$row[qty]', '$row[price]', '$row[color]', '$row[sid]', '$row[date]', '$total', '$_POST[user_firstname]', '$_POST[user_lastname]', '$_POST[user_middlename]', '$_POST[phone]', '$_POST[mail]', '$_POST[city]', '$_POST[msg]') ");                      
            }  
    }          
                  
    # Если добавление или обновление заказа прошло успешно - Удаляем запись из корзины
    if ( $result == true or $input == true ) {
        $result = mysql_query("DELETE FROM cart WHERE sid = '". session_id() ."' ");
    }
    else { echo "Ops...";}
      
    # Перенаправляем на страницу оплаты
    if ( $sum == $num and $sum != "" ) {
        echo '<script language="JavaScript">window.location.href = "/shop/confirm2.php?id='. $num .'"</script>';
    } else {
            echo '<script language="JavaScript">window.location.href = "/shop/confirm2.php?id='. $dogovor .'"</script>';
    }  
?>
Я пробовал просто обновлять заказ при наличии через:
PHP:
$result = mysql_query("UPDATE `zakaz_test` SET id = '$row[id]', name = '$row[name]', model = '$row[model]' WHERE dogovor = '$num' and sid = '". session_id() ."' ");
Но при обновлении все товары меняются на один и тот же, последний добавленный в корзину по времени.
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
Полный идиотизм. Во-первых, структура БД дурацкая. Клиенты должны храниться отдельно от заказов, даже если они не регистрируются явно отдельно, именно для предотвращения подобных проблем.
Во-вторых, определение следующего номера заказа - get_last_insert_id, а не чёрт знает что.
Что вернёт твой код, если между "SELECT MAX(dogovor)" и "INSERT INTO `zakaz_test`" кто-то ещё что-то закажет?
Не мучайся, я тебе так скажу - он вернёт тебе извещение об увольнении и повестку в суд за причинение организации материального ущерба.
 

AnrDaemon

Продвинутый новичок
Минимальный(!) набор таблиц для твоей задачи:
1. Список товара. (Артикул(id)-Наименование)
2. Список клиентов (id, name)
3. Список заказов (id, status, client_id)
4. Список товаров по заказам (zakaz_id, tovar_id)

Когда клиент редактирует адрес - никакой товар, [цензура], не меняется!
Когда клиент меняет список заказанных предметов, старый заказ маркируется в "отказ" и на ТОГО ЖЕ клиента заводится НОВЫЙ заказ. Никакого [цензура] "редактирования" заказа - ты хочешь, чтобы менеджер свихнулся? Или кладовщица корвалолом вместо булочек питалась?
 

WMix

герр M:)ller
Партнер клуба
AnrDaemon без сессии не обойтись, он еще не пользователь, а товары в корзину кидает, данные клиента нужно писать в заказ, как и цену продажи, а то вдруг поменяется?
 

AnrDaemon

Продвинутый новичок
Это уже другой вопрос. Пока работаем с базой, дальше будем учить работать над базой.
 

peretc001

Новичок
last_insert_id мне не подходит, т.к. последнее изменение могло быть неделю назад. Или я не понял как это сделать.
я нашел SELECT auto_increment FROM zakaz_test, вероятно это тоже что и MAX(id)?

По факту заказы оформляются, к сожалению, раз в 3-4 дня 1 шт. Но делаю с перспективой на будущее, чтоб не переделывать.
Основная задача: реализовать добавление аксессуара к уже оформленному заказу со страницы оплаты без оформления нового заказа. Поэтому я пытаюсь сделать UPDATE.

У меня есть таблица product, cart, zakaz_test. Еще добавил user.
Структура zakaz_test:

PHP:
`id` int(11) NOT NULL AUTO_INCREMENT,
  `name` text NOT NULL,
  `model` text NOT NULL,
  `img` text NOT NULL,
  `qty` text NOT NULL,
  `price` text NOT NULL,
  `color` text NOT NULL,
  `total` text NOT NULL,
  `sid` text,
  `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `user_id` text NOT NULL,
Структура user
PHP:
`id` int(11) NOT NULL AUTO_INCREMENT,
   `user_firstname` text NOT NULL,
  `user_lastname` text NOT NULL,
  `user_middlename` text NOT NULL,
  `phone` text NOT NULL,
  `mail` text NOT NULL,
  `city` text NOT NULL,
  `msg` text NOT NULL
Так? Связанное поле user_id в таблице zakaz_test и поле id в таблице user
 

peretc001

Новичок
Кстати теперь нужно определять не только последний номер договора но и последний id покупателя.
SELECT MAX(id) FROM user
 

antson

Новичок
Партнер клуба
last_insert_id() а макс не гарантирует правильность при одновременной вставке
вызывается сразу после вызова запроса .
 

peretc001

Новичок
last_insert_id() а макс не гарантирует правильность при одновременной вставке
вызывается сразу после вызова запроса .
на сколько я понял last_insert_id() выдает самое последнее в текущей сессии, а у меня user записан в другой сессии несколько дней назад.
Или я не правильно понял?

У меня выдает 0
PHP:
mysql_query(" SELECT * FROM user ");
    printf ("Last inserted record has id %d\n", mysql_insert_id());
 

peretc001

Новичок
Хотя он и в текущей сессии не выдает
а не, выдает:

PHP:
$add = mysql_query("INSERT INTO user (id, user_firstname, user_lastname, user_middlename, phone, mail, city, msg, sid) VALUES ('$user_id', '$_POST[user_firstname]', '$_POST[user_lastname]', '$_POST[user_middlename]', '$_POST[phone]', '$_POST[mail]', '$_POST[city]', '$_POST[msg]', '$sid' ) ");
    printf ("Last inserted record has id %d\n", mysql_insert_id());
а вод из другой сессии как вытянуть?
 
Последнее редактирование:

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
При чем тут сессии? last_insert_id работает только когда ты данные вставляешь, то есть вернет тебе последний автоинкремент.
 

peretc001

Новичок
Блин. Давайте на пальцах. Пришел на сайт покупатель, оформил заказ, например 1.
Через год пришел второй покупатель. Оформил заказ. Как мне через год узнать id его заказа?
Вставлять любое значение, например 365, определять это последнее значение (365), удалять его, а потом опять вставлять?
Так этот last_insert_id и будет 365.

Мне нужно узнать следующий id который еще не вставляли, который вставят через год.

Или я не понимаю как работает оформление заказа, или вы не можете мне объяснить.
 
Сверху