Страница 1 из 3

Версия от 09/19/2013 19:12

Добавлено: Пт сен 20, 2013 6:30 am
Amarok
Только у меня после обновления от 09/19/2013 19:12 Алиса перестала говорить?

Re: Версия от 09/19/2013 19:12

Добавлено: Пт сен 20, 2013 6:36 am
Amarok
Странно, вообще скрипты работать не стали оказывается :((((

Re: Версия от 09/19/2013 19:12

Добавлено: Пт сен 20, 2013 6:58 am
Amarok

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

Sep 20, 2013 09:54:18 http://127.0.0.1/admin.php?pd=c2NyaXB0czp7aW5zdGFuY2U9YWRtfQ%3D%3Dpz_cGFuZWw6e2FjdGlvbj1zY3JpcHRzfQ%3D%3Dpz_&md=scripts&inst=adm&view_mode=run_script&id=12
Error:
1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
SELECT * FROM commands WHERE LINKED_OBJECT LIKE 'netping_o1' AND LINKED_PROPERTY LIKE 'status' AND

 
Warning: mail() [function.mail]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in D:\_majordomo\htdocs\lib\htmlMimeMail.class.php on line 691

Re: Версия от 09/19/2013 19:12

Добавлено: Пт сен 20, 2013 3:59 pm
Amarok
Помогите исправить?

Re: Версия от 09/19/2013 19:12

Добавлено: Пт сен 20, 2013 5:16 pm
LutsenkoDenis
1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

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

SELECT * FROM commands WHERE LINKED_OBJECT LIKE 'netping_o1' AND LINKED_PROPERTY LIKE 'status' AND
А это весь sql запрос? Если да, то он 100% не корректный, так как после and должно быть условие.

>Warning: mail() [function.mail]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in D:\_majordomo\htdocs\lib\htmlMimeMail.class.php on line 691
Тут ругается на то что неможет подключиться к smtp-серверу.

Re: Версия от 09/19/2013 19:12

Добавлено: Пт сен 20, 2013 5:31 pm
Amarok

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

http://127.0.0.1:80/objects/?script=mattress
Изображение
Вот... :cry: :cry: :cry:
Началось после обновления

Re: Версия от 09/19/2013 19:12

Добавлено: Пт сен 20, 2013 5:58 pm
LutsenkoDenis
ну.. а что DebMes в лог пишет на эту тему?

Re: Версия от 09/19/2013 19:12

Добавлено: Пт сен 20, 2013 6:25 pm
LutsenkoDenis
о всё.. я нашел ошибку.
Сергей слегка накосячил в последнем обновлении ;-)

Быстро исправить может он, т.к. точно знает как должно работать на самом деле.
Я могу исправить ошибку коде, но я не могу сказать какой будет результат, т.к. еще не знаю как должен работать алгоритм.

Как вариант можно откатиться назад.

Re: Версия от 09/19/2013 19:12

Добавлено: Пт сен 20, 2013 11:33 pm
LutsenkoDenis
Комментарии к данной ошибке.
Файл: /modules/objects/objects.class.php
Функция: function setProperty($property, $value, $no_linked = 0)
Важно! $no_linked = 0
Т.е. в любом случае переменная $no_linked существует и равна 0(если не указано другое значение при вызове функции)

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

$tables = array('commands', 'owproperties', 'snmpproperties', 'zwave_properties', 'mqtt');
if (!is_array($no_linked) && $no_linked) 
{
   $no_linked=array();
   foreach($tables as $t) 
   {
      $no_linked[$k]='0';
   }
} 
elseif (is_array($no_linked)) 
{
   foreach($tables as $t) 
   {
      if (!isset($no_linked[$k])) 
      {
         $no_linked[$k]='1';
      }
   }
} 
else 
{
   $no_linked=array();
   foreach($tables as $t) 
   {
      $no_linked[$k]='1';
   }
} {
1. Проверка на существование переменной/объекта делается так isset($no_linked)
2. В данном условии нужна только проверка на то, является ли данная переменная массивом. Т.к. при любом раскладе $no_linked существует.
3. Условие else не наступит никогда. Т.к. переменная $no_linked всегда существует и она либо является массивом либо нет. Другого варианта у неё нет.

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

 $commands = SQLSelect("SELECT * FROM commands WHERE LINKED_OBJECT LIKE '" . DBSafe($this->object_title) . "' AND LINKED_PROPERTY LIKE '" . DBSafe($property) . "' AND " . $no_linked['commands']);
1. Если $no_linked['commands'] не существует(ну вдруг), то запрос к базе будет ошибочный, т.к. после AND ничего не будет подставлено.
2. Если $no_linked['commands'] существет, то запрос к базе опять будет с ошибкой, так как после AND должна быть указана остальная часть условия. Если конечно $no_linked['commands'] не содержит в себе эту часть условия.
3. Такие запросы к базе очень тяжело дебажить, т.к. не известны условия выборки из БД. Т.е. несчем сравнить результат.

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

$snmpdevices = SQLSelect("SELECT ID FROM snmpproperties WHERE LINKED_OBJECT LIKE '" . DBSafe($this->object_title) . "' AND LINKED_PROPERTY LIKE '" . DBSafe($property) . "' AND " . $no_linked['snmpproperties']);
         $total = count($snmpdevices);
         if ($total)
Условие должно быть таким

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

if (isset($snmpdevices))
count($snmpdevices) вернёт 0 если переменная $snmpdevices не содержит результата запроса к базе или не объявлена.

Re: Версия от 09/19/2013 19:12

Добавлено: Пт сен 20, 2013 11:36 pm
LutsenkoDenis
или хотябы таким if ($total > 0)