我有2个sql查询要执行,但我希望它执行全部或如果一个查询中的错误然后不执行任何。我正在使用php。我曾经在.NET中使用try和catch,但我是php的新手。
以下是我试图做的代码:
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());}
答案 0 :(得分:2)
您可能面临的try...catch
问题是PHP有两种不同的错误处理机制:error reporting和exceptions。除非底层代码抛出异常,否则您无法捕获异常,而旧的mysql_query()
将触发警告而不是抛出异常。有几种解决方法但是,如果您对编写好的面向对象代码感兴趣,我建议您切换到PDO。
在任何情况下,如果你想坚持使用旧的MySQL库,你的代码基本上应该可以工作:
$res=mysql_query($sql) or die(mysql_error());
解释:
mysql_query()
会返回FALSE
or
表达式的右侧仅在左侧为FALSE
时才会执行die()
中止脚本,从而阻止执行下一个查询但是,我认为你不想在不知名的地方中止。如果我们添加一些缺失的位(例如正确的SQL生成和代码缩进),我们得到这个:
function Registration($UserFirstname,$UserLastname){
$sql = sprintf("INSERT INTO table1 (fieldname1,fieldname2) VALUES ('%s','%s')";
mysql_real_escape_string($UserFirstname),
mysql_real_escape_string($UserLastname)
);
$res = mysql_query($sql);
if( !$res ){
return FALSE;
}
$sql = sprintf("INSERT INTO table2 (fieldname1,fieldname2) VALUES ('%s','%s')";
mysql_real_escape_string($UserFirstname),
mysql_real_escape_string($UserLastname)
);
$res = mysql_query($sql);
if( !$res ){
return FALSE;
}
return TRUE;
}
请注意,如果第二次查询失败,您仍需要使用交易。交易并不是特别难以使用,唯一的要求是:
START TRANSACTION
查询
COMMIT
查询答案 1 :(得分:1)
您需要使用交易。这些允许您将一组查询包装在一个块中,该块显示“所有这些查询都成功执行或者没有执行任何查询”。这意味着无论事务块中发生什么,您都可以确保维护数据库的完整性。
注意:事务不适用于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);
答案 2 :(得分:0)
您可以尝试使用mysqli_multi_query
或者您可以将数据库架构更改为InnoDB ..
答案 3 :(得分:0)
要将两个查询作为一个执行,你必须使用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();
?>