Хранение тегов без нескольких поездок в базу данных - PullRequest
1 голос
/ 22 марта 2011

Это то, что я обычно делаю для хранения тегов в базе данных:

   foreach ($tags as $tag)
   {
      if (mysqli_query($link, "INSERT INTO tag (name) VALUES ('$tag')") === false)
      {
         $queries_ok[] = false;   # I'm using this because I have autocommit set to false, i.e. mysqli_autocommit($link, FALSE);
      }      
   }

Однако это включает в себя подключение к базе данных несколько раз, поэтому, если у вас есть 10 тегов, это предполагает подключение 10 раз, есть ли другой, более простой и быстрый способ сделать это?

Ответы [ 5 ]

2 голосов
/ 22 марта 2011

Я бы рекомендовал использовать подготовленные заявления. Psuedocode, потому что я не помню точные функции PHP:

$st = $db->prepare('INSERT INTO tag(name) VALUES (?)');
$st->bindParam(1, $tag);
foreach ($tags as $tag)
  $st->exec();

Несмотря на то, что вы по-прежнему обращаетесь к БД за вызов, сам запрос не анализируется на каждом exec(), и вы получаете дополнительное преимущество безопасной проверки параметров.

2 голосов
/ 22 марта 2011

MySQL имеет синтаксис «расширенной вставки», который выглядит следующим образом:

INSERT INTO table (a,b,c) VALUES (1,2,3), (4,5,6), (7,8,9), etc...

Единственный недостаток заключается в том, что этот формат не поддерживается подготовленными операторами, поэтому вы должны создать запрос самостоятельно, чтоозначает предпринять обычные шаги, чтобы избежать проблем с внедрением SQL.

1 голос
/ 22 марта 2011

Вы можете вставить несколько строк одним оператором вставки:

INSERT INTO tag (name) VALUES ('tag1'), ('tag2'), ('tag3'), ...
0 голосов
/ 22 марта 2011

В дополнение к тому, что mfonda сказал, вы можете сделать

INSERT INTO table (a,b,c)
SELECT 1,2,3
UNION 
SELECT 4,5,6
UNION
SELECT 7,8,9;

Это старая школа, стандарт до SQL-92. Так меня учили все старожилы.

0 голосов
/ 22 марта 2011

Я нашел альтернативный вариант select / union достаточно общим и много раз использовал его в системах, где расширенная вставка была недоступна:

что-то (у меня нет баз данных на этом хосте ..) как это:

INSERT INTO TABLE (a,b,c)
SELECT 1, 2, 3 
union 
SELECT 4, 5, 6
union 
SELECT 7, 8, 9
...