Самый быстрый способ проверить наличие элементов массива в таблице MySQL - PullRequest
1 голос
/ 13 апреля 2010

Пользователь записывает серию тегов (разделенных) и публикует форму.
Я создаю массив, содержащий теги, и удаляю дубликаты с помощью функции array_unique () php.

Я думаю о том, чтобы сделать:

  • просмотреть массив с помощью foreach ($ newarray как $ item) {...}
  • проверка каждого $ элемента на наличие в таблице тегов mySQL
  • если элемент не существует, вставить в таблицу тегов

Есть ли БЫСТРЫЙ или БОЛЬШЕ ОПТИМАЛЬНЫХ способов сделать это?

Ответы [ 5 ]

4 голосов
/ 13 апреля 2010

Я надеюсь, что люди могут прокомментировать этот метод. Интуиция говорит мне, что это, вероятно, не лучший способ идти о вещах, но что вы все думаете?

Вместо того, чтобы делать дополнительный вызов в БД для поиска дубликатов, просто добавьте уникальное ограничение в БД, чтобы теги нельзя было вставить дважды. Затем используйте INSERT IGNORE... при добавлении новых тегов. Этот метод будет игнорировать ошибки, вызванные дублированием, и в то же время вставлять новые элементы.

2 голосов
/ 13 апреля 2010

Вы можете вызвать implode( ',' $array ), а затем использовать SQL-конструкцию IN, чтобы проверить, существуют ли строки в БД.

Пример:

<?php
   $arr = ...
   $sql = 'SELECT COUNT(*) FROM table WHERE field IN ( ' . implode( ',', $arr ) . ' );';
   $result = $db->query( $sql );
?>
1 голос
/ 13 апреля 2010
$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 . ')';
0 голосов
/ 13 апреля 2010

Вы можете создать большой запрос и выполнить его за один раз вместо множества маленьких запросов:

SELECT DISTINCT tag
  FROM my_tags
 WHERE tag in ( INPUT_TAGS )

Просто создайте INPUT_TAGS в виде списка через запятую и убедитесь, что вы правильно экранировали каждый элемент, чтобы предотвратить атаки SQL-инъекций.

0 голосов
/ 13 апреля 2010

Я не знаю, быстрее ли это, но вы можете использовать mysql's IN. Полагаю, тебе придется попробовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...