繁体   English   中英

执行多个MySQL查询

[英]Execute multiple MySQL queries

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

try...catch可能面临的问题是PHP具有两种不同的错误处理机制: 错误报告异常 除非底层代码抛出异常,否则您无法捕获异常,并且老式的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. 在函数顶部运行START TRANSACTION查询
  3. 在函数末尾运行COMMIT查询

您需要使用交易记录。 这些允许您将一组查询包装在一个块中,该块显示“要么所有这些查询成功执行,要么都不执行”。 这意味着无论事务块中发生什么,您都可以确保数据库的完整性得到了维护。

注意:事务不适用于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);

要将两个查询作为一个执行,你必须使用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();
?>

您可以尝试使用mysqli_multi_query
或者,您可以将数据库架构更改为InnoDB。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM