0

SQL Server から MySQL にテーブルを取り込むために、PHP でインポート スクリプトを作成しています。すべての char/varchar 値を単一引用符で囲んで挿入しています。これは、スクリプトが単一引用符を含む値に遭遇するまで正常に機能します。明らかな解決策は を使用することaddslashes()ですが、それは私にとってはうまくいきません。htmlspecialchars()私も同様に試しましmysqli_real_escape_stringたが、どちらもうまくいきませんでした。問題のあるキャラクターを完全に削除しようとしましたがstr_replace("'", "", $value)、成功しませんでした。最後に、値を一重引用符ではなく二重引用符で囲んでみましたが、値の二重引用符をエスケープできない行に遭遇すると、同じエラーが発生しました。

エラーが発生するまで、スクリプトはそれぞれ 1,000 行の複数のチャンクを正常に挿入するので、INSERT ステートメントの形式が間違っていないことがわかります。クエリ全体をログに記録し、一重引用符がエスケープされていないことを確認しましたが、問題のある行と必要に応じてバックスラッシュを含めて INSERT を手動で実行できます。

私はここで困惑しています。見逃したトラブルシューティングのヒントはありますか?

重複した質問や類似の質問がないか確認しましたが、自分の状況に当てはまるもので、まだ試していないものは見つかりません。これに対する以前の回答を見落としていた場合は、お知らせください。

コードは次のとおりです。

// Chunk size
$Insert_Max = 1000;
// Array to hold all rows for the insert
$Insert_Rows = [];  

while($row = mssql_fetch_row($result)) {
    $Insert_Vals = [];

    // Instead of building up a tedious string for each insert, let's do it programmatically
    $offset = 0;

    while ($offset < mssql_num_fields($result)) {
        $field_type = mssql_field_type($result, $offset);   

        if (empty($row[$offset])) {
            $Insert_Vals[] = "NULL";
        } else {
            if ($field_type == "int" || $field_type == "bit") {
                $Insert_Vals[] = $row[$offset];
            } else if (strpos($field_type, "char") !== false) { // Covers char, varchar, nvarchar
                $Insert_Vals[] = "'" . addslashes($row[$offset]) . "'";
            } else {
                $Insert_Vals[] = "'" . $row[$offset] . "'";
            }               
        }

        $offset++;
    }

    $Insert_String = "(" . implode(",", $Insert_Vals) . ")";

    $Insert_Rows[] = $Insert_String;

    $count++;
    if ($count >= $Insert_Max) {
        // $Insert_Header =  "INSERT INTO tablename (col1, etc.) VALUES "
        $internal_connection_object->Perform_The_Insert($Insert_Header, $Insert_Rows);
        $count = 0;
    }
}
4

1 に答える 1