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

Фанат

oncle terrible
Команда форума
это все целиком какой-то бред. при чем здесь parse? зачем здесь parse?

Если у тебя скрипт может сохранять как новую запись, так и обновлять старую, то тебе надо ДВА запроса. ДВА, Карл. Не надо карячиться с одним.
Если у тебя нет айди и ты знаешь, что это вставка - сделай запрос INSERT
Если у тебя есть айди и тыпонимаешь, что это обновление - сделай запрос UPDATE.

простые запросы, доступные даже новичку. И никаких проблем.
 

peretc001

Новичок
...[поржал над собой]...
исправил структуру бд на null
и исправил код:
PHP:
$id = $db->getOne('SELECT id FROM user WHERE sid=?s',$sid);
$data = array('firstname' => $_POST['firstname'], 'lastname' => $_POST['lastname'], 'middlename' => $_POST['middlename'], 'phone' => $_POST['phone'], 'email' => $_POST['email'], 'city' => $_POST['city'],'msg' => $_POST['msg']);
$sql  = "INSERT INTO user SET id=?s, sid=?s, date=?s, ?u ON DUPLICATE KEY UPDATE ?u";
$db->query($sql,$id,$sid,$date,$data,$data);
 

Фанат

oncle terrible
Команда форума
при таком запросе вобновление не запишутся sid и date
 

peretc001

Новичок
при таком запросе вобновление не запишутся sid и date
да
PHP:
$sql  = "INSERT INTO user SET id=?s, sid=?s, date=?s, ?u ON DUPLICATE KEY UPDATE sid='$sid', date='$date', ?u";
если сессию не надо обновлять то как написал WMix (спасибо ему!)
PHP:
$id = $db->getOne('SELECT id FROM user WHERE sid=?s',$sid);
$data = array('firstname' => $_POST['firstname'], 'lastname' => $_POST['lastname'], 'middlename' => $_POST['middlename'], 'phone' => $_POST['phone'], 'email' => $_POST['email'], 'city' => $_POST['city'],'msg' => $_POST['msg']);
$data['date'] = date('Y-m-d H:i:s'); // дата и время
$sql  = "INSERT INTO user SET id=?s, sid=?s, ?u ON DUPLICATE KEY UPDATE ?u";
$db->query($sql,$id,$sid,$data,$data);
 
Последнее редактирование:

Фанат

oncle terrible
Команда форума
ну вот и не надо выпендриваться, а над взять и написать два запроса
PHP:
if($id)
{
    $db->query("INSERT INTO user SET id=?s, sid=?s, date=?s, ?u", $sid, $date, $data );
} else {
    $db->query("UPDATE  user SET id=?s, sid=?s, date=?s, ?u WHERE id = ?i", $sid, $date, $data, $id );
}
 

peretc001

Новичок
не выпендриваюсь, просто интересуюсь чем один запрос ON DUPLICATE KEY UPDATE плох?
 

Фанат

oncle terrible
Команда форума
Во-первых - читабельность
Чем код стандартнее и однозначнее, тем его проще поддерживать и читать.
Во-вторых, адекватность
Каждый инструмент должен делать свое дело. У тебя может произойти такая ситуация, что кто-то удалил запись, а ты ее обратно вставил.
Потому что у тебя запрос и делает и вставку и апдейт.
А желательно все-таки делать что-то одно. А хитрые запросы с винтом употреблять только там, где без них не обойтись .
 

peretc001

Новичок
понял.
пытаюсь исправить, но у меня не работает if($id), работает if(empty($id)) или if($id=null)
PHP:
$db->query("INSERT INTO user SET id=?s, sid=?s, date=?s, ?u", $sid, $date, $data ); # не работает
$db->query("INSERT INTO user SET id=?s, sid=?s, date=?s, ?u", $id, $sid, $date, $data ); # работает
и не работает
PHP:
$db->query("UPDATE user SET id=?s, sid=?s, date=?s, ?u WHERE id = ?i", $sid, $date, $data, $id );
нехватает одного аргумента
 

Фанат

oncle terrible
Команда форума
во-первых, я перепутал логику.
if($id) UPDATE else INSERT
то есть надо запросы поменять местами.

во-вторых, в при инсерте тебе не нужен id
И УЖ ТЕМ БОЛЕЕ - при апдейте.
так что убери id=?s изо всех запросов
 

peretc001

