2010-04-12 201 views
1

用户写入一系列标签(分隔)并发布表单。
我构建了一个包含标签的数组,并使用array_unique() php函数删除模糊。在mySQL表中检查数组项存在的最快方法

我想这样做的:

  • 经过用foreach($ newarray为$项目)的阵列{...}
  • 检查在标签MySQL表
  • 存在每个$项目
  • 如果项目不存在,插入标签表

是否有一个更快更优化方式这样做?

回答

4

我希望人们可以评论这种方法。直觉告诉我它可能不是最好的办法,但你们都在想什么?

只需在数据库中添加一个唯一的约束,以便标记不能被插入两次,而不是对数据库进行额外调用以查找重复项。然后在添加新标签时使用INSERT IGNORE...。此方法将忽略由重复引起的错误,同时插入新项目。

+0

+1这正是我要做的。除非你特别需要用重复的逻辑来处理标签,否则我会'插入IGNORE'并忘记它。当INSERT IGNORE为你做什么时,为什么还要单独使用'SELECT'和循环来删除'INSERT'中的重复数据呢? – zombat 2010-04-12 21:53:03

+0

我会认为这会很好,特别是因为它会使重复查找'SELECT'变得多余。但是,可能有必要对这两种方法进行基准测试。 – awgy 2010-04-12 22:05:02

+0

@thetaiko。我的标签表有: - id:primary,autoinc - title:varchar(50) 应该如何添加重复的约束? – Enrique 2010-04-12 22:14:56

2

您可以拨打implode(',' $array),然后使用IN SQL构造来检查数据库中是否存在现有的行。

例子:

<?php 
    $arr = ... 
    $sql = 'SELECT COUNT(*) FROM table WHERE field IN (' . implode(',', $arr) . ');'; 
    $result = $db->query($sql); 
?> 
+0

我想你的意思是说'implode(',',$ array)'。你可以使用'explode()'将一个字符串转换成一个数组。 – awgy 2010-04-12 21:43:54

+0

您还定义了'$ arr',然后使用'$ array'。 – 2010-04-12 21:49:08

+0

@awgy,@Jack谢谢 – 2010-04-12 21:56:22

1
$tags = array('foo', 'bar'); 

// Escape each tag string 
$tags = array_map('mysql_real_escape_string', $tags, array($sqlCon)); 

$tagList = '"' . implode('", "', $tags) . '"'; 

$qs = 'SELECT id FROM tag_list WHERE tag_name IN (' . $tagList . ')'; 
+1

如果你对SQL注入非常谨慎,那么你不应该忘记它们周围的引号。 – Gumbo 2010-04-12 22:12:59

+0

如此真实 - 这正是我得到的回应。 :) – awgy 2010-04-15 03:42:09

0

我不知道,如果它的速度更快,但你可以使用mysql's IN。我想你必须尝试。

0

你可以建立一个大的查询,并做到在一杆,而不是许多小疑问:

SELECT DISTINCT tag 
    FROM my_tags 
WHERE tag in (INPUT_TAGS) 

刚刚建立INPUT_TAGS作为一个逗号分隔的列表,并确保你正确逃生的每个元素防止SQL注入攻击。

相关问题