PHP/MySQL-”的;“开始……提交”;不起作用

PHP/MySQL-”的;“开始……提交”;不起作用,php,mysql,transactions,insert,Php,Mysql,Transactions,Insert,我在寻找一种方法,在一个查询中将数据插入到两个数据库表中,如果一个查询失败,两个数据库表都不会保存(我不想要孤立的数据)。我遇到了一个堆栈溢出问题,它向我展示了如何使用BEGIN…COMMIT来实现这一点,但它根本不起作用 以下是我设置的查询: $query = "BEGIN; INSERT INTO content_subpages (title, url_referer) VALUES ('$pagetitle','$url_referer');

我在寻找一种方法,在一个查询中将数据插入到两个数据库表中,如果一个查询失败,两个数据库表都不会保存(我不想要孤立的数据)。我遇到了一个堆栈溢出问题,它向我展示了如何使用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());
我得到以下错误:
您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解在“插入内容”子页面(标题、url\U引用)值(“测试”、“测试”)附近使用的正确语法在第2行

这是我第一次使用BEGIN…COMMIT,所以我可能做错了什么是合理的,但是我遵循了我提到的堆栈溢出问题的选择答案所给出的SQLFiddle示例的语法(http://stackoverflow.com/questions/12649706/mysql-insert-into-multiple-tables-in-same-query-with-begincommit),但还是不行

如果我不需要开始…提交就可以轻松实现“全部或无”多重插入结果,那将是一个可接受的解决方案


提前感谢

您需要使用
多用户查询


尝试将这些行拆分为多个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());

确保您使用的是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();

BTW,Simon Germain得到了一个很好的观点,事务将使用NYNDB引擎进行工作。

mySqLQueQuy()发送一个唯一的查询(不支持多个查询)。此外,如DOCS建议的,请考虑使用一个新的库,如MyQuLi或PDO,而不是旧的MySQL扩展。您应该使用mysqli_*或PDO包装器classI-know mysql_query()不支持多个查询,但是。。。。哦,等等!出于某种原因,我一直在想,开始/提交的事情会让它起作用。正如在几个答案中所建议的,我需要将每个查询分离为它自己的mysql\u query()。对我来说,这是一个多么简单而又重要的疏忽啊。谢谢。此外,我一直听说我需要使用MySQLi或PDO,但在这种情况下,我正在处理一个很大的现有项目,该项目始终使用mysql,并且几乎“完成”,所以我不确定是否值得回去改变一切。“这是与工作有关的,所以我必须让我的老板来运行它,看看他是否希望我这样做。”vertigoelectric马上说。它的使用对于新的开发是非常不鼓励的,但是如果它是现有项目的一部分,这是完全可以理解的。如果您要升级到不再有MySQL扩展的PHP的未来版本,则只绝对需要更新MySQL扩展的使用情况。但是,在将查询拆分为多个mysql_query()语句之后,我仍然遇到问题。我没有收到错误,但由于第二次插入查询中的输入错误,它插入了第一条记录,但没有插入另一条记录,这是我试图避免的。关于我的问题,有很多很好的答案和建议,但我选择了这个答案,因为这种格式是我正式使用的第一种格式。这正是我所需要的。非常感谢。显然,我脑子里出了个屁,但不知怎么的,我没有意识到我的$query字符串仍然是一个查询中的多个语句,尽管我已经知道mysql_query()不支持这一点。再次感谢!