Новичок
Знаете что я вам хочу сказать Фанат...

СПАСИБО!!!

вот так работает
PHP:
if(empty($id))
{
    $db->query("INSERT INTO user SET id=?s, sid=?s, ?u", $id, $sid, $data );
} else {
    $db->query("UPDATE  user SET sid=?s, date=?s, ?u WHERE id = ?i", $sid, $date, $data, $id );
}
или
PHP:
if($id)
{
    $db->query("UPDATE  user SET sid=?s, date=?s, ?u WHERE id = ?i", $sid, $date, $data, $id );
} else {
    $db->query("INSERT INTO user SET id=?s, sid=?s, ?u", $id, $sid, $data );
}
тоже работает.
 

Фанат

oncle terrible
Команда форума
пожалуйста.
если будут еще проблемы - лучше сюда пиши, чтобы дров не наломать
 

peretc001

Новичок
ну и теперь вопрос, который у меня был изначально.
PHP:
# Проверяем наличие ранее оформленного заказа данным покупателем
    $zakaz_id = $db->getOne('SELECT id FROM zakaz_new WHERE sid=?s',$sid); 
 
    if ( $zakaz_id ) {
     
        # Удаляем ранее оформленный заказ
        $delete = $db->query("DELETE FROM zakaz_new WHERE sid=?s",$sid);
     
        # Переносим из корзины и записываем номер $user_id
        $insert = mysql_query("INSERT INTO zakaz_new (id, product_id, name, model, url, img, qty, price, color, sid, date, total, user_id)
        SELECT '', id, name, model, url, img, qty, price, color, sid, date, total, '". $user_id ."' FROM cart WHERE sid = '$sid' ");
    }
    else {
     
        # Переносим из корзины и записываем номер $user_id
        $insert = mysql_query("INSERT INTO zakaz_new (id, product_id, name, model, url, img, qty, price, color, sid, date, total, user_id)
        SELECT '', id, name, model, url, img, qty, price, color, sid, date, total, '". $user_id ."' FROM cart WHERE sid = '$sid' "); 
    }
Правильно ли это, удалять и заново записывать, или можно как-то применить ON DUPLICATE. На мой взгляд сложность в следующем:
Был оформлен заказ на 2 товара, а потом решили добавить еще один, вернулись назад, добавили в корзину еще товар и нажали Оформить. Запишется третий товар или только обновятся те 2 которые уже были?
Или если какой-то из товаров изменили на другой. Нужно как-то сравнить что в корзине а что в заказе, и добавить в заказ (или обновить)
 

Фанат

oncle terrible
Команда форума
проверка ранее существовавшего заказа - дебилизм.
у тебя что - люди будут только по одному разу в магазине заказ делать?
кстати, что такое sid? сессия? с какой стати сессия фигурирует в заказах?

короче. ты читал, что тебе тут говорили? что ты путаешь заказ с товаром?
почему в однй и той же таблице лежит и дата, и сумма, и КОЛИЧЕСТВО?
код твой здесь я не понимаю, но на вопросы ответить могу - как если бы структура таблиц была правильной.

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

Заказы должны представлять из себя ДВЕ таблицы.
одна - информация о заказе.
вторая - товары для заказа.

учитывая, что здесь вторая таблица практически копирует корзину, то можно добавить в нее поле ид заказа и она будет работать сразу и корзиной и заказами.
пока ид заказа нету - это корзина. появился - это заказ.

тогда и вставлять ничего не надо будет.
удалился товар? Удалил запись из таблицы.
добавли товар? Добавил запись в таблицу.

Но если отдельные таблицы у товарова в заказе и у корзины, то все равно никакой ON DUPLICATE.не поможет. он работает с ОДНОЙ строкой, а у тебя их НЕСКОЛЬКО в заказе.
так что да - сначала стереть те товары, которые есть в корзине, потом добавить из корзины свежее.
 

WMix

герр M:)ller
Партнер клуба
Корзину для простоты можно держать в сессии. но если хочешь в бд, то тогда это одна таблца, в которой есть только эти поля:
ид покупателя/ид товара/цена/цвет.
если хочешь в бд - отсюда и сессия, ну тоесть правильно держать в сессии, id заказа (корзины) конечно, но как бы там небыло, сессия и заказ (корзина) связаны, хотябы до тех пор пока пользователь не сообщил свой id (логин)
 
Сверху