PHPFAQ  
Начинающим   Технологии   MySQL   PDO   Ошибки   Ссылки   Юмор   Форум   SafeMySQL  
-- Список сообщений -- Поиск --
Для чего нужна mysqli_multi_query
phpfaq 30.08.13 18:11
По мне, никакой разницы с отправкой запросов по отдельности нет. Ну разве только дампы запускать...
ответить
Алексей 30.08.13 18:43
Вариант

Я, к сожалению, не эксперт, поэтому могу здорово заблуждаться. Предложу один вариант из текущего проекта.
К примеру, нужно некое значение перенести из одной таблицы в другую.
Если делать двумя запросами, вроде
DELETE word FROM t1;
INSERT word INTO t2;
и выйдет проблема со вставкой в t2, то слово будет потеряно. Если через multi_query - то оба запроса или будут выполнены, или оба не будут. Или я не прав?
ответить
phpfaq 30.08.13 18:48
Неправ

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

Транзакции в классе, впрочем, на уровне АПИ тоже не реализованы, но вполне можно их выполнять в качестве обычных SQL запросов - start transaction и пр.

А мультиквери, как раз в этом случае совсем не поможет. Технически это те же самые запросы как будто их послали раздельно.
ответить
Алексей 05.09.13 13:58
И правда...

Мда, нужно подучить матчасть :)
В таком случае, вопрос, как это сделать правильно через транзакциии?

$db->query(" START TRANSACTION ");
$db->query(" INSERT INTO `test` (`id`, `name`, `val`) VALUES (NULL, 'gregr', '234') ");
$db->query(" INSERT INTO `test` (`id`, `name`, `val2`) VALUES (NULL, '234', 123) ");
$db->query(" COMMIT ");

Второй инсерт заведомо приводит к ошибке, и, насколько я это понял, должен бы полностью отменить вставку, но тем не менее первый инсерт реально вписывает данные. Ошибку я отлавливаю, но толку от неё уже немного :(
И, если не затруднит, посоветуйте нормальный мануал на эту тему.
ответить
phpfaq 05.09.13 14:27
Делаем так:

при коннекте к базе выставляем
"emode" => "exception"

а дальше

try {

$db->query(" START TRANSACTION ");
$db->query(" INSERT INTO `test` (`id`, `name`, `val`) VALUES (NULL, 'gregr', '234') ");
$db->query(" INSERT INTO `test` (`id`, `name`, `val2`) VALUES (NULL, '234', 123) ");
$db->query(" COMMIT ");

} catch Exception($e){

$db->query(" ROLLBACK ");

}

Особо статей не знаю, но там ничего сложного. Вот в доке немного есть
http://php.net/manual/ru/pdo.transactions.php
там, правда, про ПДО, но принцип тот же.
ответить
Написать
Имя:*
Заголовок:*
Вы робот?
Текст:
Пожалуйста, воздержитесь от посылки спама.
Сообщения, содержащие гиперссылки, проходят премодерацию.

© phpfaq.ru, 2017 1493324885.003 sec. О сайте   Хостинг iHor.ru