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')

3番目のクエリを除いてすべてが実行されます。それは私が迷子になっているところです。3番目のクエリの挿入でSQLエラーが発生した場合、どうすれば取得できますか?そして、失敗した3番目のクエリの後のクエリはどのように実行されますか?

4

3 に答える 3

2

例は、エラーの処理方法を実際には示していません。

最初の失敗の後、実行は停止します。

mysqli_error()エラー情報を取得するために使用します。

mysqli_use_result()エラーが発生した場合は false を返します。結果を数えて十分でない場合は、エラーが発生しました。

于 2010-12-26T19:27:08.350 に答える
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 に答える