с ошибкой обновляет данные

Статус
В этой теме нельзя размещать новые ответы.

goodvin

Человек-Волшебник
Регистрация
27 Июн 2006
Сообщения
667
Реакции
694
есть таблица:
Код:
$conf_bd_tbl['users_site']
 
CREATE TABLE IF NOT EXISTS `users_site` (
  `id` int(255) unsigned NOT NULL AUTO_INCREMENT,
  `userid` int(255) unsigned DEFAULT NULL,
  `site` varchar(32) DEFAULT NULL,
  `title` varchar(255) DEFAULT NULL,
  `description` varchar(500) DEFAULT NULL,
  `keywords` varchar(255) DEFAULT NULL,
  `menu` set('l','r') DEFAULT 'l',
  `vitrina` int(10) unsigned DEFAULT '10',
  `googleanalytics` varchar(18) DEFAULT NULL,
  `googlewebmasters` varchar(128) DEFAULT NULL,
  `yandexwebmasters` varchar(128) DEFAULT NULL,
  `count_goods_goods` int(128) unsigned NOT NULL DEFAULT '0',
  `count_goods_moderate` int(64) unsigned NOT NULL DEFAULT '0',
  `count_goods_nonactive` int(64) unsigned NOT NULL DEFAULT '0',
  `count_goods_draft` int(128) unsigned NOT NULL DEFAULT '0',
  `count_goods_deleted` int(128) unsigned NOT NULL DEFAULT '0',
  `count_services_services` int(128) unsigned NOT NULL DEFAULT '0',
  `count_services_moderate` int(64) unsigned NOT NULL DEFAULT '0',
  `count_services_nonactive` int(64) unsigned NOT NULL DEFAULT '0',
  `count_services_draft` int(128) unsigned NOT NULL DEFAULT '0',
  `count_services_deleted` int(128) unsigned NOT NULL DEFAULT '0',
  `count_news` int(64) unsigned DEFAULT '0',
  `count_articles` int(64) unsigned DEFAULT '0',
  `count_price` int(64) unsigned DEFAULT '0',
  `count_doc` int(64) unsigned DEFAULT '0',
  `count_gallery` int(64) unsigned DEFAULT '0',
  `count_lic` int(64) unsigned NOT NULL DEFAULT '0',
  `count_jobs` int(64) unsigned NOT NULL DEFAULT '0',
  `count_sale` int(64) unsigned NOT NULL DEFAULT '0',
  `count_faq` int(64) unsigned NOT NULL DEFAULT '0',
  `date_created` timestamp NULL DEFAULT NULL,
  `date_changed` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  `date_goods_group_changed` timestamp NULL DEFAULT NULL,
  `date_services_group_changed` timestamp NULL DEFAULT NULL,
  `active` set('0','1','2','3','4','5') DEFAULT '0',
  `moderate` set('-1','0','1') DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `date_created` (`date_created`),
  KEY `active` (`moderate`),
  KEY `userid` (`userid`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 PACK_KEYS=0 AUTO_INCREMENT=3 ;

и есть действие:

Код:
  if($services == 1){
   $count_services = ", ".$conf_bd_tbl['users_site'].".count_services_services = ".$conf_bd_tbl['users_site'].".count_services_services +1";
  } else if($services == -1){
   $count_services = ", ".$conf_bd_tbl['users_site'].".count_services_services = ".$conf_bd_tbl['users_site'].".count_services_services -1";
  }
  if($nonactive == 1){
   $count_nonactive = ", ".$conf_bd_tbl['users_site'].".count_services_nonactive = ".$conf_bd_tbl['users_site'].".count_services_nonactive +1";
  } else if($nonactive == -1){
   $count_nonactive = ", ".$conf_bd_tbl['users_site'].".count_services_nonactive = ".$conf_bd_tbl['users_site'].".count_services_nonactive -1";
  }
  if($draft == 1){
   $count_draft = ", ".$conf_bd_tbl['users_site'].".count_services_draft = ".$conf_bd_tbl['users_site'].".count_services_draft +1";
  } else if($draft == -1){
   $count_draft = ", ".$conf_bd_tbl['users_site'].".count_services_draft = ".$conf_bd_tbl['users_site'].".count_services_draft -1";
  }
  if($deleted == 1){
   $count_deleted = ", ".$conf_bd_tbl['users_site'].".count_services_deleted = ".$conf_bd_tbl['users_site'].".count_services_deleted +1";
  } else if($deleted == -1){
   $count_deleted = ", ".$conf_bd_tbl['users_site'].".count_services_deleted = ".$conf_bd_tbl['users_site'].".count_services_deleted -1";
  }

 
  $sql = "UPDATE ".$conf_bd_tbl['services_categories'].", ".$conf_bd_tbl['services_groups'].", ".$conf_bd_tbl['users_site']."
  SET ".$conf_bd_tbl['services_categories'].".categories_count = ".$conf_bd_tbl['services_categories'].".categories_count $val, ".$conf_bd_tbl['services_categories'].".categories_date_changed = NOW(),
  ".$conf_bd_tbl['services_groups'].".count = ".$conf_bd_tbl['services_groups'].".count $val $count_services [COLOR=red]$count_nonactive $count_draft $count_deleted
[/COLOR]  WHERE ".$conf_bd_tbl['services_categories'].".categories_id ='".$categories."' AND ".$conf_bd_tbl['services_groups'].".userid = '".$userid."' AND ".$conf_bd_tbl['services_groups'].".id ='".$group."' AND ".$conf_bd_tbl['users_site'].".userid ='".$userid."'";

Теперь проблема.

Остальные обновления в таблицах происходят нормально, а вот с таблицой $conf_bd_tbl['users_site'] какаято загадка.

Если в таблице записи равны 0 или более 1 обновляется нормально, а если запись нужно сделать 0, посредством каогото действия типа ['users_site'].".count_services_deleted = ".$conf_bd_tbl['users_site'].".count_services_deleted -1";
которое дожны привести поле "count_services_deleted" к 0, от 1 (текущее значение поля) не отнимается значение (count_services_deleted -1) и поле остается равным 1

Может ктото глянет свежим взглядом и найдет ошибку, тк. аналогичный на товары работает безукоризненно.
 
навскидку - при работе скрипта составляется кривой запрос на апдейт, поэтому маська его не хавает и ошибок не возвращает, ибо апдейт. сделай после присваивания $sql вот что:
PHP:
print $sql;
потом полученный запрос вставь в любой менеджер базы (phpmyadmin например) и увидишь в чем ошибка
 
ошибки не показет, в том то и фишка, я уже и тип полей правил... не помогает.

Добавлено через 56 секунд
я отделил этот запрос отдельно, все работает, а вместе не хочет
 
там где не обновлятеся вывдери SQL запрос выполни его руками в какой нить студии... отлови глюк.. все...

если он норм выполнится, то надо думать...
 
может проблема с $val, в коде ничего про эту переменную нет. Если например $val=0 то будет ошибка в запросе.
Ещё возможно сократить запрос заменяя таблицы короткими названиями (alias) будет понятнее где ошибка
PHP:
  if($services == 1){
   $count_services = ", us.count_services_services = us.count_services_services +1";
  } else if($services == -1){
   $count_services = ", us.count_services_services = us.count_services_services -1";
  }


...


   $sql = "
   UPDATE 
   ".$conf_bd_tbl['services_categories']." sc, 
   ".$conf_bd_tbl['services_groups']." sg, 
   ".$conf_bd_tbl['users_site']." us
   SET 
   sc.categories_count = sc.categories_count $val, 
   sc.categories_date_changed = NOW(),
   sg.count = sg.count $val $count_services $count_nonactive $count_draft $count_deleted
   WHERE 
   sc.categories_id ='".$categories."' 
   AND sg.userid = '".$userid."' 
   AND sg.id ='".$group."' AND us.userid ='".$userid."'";
или сделать рабочий тест вариант запроса потом подставить в него переменные и использовать в скрипте.

Ещё надо экранировать значения переменных в запросе, например если в $categories есть одиночная ковычка, то будет ошибка, надо использовать
PHP:
...
sc.categories_id ='".mysql_real_escape_string($categories)."' 
...
 
да, про $val забыл написать:
PHP:
  if($v){
   $val = '+ 1';
  } else {
   $val = '- 1';
  }

скул обрабатывает ADOdb
Все экранируется.
 
попробовал алиасами обозначить таблицы, результат не изменился.
Ошибок не показует!

кода ручками вбиваю запрос в май админ, результат такойже!
Ошибка остается, не может он отнять от 1-1 чтобы получилось 0

Добавлено через 10 минут
если разложить запрос все работает, в чем дело не пойму никак...
PHP:
   $sql = "UPDATE 
   ".$conf_bd_tbl['services_categories']." c, 
   ".$conf_bd_tbl['services_groups']." g 
   SET 
   c.categories_count = c.categories_count $val, 
   c.categories_date_changed = NOW(),
   g.count = g.count $val
   WHERE 
   c.categories_id ='".$categories."' 
   AND g.userid = '".$userid."' 
   AND g.id ='".$group."'";  
  $sql2 = "UPDATE ".$conf_bd_tbl['users_site']." u SET $s WHERE u.userid ='".$userid."'";
 
А в чем принципиальность заталкивать все в один запрос? Может так раздельно и оставить?
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху