[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Правильная организация обновления базы. Помогите.
vovabraga
Реализовую обновление базы sql.
Суть стандартая: в виде файла с разделителями по ftp заливается на сайт заливаются новые значения для базы (в данном случае наличие товара на складе).
Из адмики после нажатия кнопки обновить базу вызывается скрипт обновления базы.
Скрипт вычитывает из файла значения и выполняет скрипт обновления базы sql:
update_good_sql ($id,$availability);

скрипт следующего содержания:

function update_good_sql ($id,$availability)
{
$db = mysql_connect($GLOBALS["dbhost"], $GLOBALS["dbuser"], $GLOBALS["dbpass"]);

$res = mysql_select_db($GLOBALS["dbname"]);

if (!$res)
{
mysql_close($db);
$ret = DB_NO_CONNECT;
return $ret;
}

$str = "UPDATE " .$GLOBALS["table_goods"]. " SET id = " .$id.
", availability = " .$availability.
" WHERE id = ".$id;

mysql_query($str,$db);

if (mysql_error($db) != "")
{
mysql_close($db);
$ret = DB_NO_CONNECT;
return $ret;
}

mysql_close($db);

return OK;

}


Функция update_good_sql ($id,$availability) вызывается для обновления каждого товара в цикле.

Возникают ошибки и проблемы, которые нужно решить :
1) Maximum execution time of 30 seconds exceeded - поставил

set_time_limit (0);

ИМХО - это не очень хорошо.
2) выпадает Can't connect to MySQL server on 'localhost' (10048)
Это еще хуже.
Как я понимаю скрипт выполняется долго и сервер (даже локальный умирает).

Вопросы:
1) правильно я организовываю обновление базы? Как правильно?
2) Как испправить ошибки, и как уменьшить нагрузку на сервер?



Спустя 2 минуты, 27 секунд (30.06.2010 - 10:17) tomash написал(а):
vovabraga
Попробуйте все данные сложить в массив, потом динамически составить запрос к БД, потом одним запросом обновить!

Спустя 1 минута, 39 секунд (30.06.2010 - 10:18) tomash написал(а):
И еще лучше в самой функции не вызывать подключение к БД, Вы же сами говорите функция в цикле

Спустя 1 минута, 10 секунд (30.06.2010 - 10:19) vovabraga написал(а):
Цитата (tomash @ 30.06.2010 - 07:17)
vovabraga
Попробуйте все данные сложить в массив, потом динамически составить запрос к БД, потом одним запросом обновить!

Можно пример, или хотя бы скелет реализации? Плиз

Спустя 55 секунд (30.06.2010 - 10:20) vovabraga написал(а):
Цитата (tomash @ 30.06.2010 - 07:18)
И еще лучше в самой функции не вызывать подключение к БД, Вы же сами говорите функция в цикле

т.е базу открывать только один раз, верно понял?

Спустя 22 минуты, 21 секунда (30.06.2010 - 10:43) tomash написал(а):
$array = array (array('id' => 1, 'name' => 'name1'),
array('id' => 2, 'name' => 'name2'));
$val = '';
foreach ($array as $var)
{
$val[] = '('.implode(',', $var).')';
}
$val_str = implode(',', $val);

mysql_query ("INSERT INTO table1 (id, name) values".$val_str." ON DUPLICATE KEY UPDATE name=name");


поле id - ключ таблицы

Спустя 26 минут, 8 секунд (30.06.2010 - 11:09) vovabraga написал(а):
Цитата (tomash @ 30.06.2010 - 07:43)
$array = array (array('id' => 1, 'name' => 'name1'),
array('id' => 2, 'name' => 'name2'));
$val = '';
foreach ($array as $var)
{
$val[] = '('.implode(',', $var).')';
}
$val_str = implode(',', $val);

mysql_query ("INSERT INTO table1 (id, name) values".$val_str." ON DUPLICATE KEY UPDATE name=name");


поле id - ключ таблицы

спс, за совет. С открытием базы один раз скорость выросла очень сильно biggrin.gif
второй способ надо изучить
Быстрый ответ:

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