Я искал способ вставить данные в две таблицы базы данных в одном запросе таким образом, что если один из них не удался, то не был сохранен (я не хочу потерять данные). Я столкнулся с вопросом о переполнении стека, который показал мне, как использовать BEGIN … COMMIT для этого, но он просто не работает.
Вот запрос, который я создал:
$query = "BEGIN; INSERT INTO content_subpages (title, url_referer) VALUES ('$pagetitle','$url_referer'); INSERT INTO ccm_main_menu (sub_item, sub_item_link,sub_item_sort_order) VALUES ('$pagetitle','$url_referer','$newsort'); COMMIT;"; mysql_query($query) or die (mysql_error());
Я получаю следующую ошибку: у You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO content_subpages (title, url_referer) VALUES ('TESTING','testing'); ' at line 2
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO content_subpages (title, url_referer) VALUES ('TESTING','testing'); ' at line 2
Это мой первый раз, используя BEGIN … COMMIT, поэтому разумно, что я мог бы сделать что-то неправильно, но я следовал синтаксису примера SQL Fiddle, заданного выбранным ответом на вопрос о переполнении стека, который я упомянул (http: // stackoverflow.com/questions/12649706/mysql-insert-into-multiple-tables-in-same-query-with-begincommit), но он все равно не сработает.
Если я могу легко достичь множественного результата INSERT «все или ничего» без BEGIN … COMMIT, это было бы приемлемым решением.
заранее спасибо
Попробуйте разбить строки на несколько операторов php:
$query = "BEGIN"; mysql_query($query) or die (mysql_error()); $query = "INSERT INTO content_subpages (title, url_referer) VALUES ('$pagetitle','$url_referer')"; mysql_query($query) or die (mysql_error()); $query = "INSERT INTO ccm_main_menu (sub_item, sub_item_link,sub_item_sort_order) VALUES ('$pagetitle','$url_referer','$newsort')"; mysql_query($query) or die (mysql_error()) $query = "COMMIT"; mysql_query($query) or die (mysql_error());
вам нужно использовать multi_query
.
Убедитесь, что вы используете таблицу InnoDB, а не таблицу MyISAM, так как MyISAM не является транзакционным.
Чтобы использовать таблицу InnoDB, при ее создании, после закрывающего пара, добавьте ENGINE=InnoDB
. По умолчанию используется MyISAM.
Пытаться:
$dbh->beginTransaction(); $query = "INSERT INTO content_subpages (title, url_referer) VALUES ('$pagetitle','$url_referer'); INSERT INTO ccm_main_menu (sub_item, sub_item_link,sub_item_sort_order) VALUES ('$pagetitle','$url_referer','$newsort')"; $dbh->exec($query); $dbh->commit();
Кстати, Симон Жермен получил хорошую оценку, Transaction будет работать со столами с использованием двигателя InnoDB.