[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сохранить массив в бд
maximka787
Мужики, разве можно сохранить как-то массив данных в базу без использования запроса в цикле?
Например:
foreach ($_POST['t'] as $key => $value) {
echo '<br>ID= '.$key.' price= '.$value;
$query = "update table set price='".$value."' where id='".$key."'";
$result = mysql_query($query);
}





Спустя 2 минуты, 50 секунд (15.03.2011 - 19:02) sharki написал(а):
Serialize()

Спустя 4 минуты, 25 секунд (15.03.2011 - 19:07) Trianon написал(а):
maximka787
В MySQL - можно. Одним многострочным INSERT-запросом.

Спустя 2 минуты, 50 секунд (15.03.2011 - 19:09) Trianon написал(а):
sharki
Судя по коду, автор предполагает потом элементы массива искать, отфильтровывать и выбирать согласно ключам средствами SQL.

Спустя 4 минуты, 4 секунды (15.03.2011 - 19:14) maximka787 написал(а):
Да у меня есть ID товаров и цены, и для каких-то конкретных товаров и меняю цены.
Про Serialize() читал много, но не подходит. У меня структура такая
id, id_tovar, price
1 1 2000
2 1 3000
3 1 2000
4 1 3000

и так для insert и update

Спустя 3 минуты, 1 секунда (15.03.2011 - 19:17) sharki написал(а):
Ну можно привести его таблицу ко 2ой нормальной форме, сделать отдельную подтаблицу и туда уже складировать все его значения по порядку, возможны повторения меж значениями, главное чтобы было инкрементирующее поле...

Если так всё сделано, то думаю без цыкла тут не обойтись..ведь он делает UPDATE подчи каждого поля...


Ну вот всё нормиком у тебя, чего ты паришься?

Ты не сможешь за один подход обновить все поля

Спустя 3 минуты, 29 секунд (15.03.2011 - 19:20) Trianon написал(а):
полагаю, если поставить цель, можно обойтись и без явного цикла.
Несколько запросов точно не нужны.

Спустя 1 минута, 24 секунды (15.03.2011 - 19:21) maximka787 написал(а):
sharki
Да я прочитал где-то, что это непрофессионально, делать insert, update, del в цикле. Для меня это было самым разумным решением, да и другой метод, я честно не представляю)

Спустя 2 минуты, 17 секунд (15.03.2011 - 19:24) Trianon написал(а):
Цитата
Да я прочитал где-то, что это непрофессионально, делать insert, update, del в цикле. Для меня это было самым разумным решением, да и другой метод, я честно не представляю)


Если нужно еще и что-то удалять - отдельный запрос для удаления, конечно, понадобится. Удалять строки INSERT-запрос не умеет.

Спустя 7 минут (15.03.2011 - 19:31) CyberOrcX написал(а):
все-таки самым умным решением будет сделать подтаблицу как предложил товарищ sharki

Спустя 5 минут, 57 секунд (15.03.2011 - 19:37) neadekvat написал(а):
CyberOrcX, это не будет "самым лучшим". Это будет другим решением, для другой задачи. И на это Trianon уже указал.

Спустя 5 минут, 41 секунда (15.03.2011 - 19:42) Trianon написал(а):
maximka787
Цитата
Да у меня есть ID товаров и цены, и для каких-то конкретных товаров и меняю цены.
Про Serialize() читал много, но не подходит. У меня структура такая

id, id_tovar, price
1 1 2000
2 1 3000
3 1 2000
4 1 3000



Как-то тут тускло со структурой...
Какие ключи созданы на полях таблицы?
Что означает id_tovar, откуда берется?
$_POST['t'] - как я понял, массив значений price, проиндексированный ключом id.
А про id_tovar ни слова.

Спустя 4 минуты, 16 секунд (15.03.2011 - 19:47) maximka787 написал(а):
Trianon
id_tovar в данном случае не важен. Он не трогается. Это ID самого товара. то есть у одного товара несколько цен, таблица урезена, чтоб не путать.

Спустя 18 минут, 47 секунд (15.03.2011 - 20:05) Trianon написал(а):
$list = array(
'1' => '2000',
'2' => '3000',
'3' => '2000',
'4' => '3000'
);

$sql = "INSERT INTO goods (id, price) VALUES
"
;

foreach($list as $id => $price)
$sql .= ' (' . ((int)$id) . ',' . ((float)$price) . '),
'
;

$sql = substr_replace(trim($sql), ' ', -1);
$sql .= '
ON DUPLICATE KEY
UPDATE price=VALUES(price)'
;

echo "<pre>$sql";



Если кому нравится без циклов, вот:
$list = array(
'1' => '2000',
'2' => '3000',
'3' => '2000',
'4' => '3000'
);


$keys = array_map( 'intval', array_keys( $list));
$vals = array_map('floatval', array_values($list));
function gen($x) {return '('.implode(',',$x).')';}
$matr = array_map(null, $keys, $vals);
$matr = array_map('gen', $matr);
$sql = "INSERT INTO goods (id, price) VALUES
"
. implode(',
'
,$matr) . '
ON DUPLICATE KEY
UPDATE price=VALUES(price)
'
;

echo "<pre>$sql";

Спустя 5 минут, 52 секунды (15.03.2011 - 20:11) imbalance_hero написал(а):
maximka787
А есть ещё mysqli , там тоже множественность, кажется, можно реализовать.

Спустя 14 минут, 15 секунд (15.03.2011 - 20:26) Trianon написал(а):
imbalance_hero
mysqli - это не отдельная СУБД, и не отдельный язык.
Это лишь еще один интерфейс к той же СУБД.

А вот просто так, сходу, нарисовать аналогичное построение именно в стиле mysqli
(то есть с плейсхолдерами и привязкой переменных, я например, не возьмусь.
И не удивлюсь, если это вообще невыполнимо.


_____________
..Работает - не трогай!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.