почему так может быть?

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

ipz
Сообщения: 238
Зарегистрирован: Чт ноя 26, 2015 10:54 pm
Благодарил (а): 38 раз
Поблагодарили: 45 раз

Re: почему так может быть?

Сообщение ipz » Вс дек 27, 2015 5:24 pm

Закомментировал у себя самое начало функции getProperty:

Код: Выделить всё

if ($this->object_title) {
   $value=SQLSelectOne("SELECT VALUE FROM pvalues WHERE PROPERTY_NAME = '".DBSafe($this->object_title.'.'.$property)."'");
   if (isset($value['VALUE'])) {
    startMeasure('getPropertyCached2');
    endMeasure('getPropertyCached2', 1);
    endMeasure('getProperty ('.$property.')', 1);
    endMeasure('getProperty', 1);
    return $value['VALUE'];
   } 
ipz
Сообщения: 238
Зарегистрирован: Чт ноя 26, 2015 10:54 pm
Благодарил (а): 38 раз
Поблагодарили: 45 раз

Re: почему так может быть?

Сообщение ipz » Вс дек 27, 2015 5:26 pm

Добавил 2 строчки в функции setProperty:

Код: Выделить всё

 function setProperty($property, $value, $no_linked=0) {

  startMeasure('setProperty');
  startMeasure('setProperty ('.$property.')');
  $id=$this->getPropertyByName($property, $this->class_id, $this->id);
  $old_value='';

  $cached_name='MJD:'.$this->object_title.'.'.$property;

  if ($id) {
   $prop=SQLSelectOne("SELECT * FROM properties WHERE ID='".$id."'");
   $v=SQLSelectOne("SELECT * FROM pvalues WHERE PROPERTY_ID='".(int)$id."' AND OBJECT_ID='".(int)$this->id."'");
   $old_value=$v['VALUE'];
   $v['VALUE']=$value;
   if ($v['ID']) {
    $v['UPDATED']=date('Y-m-d H:i:s');
    if ($old_value!=$value) {
     SQLUpdate('pvalues', $v);
    } else {
    SQLUpdate('pvalues', $v);
    } else {
     SQLExec("UPDATE pvalues SET UPDATED='".$v['UPDATED']."' WHERE ID='".$v['ID']."'");
    }
   } else {
    $v['PROPERTY_ID']=$id;
    $v['OBJECT_ID']=$this->id;
    $v['VALUE']=$value;
    $v['UPDATED']=date('Y-m-d H:i:s');
    $v['PROPERTY_NAME']=$this->object_title.'.'.$property; // <--- ЗДЕСЬ
    $v['ID']=SQLInsert('pvalues', $v);
   }
   //DebMes(" $id to $value ");
  } else {
    $prop=array();
    $prop['OBJECT_ID']=$this->id;
    $prop['TITLE']=$property;
    $prop['ID']=SQLInsert('properties', $prop);

    $v['PROPERTY_ID']=$prop['ID'];
    $v['OBJECT_ID']=$this->id;
    $v['VALUE']=$value;
    $v['UPDATED']=date('Y-m-d H:i:s');
    $v['PROPERTY_NAME']=$this->object_title.'.'.$property; // <--- ЗДЕСЬ
    $v['ID']=SQLInsert('pvalues', $v);
  }

// ...


ipz
Сообщения: 238
Зарегистрирован: Чт ноя 26, 2015 10:54 pm
Благодарил (а): 38 раз
Поблагодарили: 45 раз

Re: почему так может быть?

Сообщение ipz » Вс дек 27, 2015 5:29 pm

Поломанные связи починил частично вручную, потом надоело и сваял (как умею, есичо):

Код: Выделить всё

$sql = "SELECT pvalues . *, properties.ID AS P_ID, properties.CLASS_ID AS P_CLASS_ID, objects.TITLE AS  O_TITLE, objects.ID AS O_ID, objects.CLASS_ID AS O_CLASS_ID
FROM pvalues LEFT JOIN properties ON pvalues.PROPERTY_ID = properties.id, objects
WHERE  objects.ID=pvalues.OBJECT_ID  
AND properties.ID IS NULL";

$list=SQLSelect($sql);
$total=count($list);
/*
$header="<table border=1><caption>Список ". $total . " объектов</caption> <tr>"; //"  <th>ID</th><th>TITLE</th> <th>Nick</th> <th>OnLine</th> <th>LastSeen</th> <th>LastSeenTime</th><th>LastSeenTimeAgo</th>";
$body="";

for ($i=0;$i<$total;$i++) {
  $row="<tr>";
  foreach ($list[$i] as $index => $val) {
    if(!$i){
      $header.= "<th>" . $index . "</th>";     
    }
    $row .= "<td>" . $val . "</td>"; 
  }
  $row .= "</tr>";
  $body .= $row . "</tr>";
}
$header .= "</tr>";
sg('ThisComputer.Debug', $header . $body . "</table>");
*/

for ($i=0; $i<$total;$i++){
  $class=$list[$i]['O_TITLE'];
  $class_id= $list[$i]['O_CLASS_ID'];
  $property_name=$list[$i]['PROPERTY_NAME'];
  $property =explode(".",$property_name);
  if(isset($property[1])){
   // Восстанавливаем свойства классов в properties. Все потерянные свойства будут приписаны базовому классу.
   $sqlQuery = "SELECT ID
                  FROM properties
                 WHERE TITLE LIKE '" . DBSafe($property[1]) . "'
                   AND OBJECT_ID = 0
                   AND CLASS_ID  = '" . $class_id . "'";
   $prop = SQLSelectOne($sqlQuery);
   if (!$prop['ID'])
   {
      $prop = array();
      $prop['CLASS_ID']     = $class_id;
      $prop['TITLE']        = $property[1];
      $prop['KEEP_HISTORY'] = 0;
      $prop['OBJECT_ID']    = 0;
      $prop['ID']           = SQLInsert('properties', $prop);
   }
   // Восстанавливаем связи в таблице значений
  
      $sqlQuery = "UPDATE pvalues
                      SET PROPERTY_ID = '" . $prop['ID'] . "',
                             OBJECT_ID   = '" . $list[$i]['O_ID'] . "'
                    WHERE ID = '" . $list[$i]['ID'] . "'"; //DBSafe($ID)
         SQLExec($sqlQuery);
  }
}
 
ipz
Сообщения: 238
Зарегистрирован: Чт ноя 26, 2015 10:54 pm
Благодарил (а): 38 раз
Поблагодарили: 45 раз

Re: почему так может быть?

Сообщение ipz » Вс дек 27, 2015 5:32 pm

Осталось таблицу методов проверить. С ними тоже наблюдается 'странное'.
condor77
Сообщения: 36
Зарегистрирован: Пн окт 30, 2017 9:54 am
Благодарил (а): 8 раз
Поблагодарили: 2 раза

Re: почему так может быть?

Сообщение condor77 » Вт мар 27, 2018 10:51 am

Добрый день. Обнаружил что перестало работать удалённое управление вообще.
Оказалось что исчезли (по крайней мере я их не вижу) все свойства и методы классов. Остались только по одному два свойства которые были у самих объектов. Пробовал обновить систему. Не помогло. Пробовал восстанавливать из файла бэкапа. Результат то-же.
В х-рей вроде ругается на шедулер. Но что эта информация даёт? Я и так знаю что таймер не запускается. Ведь исчезли методы и в классе таймера. Может кто подскажет куда смотреть.
Аватара пользователя
slgeo
Сообщения: 551
Зарегистрирован: Чт фев 05, 2015 2:35 pm
Откуда: РнД
Благодарил (а): 139 раз
Поблагодарили: 74 раза

Re: почему так может быть?

Сообщение slgeo » Ср мар 28, 2018 10:26 am

Попробуйте вручную через phpmyadmin накатить скрипт обновления базы.
За это сообщение автора slgeo поблагодарил:
condor77 (Чт мар 29, 2018 3:26 pm)
Рейтинг: 1.16%
Raspberry Pi2 Model B + NRF24L01 (MySensors) + 1-Wire + Esp8266 (WiFi-IoT)
CONNECT
condor77
Сообщения: 36
Зарегистрирован: Пн окт 30, 2017 9:54 am
Благодарил (а): 8 раз
Поблагодарили: 2 раза

Re: почему так может быть?

Сообщение condor77 » Ср мар 28, 2018 2:05 pm

А вот тут упс. Не совсем программист. Зайти в phpmyadmin могу но что дальше в нём и как делать это увы пока для меня тяжко.
А можно чуть подробнее для отставших. Или ткните где это описано.
Аватара пользователя
slgeo
Сообщения: 551
Зарегистрирован: Чт фев 05, 2015 2:35 pm
Откуда: РнД
Благодарил (а): 139 раз
Поблагодарили: 74 раза

Re: почему так может быть?

Сообщение slgeo » Ср мар 28, 2018 3:09 pm

Найдите в основном каталоге файл с дампом базы (*.sql), в папках backup должен быть.
В phpmyadmin выделите db_terminal и сделайте импорт из файла.
За это сообщение автора slgeo поблагодарили (всего 2):
condor77 (Чт мар 29, 2018 3:26 pm) • zroman07 (Пт янв 14, 2022 11:33 am)
Рейтинг: 2.33%
Raspberry Pi2 Model B + NRF24L01 (MySensors) + 1-Wire + Esp8266 (WiFi-IoT)
CONNECT
condor77
Сообщения: 36
Зарегистрирован: Пн окт 30, 2017 9:54 am
Благодарил (а): 8 раз
Поблагодарили: 2 раза

Re: почему так может быть?

Сообщение condor77 » Чт мар 29, 2018 3:25 pm

О, спасибо, помогло. Сам бы никогда не додумался.
Ответить