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

Тема в разделе "Базы данных", создана пользователем goodvin, 9 дек 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. goodvin

    goodvin Человек-Волшебник

    Регистр.:
    27 июн 2006
    Сообщения:
    667
    Симпатии:
    687
    есть таблица:
    Код:
     
    $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

    Может ктото глянет свежим взглядом и найдет ошибку, тк. аналогичный на товары работает безукоризненно.
     
  2. diavolic

    diavolic

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

    goodvin Человек-Волшебник

    Регистр.:
    27 июн 2006
    Сообщения:
    667
    Симпатии:
    687
    ошибки не показет, в том то и фишка, я уже и тип полей правил... не помогает.

    Добавлено через 56 секунд
    я отделил этот запрос отдельно, все работает, а вместе не хочет
     
  4. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    там где не обновлятеся вывдери SQL запрос выполни его руками в какой нить студии... отлови глюк.. все...

    если он норм выполнится, то надо думать...
     
  5. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    может проблема с $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)."' 
    ...
     
  6. goodvin

    goodvin Человек-Волшебник

    Регистр.:
    27 июн 2006
    Сообщения:
    667
    Симпатии:
    687
    да, про $val забыл написать:
    PHP:
     
      
    if($v){
       
    $val '+ 1';
      } else {
       
    $val '- 1';
      }

    скул обрабатывает ADOdb
    Все экранируется.
     
  7. goodvin

    goodvin Человек-Волшебник

    Регистр.:
    27 июн 2006
    Сообщения:
    667
    Симпатии:
    687
    попробовал алиасами обозначить таблицы, результат не изменился.
    Ошибок не показует!

    кода ручками вбиваю запрос в май админ, результат такойже!
    Ошибка остается, не может он отнять от 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."'";

     
     
     
  8. Kloster

    Kloster

    Регистр.:
    22 июн 2009
    Сообщения:
    216
    Симпатии:
    12
    А в чем принципиальность заталкивать все в один запрос? Может так раздельно и оставить?
     
Статус темы:
Закрыта.