执行多个MySQL查询

时间:2011-11-11 06:51:50

标签: php mysql sql

我有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());}

4 个答案:

答案 0 :(得分:2)

您可能面临的try...catch问题是PHP有两种不同的错误处理机制:error reportingexceptions。除非底层代码抛出异常,否则您无法捕获异常,而旧的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;
}

关于交易

请注意,如果第二次查询失败,您仍需要使用交易。交易并不是特别难以使用,唯一的要求是:

  1. 将所涉及的表定义为InnoDB
  2. 在函数
  3. 之上运行START TRANSACTION查询
  4. 在函数末尾运行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();
?>