Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Хранение настроек в БД с помощью пар ключ-значение

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
antoxik
Отправлено: 14 Февраля, 2012 - 11:30:27
Post Id


Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Авг. 2010  


Помог: 0 раз(а)




Здравствуйте, имеется таблица с настройками в формате ключ-значение, хотелось бы узнать как произвести обновление записей в таблице без использования запроса в цикле ?

CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE auth_base.hr_options(
  2.   opt_key VARCHAR(50) NOT NULL COMMENT 'Ключ опции',
  3.   opt_name VARCHAR(100) NOT NULL COMMENT 'Название опции',
  4.   opt_value VARCHAR(200) NOT NULL COMMENT 'Значение опции',
  5.   PRIMARY KEY (opt_key)
  6. )
  7. ENGINE = INNODB
  8. AVG_ROW_LENGTH = 8192
  9. CHARACTER SET utf8
  10. COLLATE utf8_general_ci
  11. COMMENT = 'Таблица настроек';


P.S. Может быть есть другая, более оптимальная структура хранения настроек в БД ?

(Отредактировано автором: 14 Февраля, 2012 - 11:32:06)

 
 Top
Zuldek
Отправлено: 14 Февраля, 2012 - 12:00:43
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




CODE (htmlphp):
скопировать код в буфер обмена
  1. "UPDATE auth_base.hr_options SET opt_name = '".$name."', opt_value = '".$value."' WHERE opt_key = '".$key."'";
?

Если несколько update именно надо сделать одним запросом то -

UPDATE auth_base.hr_options SET opt_value = CASE
WHEN opt_key = 1 THEN 123;
WHEN opt_key = 2 THEN 456;

END
WHERE opt_key IN (1,2,…)

либо классически запросы через UNION

(Отредактировано автором: 14 Февраля, 2012 - 12:24:15)

 
 Top
antoxik
Отправлено: 14 Февраля, 2012 - 12:25:07
Post Id


Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Авг. 2010  


Помог: 0 раз(а)




[quote=Zuldek][/quote]

это как раз и есть в цикле, а нам без него хочется, тем более opt_name незачем трогать ))
 
 Top
Zuldek
Отправлено: 14 Февраля, 2012 - 12:28:42
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




antoxik пишет:
Zuldek пишет:


это как раз и есть в цикле, а нам без него хочется, тем более opt_name незачем трогать ))


ну тогда второй вариант. UPDATE REPLACE или INSERT... . Строете в цикле запрос и выполняете всего один. Другое дело что так не эффективно.

CODE (htmlphp):
скопировать код в буфер обмена
  1. INSERT INTO auth_base.hr_options
  2. (opt_key, opt_value)
  3. VALUES
  4. (1, qwerty),
  5. (2, 456),
  6. (3, 1)
  7. ON DUPLICATE KEY UPDATE auth_base.hr_options = VALUES(opt_value);
 
 Top
Мелкий Супермодератор
Отправлено: 14 Февраля, 2012 - 12:35:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Идеологически верно будут prepared statements, т.к. и разработаны они были именно под однотипные запросы с меняющимися данными.
Но драйвер mysql их не умеет.

Ещё вариант - собрать кучу запросов и выполнить всем скопом через mysqli::multi_query


-----
PostgreSQL DBA
 
 Top
antoxik
Отправлено: 14 Февраля, 2012 - 12:37:49
Post Id


Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Авг. 2010  


Помог: 0 раз(а)




А для Zend_DB_Table есть что нибудь наподобие ?
 
 Top
Zuldek
Отправлено: 14 Февраля, 2012 - 12:50:51
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




antoxik пишет:
А для Zend_DB_Table есть что нибудь наподобие ?

$adapter = Zend_Db_Table_Abstract::getDefaultAdapter();
$mysqli = $adapter->getConnection();
$mysqli->multi_query($queries);
важно другое, есть ли вообще mysqli...

(Отредактировано автором: 14 Февраля, 2012 - 12:53:15)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB