Php 执行多个MySQL查询
我有两个sql查询要执行,但我希望它全部执行,或者如果一个查询中出现错误,则不执行任何查询。我正在使用php。我以前在.NET中使用try-and-catch,但我对php是新手 下面是我尝试执行的代码:Php 执行多个MySQL查询,php,mysql,sql,Php,Mysql,Sql,我有两个sql查询要执行,但我希望它全部执行,或者如果一个查询中出现错误,则不执行任何查询。我正在使用php。我以前在.NET中使用try-and-catch,但我对php是新手 下面是我尝试执行的代码: function Registration($UserFirstname,$UserLastname){ $sql="INSERT INTO table1 (fieldname1,fieldname2) VALUES ('$UserFirstname','$UserLastname')"; $
function Registration($UserFirstname,$UserLastname){
$sql="INSERT INTO table1 (fieldname1,fieldname2) VALUES ('$UserFirstname','$UserLastname')";
$res=mysql_query($sql) or die(mysql_error());
$sql="INSERT INTO table2 (fieldname1,fieldname2) VALUES ('$UserFirstname','$UserLastname')";
$res=mysql_query($sql) or die(mysql_error());}
您需要使用事务。这些允许您将一组查询包装在一个块中,该块表示“要么所有这些查询都成功执行,要么没有一个成功执行”。这意味着无论事务块中发生什么,都可以确保数据库的完整性得到维护 注意:事务不适用于MyISAM表,您必须使用InnoDB表
mysql_query ('BEGIN TRANSACTION;', $db);
mysql_query ("INSERT INTO sometable (some, columns) VALUES ($some, $values)", $db);
if ($errMsg = mysql_error ($db))
{
mysql_query ('ROLLBACK;', $db);
die ($errMsg);
}
mysql_query ("INSERT INTO someothertable (some, other, columns) VALUES ($some, $other, $values)", $db);
if ($errMsg = mysql_error ($db))
{
mysql_query ('ROLLBACK;', $db);
die ($errMsg);
}
mysql_query ('COMMIT', $db);
您可以尝试使用或者您可以将数据库模式更改为InnoDB 您可能面临的问题是,PHP有两种不同的错误处理机制:和。除非底层代码抛出异常,否则无法捕获异常,而良好的旧
mysql\u query()
将触发警告,而不是抛出异常。有几种变通方法,但是,如果您对编写好的面向对象代码感兴趣,我建议您切换到
在任何情况下,如果您想坚持使用好的旧MySQL库,您的代码基本上应该可以工作:
$res=mysql_query($sql) or die(mysql_error());
解释如下:
如果查询失败,则返回mysql\u query()
(例如,您得到了一个重复的密钥)FALSE
表达式的右侧仅在左侧为或
FALSE
中止脚本,从而阻止执行下一个查询die()
START TRANSACTION
查询COMMIT
查询要将两个查询作为一个查询执行,必须使用mysql扩展,下面的代码运行良好
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";
/* execute multi query */
if ($mysqli->multi_query($query)) {
do {
/* store first result set */
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
printf("%s\n", $row[0]);
}
$result->free();
}
/* print divider */
if ($mysqli->more_results()) {
printf("-----------------\n");
}
} while ($mysqli->next_result());
}
/* close connection */
$mysqli->close();
?>
数据库事务是您的朋友:)。链接上被接受的答案使用了try
和catch
。你好,我遇到了这种方法,但我的代码中没有使用面向对象编程。谢谢你的评论:你也可以在命令式编程中使用数据库事务。只要启动事务(“启动事务;”)并在完成后提交(“提交”)。嗨,GordonM,这就是我要找的。如果你不介意我问的话,MyISAM/InnoDB表是什么。MyISAM和InnoDB是MySQL表的后面。我想我会使用它,因为它对我来说比较简单,我不使用事务,谢谢@Alvaro G。Vicario@Prasaanth-请注意,如果第二次查询有可能失败,您仍然需要使用事务。交易并不特别难以使用。severy.PDO(如果可用)总是值得使用的,因为准备好的语句可以防止注入,同时避免mysql_real_escape_字符串污染代码。此代码仍然存在与最初发布的代码相同的问题-如果第一次查询成功,但第二次查询失败,它可能会使数据库处于不一致的状态。您必须手动删除由第一条语句创建的新插入的行,或者将整个内容打包到事务中。@GordonM-这是一条非常重要的信息,不能隐藏在注释中。我已经更新了答案。
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";
/* execute multi query */
if ($mysqli->multi_query($query)) {
do {
/* store first result set */
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
printf("%s\n", $row[0]);
}
$result->free();
}
/* print divider */
if ($mysqli->more_results()) {
printf("-----------------\n");
}
} while ($mysqli->next_result());
}
/* close connection */
$mysqli->close();
?>