Суть стандартая: в виде файла с разделителями по 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'), поле id - ключ таблицы |
спс, за совет. С открытием базы один раз скорость выросла очень сильно

второй способ надо изучить