За последние 24 часа нас посетил 21671 программист и 1017 роботов. Сейчас ищут 686 программистов ...

Как заменить INSERT INTO на UPDATE SET ?

Тема в разделе "PHP для новичков", создана пользователем 118_64, 8 сен 2017.

Метки:
  1. 118_64

    118_64 Активный пользователь

    С нами с:
    8 янв 2015
    Сообщения:
    84
    Симпатии:
    2
    Есть таблица table:
    PHP:
    1. order_id  value  number  user_id
    2. 1         aa     3       20
    3. 2         cc     5       30

    Есть и работает обновление таблицы с помощью конструкции:
    PHP:
    1. $query = 'INSERT INTO `table` (`order_id`, `value`, `number`) VALUES ';
    2. //some code
    3. $query .= ' ON DUPLICATE KEY UPDATE order_id = VALUES(order_id), value = VALUES(value), number = VALUES(number)';

    Данные, поступающие на вход, я не контролирую (они подгружаются с помощью ajax), поэтому пытаюсь добавить дополнительную проверку на правку пользователем только "своих" строк, т.е. проверку на соответствие order_id и user_id с помощью запроса:
    PHP:
    1. UPDATE 'table'
    2.   SET
    3.    'value' = CASE `order_id`
    4.      WHEN 1 THEN data_1
    5.      WHEN 2 THEN data_2
    6.    ELSE 'value' END,
    7.  
    8.    'number' = CASE 'order_id'
    9.      WHEN 1 THEN data_1
    10.      WHEN 2 THEN data_2
    11.    ELSE 'number' END
    12.   WHERE order_id in (1,2)
    Прошу подсказать:

    1) Можно ли сюда добавить второе проверочное условие AND user_id = $id (где $id=$_SESSION('user_id')) ? (В примерах в сети таких двойных условий не встречал).

    2) При использовании подготовленных выражений синтаксис обычный для таких случав? (Массив переменных на вход $stmt->execute($arr)).
     
    #1 118_64, 8 сен 2017
    Последнее редактирование: 8 сен 2017
  2. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Иными словами ты по ajax получаешь данные и напрямую пишешь в базу и логику хочешь в запросе навернуть ?
    Может в пышке грузануть сущность, чекануть там всё что надо, а потом проапдейтить если че ?
     
  3. 118_64

    118_64 Активный пользователь

    С нами с:
    8 янв 2015
    Сообщения:
    84
    Симпатии:
    2
    Да, так и есть. Думал над тем, чтобы перед записью в базу эти же строки предварительно загрузить и проверить соответствие user_id и order_id. Но это лишний запрос, к тому же не самый быстрый, насколько я понимаю (SELECT ... IN).

    Получается, что "дешевле" все это сделать одним запросом UPDATE.
     
  4. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Если order_id ключ и значений под выборку не овердохрена, то изи, реал толк, синк эбаут ит мен.
     
  5. 118_64

    118_64 Активный пользователь

    С нами с:
    8 янв 2015
    Сообщения:
    84
    Симпатии:
    2
    несколько сотен на высоконагруженной БД.

    Главный вопрос: зачем, если можно сделать одним запросом? Вы не в курсе, в этот UPDATE можно второе условие включить?