什么是正确的验证,以检查输入的存在与否在数据库
比如我的MySQL表什么是正确的验证,以检查输入的存在与否在数据库
content_id content_user content_title content_slug
---------------------------------------------------------------------
1 1 Hello World hello-world
2 1 Hello Stackoverflow hello-stackoverflow
3 2 Fix me fix-me
4 3 Testing testing
更新
content_slug
是一个独特的密钥。
$input = 'Hello World';
$slug = function_slug($input); // this will be hello-world
/* begin the validation */
$query = $db->query("SELECT *
FROM tbl_content
WHERE content_slug='{$slug}'
");
$data = $db->fetch($query);
$check = $db->num_rows($query);
if($check == 1) {
$seo = $slug;
} else {
$seo = $slug.'-'.time();
}
/* end the validation */
$db->query("UPDATE tbl_content
SET content_slug= '{$db->escape($seo)}'
WHERE content_id ='{$db->escape($id)}'
AND content_user ='{$db->escape($_SESSION['user_id'])}'
");
有点长:)在这里,我想知道,什么是正确的验证,如果我想
- 如果
hello-world
=
当前content_user
使用第一if
- 如果
hello-world
我应该使用<>
当前content_user
和hello-world
数据库中已存在使用} else {
让我知道..
我认为这将是这样的:
$input = 'Hello World';
$slug1 = function_slug($input); // this will be hello-world
$query = $db->query("SELECT *
FROM tbl_content
WHERE content_slug='{$slug1}'
");
$data = $db->fetch($query);
$check = $db->num_rows($query);
if($check == 1)
$slug2 = $slug1.'-'.time();
$db->query("UPDATE tbl_content
SET content_slug= '{$db->escape($slug2)}'
WHERE content_id ='{$db->escape($id)}'
AND content_user ='{$db->escape($_SESSION['user_id'])}'
AND content_slug <> '{$db->escape($slug1)}'
");
<>表示不等于,=应该做的一样好 的额外的地方只会更新,如果content_slug不等于你好,世界
嗯...好吧让我们说'content_user = 3'使用相同的slug'hello-world'? – wow 2011-03-23 13:46:58
@哇 - 那么它会更新,因为(根据您发布的表内容)content_user 3正在测试,而不是你好 - 世界。假设存储在$ input中的内容不是动态的 – Christophe 2011-03-23 13:58:15
做'SELECT *'只是为了计算行数有点贵。我认为使用SELECT COUNT(id)什么的更好。 – 2011-03-23 14:21:29
UPDATE <table> SET <field> = <new value> **WHERE** <current User> != <hello world>
我想y我们的数据库逻辑是有缺陷的。但要回答你的确切问题:只需追加一个UUID,无论它是什么,都将是唯一的。但什么是content_slug,为什么它应该是唯一的?那是你自己的问题。
其实我使用URL'domain.com/hello-world /'的slu so,所以我需要保持它的独特性。 – wow 2011-03-23 14:03:39
我真的不认为你想要你要的东西,但这是你在一次更新查询中所要求的。
UPDATE tbl_content
SET content_slug= IF(content_user = '{$db->escape($_SESSION['user_id'])}',
content_slug,
CONCAT(content_slug, '-', DATE_FORMAT(now(), '%Y%m%d%H%i%s%f')))
WHERE content_id ='{$db->escape($id)}'
加成
我想象的要插入您的表中的新行针对不同的用户,在这种情况下,您将需要一个INSERT语句。如果你想插入新行无论做什么,那么这应该为你工作:
$slug = "'$db->escape($slug)'";
$db->query("INSERT INTO tbl_content (content_user, content_title, content_slug)
SELECT '{$db->escape($_SESSION['user_id'])}', '{$db->escape($title)}',
IF(EXISTS(SELECT content_id FROM tbl_content WHERE content_slug = $slug),
CONCAT($slug, DATE_FORMAT(now(), '-%Y%m%d%H%i%s%f')), $slug)");
但是,如果出于某种原因,你只需要插入新行,如果你没有同样的content_user
做像以前一样,那么你可以在这里用丑:
$slug = "'{$db->escape($slug)}'";
$user = "'{$db->escape($_SESSION['user_id'])}'";
$db->query("INSERT INTO tbl_content (content_user, content_title, content_slug)
SELECT $user, '{$db->escape($title)}',
IF(EXISTS(SELECT content_id FROM tbl_content WHERE content_slug = $slug),
CONCAT($slug, DATE_FORMAT(now(), '-%Y%m%d%H%i%s%f')), $slug)
FROM tbl_content
WHERE NOT EXISTS(SELECT content_id FROM tbl_content
WHERE content_slug = $slug AND content_user = $user)
LIMIT 1"));
我的错..问题更新:) – wow 2011-03-23 14:39:03
你在哪里有'content_user'?它是在另一个表或在一个PHP变量? – jswolf19 2011-03-23 13:04:27
@ jswolf19这是一个当前的用户ID。假设'$ _SESSION ['user_id']' – wow 2011-03-23 13:10:37
对于#2,你的意思是在这种情况下插入一个新行吗?假设用户2有一个slu''hello-world',你希望桌子看到最后? – jswolf19 2011-03-23 13:25:08