2

複数のドキュメントの操作、特にデータベース内の重複したファイル名の処理に苦労しています。管理者が HTML ドキュメントを追加できるシステムを作成しようとしています。ドキュメントの名前とそのソース コードの 2 つのフィールドに入力します。

ドキュメントを追加すると、名前 (「A Page」など) とファイル名 (「a_page.html」などの名前に基づく) がデータベースに挿入され、ソース コードを含むファイルがサーバー上に作成されます。

問題は、「A Page」などの同じ名前の別のドキュメントを追加しようとするとどうなるかということです。既存のファイルを上書きしないように、ファイル名を「a_page_2.html」にしたいと思います。同じ名前の別の場合は、「a_page_3.html」などです。

達成するための簡単な SQL ステートメントはありますか?

4

2 に答える 2

1

いいえ、簡単なステートメントはありません。a_page_2.html が既に存在する可能性があります。

したがって、ドキュメント名をすでに一意にするだけです。

  • データベースに新しいレコードを挿入する
  • 一意の ID を取得する
  • 与えられた名前とIDを組み合わせて、このIDを使用してファイルを作成します

ドキュメント名を選択するときは、次のことができます

SELECT concat(name,'_',id) as name ...

これは、Stackoverflow が質問の URL を作成する方法に似ています。

/questions/14919687/on-insert-how-can-i-change-the-duplicate-name-to-something-else-in-the-database/
            ^ id    ^ conventional name that can have 1000s duplicates

ID のみを残して、従来の名前をまったく削除することもできます
http://stackoverflow.com/questions/14919687/

于 2013-02-17T09:38:39.813 に答える
-1
  • ファイル名欄を作るUNIQUE
  • 挿入を試み、重複キーエラーが発生した場合は、成功するまで番号を追加して繰り返します

PDO を使用すると、次のようになります。

class QueryException extends RuntimeException { }
class DuplicateKeyException extends QueryException { }

function executeInsert(PDOStatement $stmt) {
    try {
        $stmt->execute();
    } catch (PDOException $e) {
        switch ($e->errorInfo[1]) {
            case 1062:
                throw new DuplicateKeyException($e->getMessage(), null, $e);
            default:
                throw new QueryException($e->getMessage(), null, $e);
        }
    }
}

$filename = 'a_page';
$contents = '<title>test</title>';

$stmt = $pdo->prepare('INSERT INTO documents (filename,contents) VALUES (:filename,:contents)');
$repeat = true; $counter = 0;
while ($repeat)
    try {
        $stmt->bindValue(
            ':filename',
            $filename . ($counter > 0 ? ("-$counter" : '') . '.html'
        );
        $stmt->bindValue(':contents', $contents);
        executeInsert($stmt);
        $repeat = false;
    } catch (DuplicateKeyException $e) {
        $repeat = true;
        $counter++;
    } catch (QueryException $e) {
        $repeat = false;
        // error handling here
    }
}
于 2013-02-17T10:40:30.297 に答える