2013-04-13 5 views
0

У меня есть динамически сгенерированная таблица, в которой перечислены все пользователи данной группы, и каждый пользователь имеет флажок рядом с их именем. Администратор группы может выбрать/отменить выбор этих флажков, чтобы включить/исключить пользователя. В таблице MySQL есть столбец статуса для каждого пользователя, который является либо 0, либо 1. Я использую скрытые значения для обработки неконтролируемого состояния ящиков и POST данных в виде массива с уникальным идентификатором каждого пользователя в качестве ключа.Использование php-массива для генерации одного запроса MySQL INSERT

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

Array ([105] => 1 [106] => 1 [107] => 0 [108] => 0 [109] => 1)

Теперь мне нужно обновить БД. Вот как я хочу запрос посмотреть:

INSERT INTO users (uid,status) VALUES (105,1),(106,1),(107,0),(108,0),(109,1) 
ON DUPLICATE KEY UPDATE status=VALUES(status); 

Конечно, это ничего не ВСТАВИТЬ, но он обновляет каждую строку с помощью одного запроса.

Что я не могу понять: как использовать массив для генерации запроса. Особенно учитывая, что количество пользователей (количество элементов в массиве) будет отличаться.


После дополнительных исследований, кажется, что мой вопрос может сводиться к:

Можно ли использовать implode, чтобы превратить этот массив:

Array ([105] => 1 [106] => 1 [107] => 0 [108] => 0 [109] => 1)

в эту строку:

(105,1),(106,1),(107,0),(108,0),(109,1)

с гибкостью иметь больше или меньше элементов в массиве?

+1

Я не могу понять, почему переменное количество элементов проблема - вы знаете, что существует конструкция петли, не так ли? – CBroe

+0

Просто не помещайте ',' в конце значений, проверяя, соответствует ли 'loop_index + 1'' length' массива. – plalx

+0

Будучи неопытным, оправдывает понижение? Спасибо за понимание. – David

ответ

3

Использование цикла foreach вы можете превратить ваш массив в в строку, как так:

foreach($array as $key => $value) { 

$queryString .= "($key,$value), "; 

} 

Затем можно взять конец запятая от вашего запроса либо с помощью rtrim(), как так:

rtrim($queryString, ",")

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

Вашего последний запрос будет выглядеть следующим образом:

INSERT INTO users (uid,status) VALUES $queryString ON DUPLICATE KEY UPDATE status=VALUES(status); 
+0

Не так элегантно, как я представлял, но он функциональный; это действительно важно. Спасибо, что помогли невежественному парню, а не комментировали, насколько явным является мое невежество. – David

+0

Извините, я не мог предоставить вам что-то более элегантное, но на самом деле это всего лишь 4 строки кода max. Не нужно благодарить меня, я когда-то был невежественным парнем, поэтому я знаю, каково это, всегда рад помочь. –

Смежные вопросы