6
function cpanel_populate_database($dbname) 
{ 
     // populate database
     $sql = file_get_contents(dirname(__FILE__) . '/PHP-Point-Of-Sale/database/database.sql');
     $mysqli->multi_query($sql);

     $mysqli->close();
 }

SQL ファイルは phpMyAdmin から直接エクスポートされたもので、約 95% の時間は問題なく実行され、すべてのテーブルが作成され、データが挿入されます。(データベースをゼロから作成しています)

残りの 5% は最初のテーブルのみ、または場合によっては最初の 4 つのテーブルが作成されますが、他のテーブルは作成されません (30 個のテーブルがあります)。

multi_query はバグがあるように見えるので使用しないことに決め、セミコロンの後の各行で mysql_query だけを使用してバグが発生するかどうかを確認します。誰かがこのような問題に遭遇しましたか?

4

4 に答える 4

12

迅速かつ効果的

system('mysql -h #username# -u #username# -p #database# < #dump_file#');
于 2011-09-23T06:35:41.693 に答える
2

multi_queryテーブルを作成または変更できるクエリで使用すると、同様の問題が発生しました。特に、外部キーに関連していると思われる InnoDB 1005 エラーが発生する傾向があります。MySQL が次のステートメントに移る前に 1 つのステートメントを完全に終了しないように、外部キーには適切な指示対象がありません。

あるシステムでは、問題のあるステートメントを独自のファイルに分割しました。別の例では、セミコロンで分割して、各コマンドを個別に実行しました。

function load_sql_file($basename, $db) {
    // Todo: Trim comments from the end of a line
    log_upgrade("Attempting to run the `$basename` upgrade.");

    $filename = dirname(__FILE__)."/sql/$basename.sql";
    if (!file_exists($filename)) {
        log_upgrade("Upgrade file `$filename` does not exist.");
        return false;
    }

    $file_content = file($filename);
    $query = '';
    foreach ($file_content as $sql_line) {
        $tsl = trim($sql_line);
        if ($sql_line and (substr($tsl, 0, 2) != '--') and (substr($tsl, 0, 1) != '#')) {
            $query .= $sql_line;
            if (substr($tsl, -1) == ';') {
                set_time_limit(300);
                $sql = trim($query, "\0.. ;");
                $result = $db->execute($sql);
                if (!$result) {
                    log_upgrade("Failure in `$basename` upgrade:\n$sql");
                    if ($error = $db->lastError()) {
                        log_upgrade("$error");
                    }

                    return false;
                }

                $query = '';
            }
        }
    }

    $remainder = trim($query);
    if ($remainder) {
        log_upgrade("Trailing text in `$basename` upgrade:\n$remainder");
        if (DEBUG) trigger_error('Trailing text in upgrade script: '.$remainder, E_USER_WARNING);
        return false;
    }

    log_upgrade("`$basename` upgrade successful.");
    return true;
}
于 2011-09-23T18:34:52.527 に答える
0

マルチクエリに頼ったことはありません。そのようなものが必要になったとき、私はmysqliに移行しました。また、クエリの結果が必要ない場合は、スクリプトを mysql_query に渡すこともできます。また、外部キーなどの必要なテーブルと競合する不適切な順序でエクスポートがある場合にも、これらのエラーが発生します。

于 2011-09-19T13:34:04.057 に答える
0

SQL ファイルを単一のクエリに分割するアプローチは良い考えだと思います。比較目的であっても(問題が解決するかどうかを確認するため)。

また、あなたのファイルの大きさはわかりませんが、ファイルが信じられないほど大きく、バッチに分割することでうまくいくケースがいくつかありました。

于 2011-09-19T13:37:47.033 に答える