什么是正确的验证,以检查输入的存在与否在数据库

问题描述:

比如我的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_userhello-world 数据库中已存在使用 } else {

让我知道..

+0

你在哪里有'content_user'?它是在另一个表或在一个PHP变量? – jswolf19 2011-03-23 13:04:27

+0

@ jswolf19这是一个当前的用户ID。假设'$ _SESSION ['user_id']' – wow 2011-03-23 13:10:37

+0

对于#2,你的意思是在这种情况下插入一个新行吗?假设用户2有一个slu''hello-world',你希望桌子看到最后? – jswolf19 2011-03-23 13:25:08

我认为这将是这样的:

$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不等于你好,世界

+0

嗯...好吧让我们说'content_user = 3'使用相同的slug'hello-world'? – wow 2011-03-23 13:46:58

+0

@哇 - 那么它会更新,因为(根据您发布的表内容)content_user 3正在测试,而不是你好 - 世界。假设存储在$ input中的内容不是动态的 – Christophe 2011-03-23 13:58:15

+0

做'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,为什么它应该是唯一的?那是你自己的问题。

+0

其实我使用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")); 
+0

我的错..问题更新:) – wow 2011-03-23 14:39:03