0

谁能告诉我如何使用 mysqli->multi_query() 在单个连接上执行多个更新/插入查询?谢谢。

我确实遵循了 PHP 手册中的教程。但我有一些问题。

我的一批查询有 5 个用分号分隔的语句。

UPDATE scenes set UserID = '11111111' WHERE ID = '031DFDAD92F6F4AB64AF317C06D64089DF119EC2';

INSERT INTO surfaces (ID, Name, SceneID, SurfaceTypeID, Color) VALUES('5F9A7301C2D398C4D1B90BA5AA56A9DED3FAA639', 'front ', '031DFDAD92F6F4AB64AF317C06D64089DF119EC2', 1, 11432044);

INSERT INTO regions (ID, SurfaceID, x, y, width, height, RegionMovieClip) VALUES('864406A2CB30CFBE846ED7B0B08A79BD5605037D', '5F9A7301C2D398C4D1B90BA5AA56A9DED3FAA639', 375, 22, 104, 125, 'asdasdcvxcv');

INSERT INTO surfaces (ID, Name, SceneID, SurfaceTypeID, Color) VALUES('1FCA2131ED1B89206E4E66DBE20D8D09513FF39D', 'floor ', '031DFDAD92F6F4AB64AF317C06D64089DF119EC2', 1, 7318465);

INSERT INTO regions (ID, SurfaceID, x, y, width, height, RegionMovieClip) VALUES('DBD0E85EAEE2685E2AEC590C8CA214C3C5653971', '1FCA2131ED1B89206E4E66DBE20D8D09513FF39D', 272, 288, 114, 89, 'asdasd')

除了第三个查询之外,所有的都被执行。那就是我迷路的地方。如果插入第三个查询时出现 sql 错误,我该如何获取它?第三次失败后的查询是如何执行的?

4

3 回答 3

2

这些示例并没有真正展示如何处理错误。

执行将在第一次失败后停止。

用于mysqli_error()获取错误信息。

mysqli_use_result()如果发生错误,则返回 false - 如果计算结果但不够,则发生错误。

于 2010-12-26T19:27:08.350 回答
0

这是未经测试的,不会处理错误,但应该运行所有 5 个查询。

$fconn = new mysqli($fdbhost, $fdbuser, $fdbpass, $fdbname) or die  ('Error connecting to mysqli');
$query  = "UPDATE scenes set UserID = '11111111' WHERE ID = '031DFDAD92F6F4AB64AF317C06D64089DF119EC2';";
$query .= "INSERT INTO surfaces (ID, Name, SceneID, SurfaceTypeID, Color) VALUES('5F9A7301C2D398C4D1B90BA5AA56A9DED3FAA639', 'front ', '031DFDAD92F6F4AB64AF317C06D64089DF119EC2', 1, 11432044);";
$query .= "INSERT INTO surfaces (ID, Name, SceneID, SurfaceTypeID, Color) VALUES('1FCA2131ED1B89206E4E66DBE20D8D09513FF39D', 'floor ', '031DFDAD92F6F4AB64AF317C06D64089DF119EC2', 1, 7318465);";
$query .= "INSERT INTO surfaces (ID, Name, SceneID, SurfaceTypeID, Color) VALUES('1FCA2131ED1B89206E4E66DBE20D8D09513FF39D', 'floor ', '031DFDAD92F6F4AB64AF317C06D64089DF119EC2', 1, 7318465);";
$query .= "INSERT INTO regions (ID, SurfaceID, x, y, width, height, RegionMovieClip) VALUES('DBD0E85EAEE2685E2AEC590C8CA214C3C5653971', '1FCA2131ED1B89206E4E66DBE20D8D09513FF39D', 272, 288, 114, 89, 'asdasd')";
if ($fconn->multi_query($query)) {

         if ($result = $fconn->store_result()) {
            //while ($row = $result->fetch_row()) {
                //print_r($row);
            }
            //$result->free();
            }
         if ($fconn->more_results()) {

            while ($fconn->next_result()){ 
            $thisresult = $fconn->store_result();

            print_r($thisresult).'<br />';
            }
            }

}
unset($query);
$fconn->close();
于 2013-05-07T22:02:40.743 回答
0

这不是万无一失的,但我一直在与 MySQLi 进行斗争,它是一群参与 multi_query 的快乐人,我无法让它以我想要的方式很好地发挥作用,或者具有我需要的灵活性。我看到了几个例子,其中一些程序员只是简单地运行explode(';', $sql_statements),这让我的眼睛流血了,这可能是多么可怕的错误。

我的解决方案可能对您不起作用,但这对我有用。(不,它也不是防弹的,但可以为我的特定应用程序工作)。

<?php
    $file = file_get_contents('test_multiple_queries.sql');
    $result = preg_split("/;(?=\s*(create|insert|update|alter|show|explain|truncate|drop|delete|replace|start|lock|commit|rollback|set|begin|declare|rename|load|begin|describe|help))/im", $file);
    $result = array_map('trim', $result);

    foreach($result as $sql_query) {

        // Procedural style
        mysqli_query($link, $sql_query);

        // Now you can get errors easily, or affected_rows, or whatever
        //    using much simpler, readable code
        mysqli_error($link);
        mysqli_affected_rows($link);

        // or go crazy with some other stuff
        $words = preg_split("/\s+/", $sql_query);
        switch(strtolower($words[0])) {
            case 'insert':
                // do something nifty like...
                echo 'New ID: '.mysqli_insert_id($link)."\n";
                break;
            case 'drop':
                // obviously run this before the query, simply here for example
                echo 'Hey young (man|lady)! We don\'t drop anything!';
                break;
        }
    }
于 2015-10-06T20:37:00.467 回答