我正在使用多个文档进行挑战,尤其是处理数据库中的重复文件名。我正在尝试创建一个管理员可以添加HTML文档的系统。他将输入两个字段:文档名称及其源代码。
添加文档时,名称(例如“A页”)和文件名(基于名称,例如“a_page.html”)将被插入到数据库中,并且将创建包含内部源代码的文件服务器。
现在的问题是如果我尝试添加具有相同名称的其他文档会发生什么,例如“页面”。我希望文件名是“a_page_2.html”,不要覆盖现有文件名。如果另一个具有相同的名称,“a_page_3.html”等等。
是否有一个简单的SQL语句来实现?
答案 0 :(得分:1)
不,没有简单的陈述。可能已经有a_page_2.html了。
因此,只需使您的文档名称具有唯一性:
选择文档名称时,您可以
SELECT concat(name,'_',id) as name ...
它类似于Stackoverflow创建问题网址的方式:
/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
你也可以完全摆脱传统的名字,只留下ids:
http://stackoverflow.com/questions/14919687/
仍有效
答案 1 :(得分:-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
}
}