Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 执行多个MySQL查询_Php_Mysql_Sql - Fatal编程技术网

Php 执行多个MySQL查询

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')"; $

我有两个sql查询要执行,但我希望它全部执行,或者如果一个查询中出现错误,则不执行任何查询。我正在使用php。我以前在.NET中使用try-and-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());}

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

注意:事务不适用于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()
    中止脚本,从而阻止执行下一个查询
但是,我假设你不想在无处的地方堕胎。如果我们添加一些缺失的位(例如正确的SQL生成和代码缩进),我们会得到以下结果:

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

  • 将涉及的表定义为InnoDB
  • 在函数顶部运行
    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();
    ?>