PHP код

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

Модератор: immortal

LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

PHP код

Сообщение LutsenkoDenis » Пн мар 16, 2015 2:31 pm

В файле /lib/common.class.php наткнулся на функцию textToNumbers.
Может кто подскажет ЧТО она делает и главное ЗАЧЕМ?
1. В коде функция textToNumbers нигде не вызывается, я не смог найти.
2. $newtext=($newtext); присвоение переменной собственного значения.
3. Функция называется textToNumbers, но перевода строки в число я что-то не встретил.
Код:

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

/**
 * Title
 *
 * Description
 *
 * @access public
 */
function textToNumbers($text)
{
   $newtext=($text);
   $newtext=($newtext); 
   return $newtext;
}
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: PHP код

Сообщение sergejey » Пн мар 16, 2015 2:34 pm

Хороший вопрос... я не знаю зачем она такая ) Могу предположить, что когда-то она задумывалась для перевода текста из команд пользователя в цифры. Например, я говорю "включи музыку через десять минут", а после обработки этой функцией "десять" превращается в "10". Но наверное задача была не актуальной, потому эта функция так и осталась болтаться как рудимент.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: PHP код

Сообщение LutsenkoDenis » Пн мар 16, 2015 3:19 pm

а где именно "десять" превращается в "10" в данной функции?
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: PHP код

Сообщение sergejey » Пн мар 16, 2015 4:17 pm

LutsenkoDenis писал(а):а где именно "десять" превращается в "10" в данной функции?
В планах. Очевидно же.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: PHP код

Сообщение LutsenkoDenis » Пн мар 16, 2015 4:51 pm

:))))
ну я примерно так и понял, но на всякий случай уточнил :)
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
zelevova
Сообщения: 291
Зарегистрирован: Вт ноя 18, 2014 11:43 pm
Откуда: Краснодарский край
Благодарил (а): 32 раза
Поблагодарили: 68 раз

Re: PHP код

Сообщение zelevova » Пн мар 16, 2015 4:51 pm

:lol: :lol: :lol:
Majordomo (GitHub) на cubietruck + MegaD + 1-wire
CONNECT: http://connect.smartliving.ru/profile/311
Аватара пользователя
Vovix
Сообщения: 1155
Зарегистрирован: Пн янв 27, 2014 1:43 am
Откуда: г.Ижевск
Благодарил (а): 60 раз
Поблагодарили: 532 раза
Контактная информация:

Re: PHP код

Сообщение Vovix » Пн мар 16, 2015 9:19 pm

Ух ты! Практически сон в руку!!!

Я как раз несколько дней назад озадачился проблемой выдачи при распознавании числительных в падеже в виде текста!

например говоришь: "напомни через 20 минут надо выключить пельмени"
и Алиса (не без помощи Google конечно) понимает именно так - 20 - числом!

а если сказать "напомни через 21 минуту надо выключить пельмени"
то Алиса понимает 21 как "двадцать одну" - текстом!

Я начал это исправлять но не доделал (хотя уже работает):

В шаблонах поведения:

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

(напомн(.*) через) (.+) (минут(.*)) (.+)
В коде:
СпойлерПоказать

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

$d=$matches[3];

function check_for_number($str)
{
    $lenght = strlen($str); 
    for($i=0;$i<$lenght;)
    {
        if (is_numeric($str[$i++]))
        {
            return true;
        }
    }
    return false;
}


    if (!check_for_number($d)) {
    
        $ddd = explode(" ", $d);
        $num = array();
        $len=count($ddd);
        $d=0;
     
            for($j=0;$j<$len;$j++) {
             
 
                switch ($ddd[$j]) {
                    case "одну":
                    case "один":
                        $num[$j]="1";
                     break;
                     case "десять":
                        $num[$j]="10";
                     break;
                     case "сто":
                        $num[$j]="100";
                     break;
                    case "две":
                    case "два":
                        $num[$j]="2";
                     break;
                    case "двадцать":
                        $num[$j]="20";
                     break;
                     case "двести":
                        $num[$j]="200";
                    break;
                    case "тридцать" :
                        $num[$j]="30";
                    break;    
                    case "сорок" :
                        $num[$j]="40";
                    break;
                    case "пятьдесят" :
                        $num[$j]="50";
                    break;
                    case "шестьдесят" :
                        $num[$j]="60";
                    break;
                    case "семьдесят" :
                        $num[$j]="70";
                    break;
                    case "восемьдесят" :
                        $num[$j]="80";
                    break;
                    case "девяносто" :
                        $num[$j]="90";
                    break;
                    
                }
                $d=$d+$num[$j];
            }    
$d=(string)$d;
    }

    if (check_for_number($d)) {
         say("Хорошо, принято: напомнить через ".$d." минут",1);
        setTimeOut('timer','say("Меня просили напомнить, напоминаю: '.$matches[6].'",5);',$d*60);
        }
    else {
         say("Не могу понять",1);
        }
вариант сырой и я "НИ ГДЕ НЕ ПРОГРАММИСТ!"
но вроде работает!!!

может внедрить в эту функцию, но исправленный и доработанный вариант?
За это сообщение автора Vovix поблагодарили (всего 2):
mirsum (Пн мар 16, 2015 11:31 pm) • Amarok (Вт мар 17, 2015 8:49 am)
Рейтинг: 2.33%
Мой -CONNECT-
Windows 7(PHP 7.2) + Raspberry Pi(освещение на 1-Wire) + MP751(управление) + ESP8266(сенсоры) + LAN(сенсоры)
-=: Если вам помогло моё сообщение, нажмите кнопку "Поблагодарить за сообщение автора: Vovix" (кнопка Спасибо) справа! :=-
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: PHP код

Сообщение LutsenkoDenis » Пн мар 23, 2015 11:34 am

Notice: Undefined variable: param_str in \lib\module.class.php (функция parseLinks)

Происходит это из-за этого куска кода в самом начале функции:

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

if ($md != $this->name)
   $param_str = $this->saveParams();
elseif (IsSet($this->owner))
   $param_str = $this->owner->saveParams(); 
Варианты решения:
1. перед условием определить переменную: $param_str = "";
2. в условие добавить else и определить переменную там.

p.s. это конечно не критическая ошибка, но может повлиять на корректность данных на выходе.

Notice: Undefined variable: params1 in \lib\module.class.php (функция createParamsString)
Происходит это из-за этого куска кода также в самом начале функции:

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

foreach($data as $k=>$v)
   {
      if ($v == "")
      {
         UnSet($data[$k]);
      } 
      else
      {
         $params .= "m" . STRING_DELIMITER . $name . STRING_DELIMITER . $k . EQ_DELIMITER . $v . PARAMS_DELIMITER;
         $params1[] = "$k=$v";
      }
   }
if (count($params1))
   {
....
Варианты решения:
1. перед циклом определить массив $params1[]
2. Заменить в условии count на isset.

Notice: Notice: Undefined variable: res_str in \lib\module.class.php (функция codeParams)
Происходит это из-за этого куска кода:

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

function codeParams($in)
   {
      if (preg_match_all('/(.+?):{(.+?)}/', $in, $matches2, PREG_PATTERN_ORDER))
      {
         for($k = 0; $k < count($matches2); $k++)
         {
            $data = array();
            $module_name = $matches2[1][$k];
            $module_params = explode(',',$matches2[2][$k]);
         
            for($m = 0; $m < count($module_params); $m++)
            {
               $ar = explode("=", trim($module_params[$m]));
               $data[trim($ar[0])] = trim($ar[1]);
            }
            
            $res_str .= $this->createParamsString($data, $module_name) . PARAMS_DELIMITER;
         }
      }

      return $res_str;
   } 
Варианты решения:
1. В начале функции определить переменную $res_str.

Notice: Undefined variable: /nf.php

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

foreach($requests as $key=>$value) 
{
   if (!$found && preg_match($key, $_SERVER["REQUEST_URI"], $matches)) 
   {
      $link = $value;
      for($i = 1; $i < count($matches); $i++) 
      {
         $link = str_replace("\\$i", $matches[$i], $link);
      }
  
      $link = preg_replace('/\\\\(\d+?)/is', '', $link);
      $found = 1;
   }
} 
Тут я вообще мало что понял... :) весь код из файла приводить не стал...
1. $found - переменная нигде в коде не объявлена. Т.е. если это не глобальная переменная, то условие не сработает.
2. link - Если условие не срабатывает, то переменная link становится не объявленной и ошибка будет дальше по коду.

Warning: fopen(\debmes/2015-03-23.log): failed to open stream: No such file or directory in \lib\general.class.php on line 139

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

/**
* Loads file
*
*
* @param string File name
* @return file content
* @access public
*/
function LoadFile($filename)
{
   // loading file
   $f = fopen("$filename", "r");
   $data = "";
   $fsize = filesize($filename);
   
   if ($f && $fsize>0)
   {
      $data = fread($f, $fsize);
      fclose($f);
   }
   
   return $data;
} 
Как говорится по тексту:
1. $f = fopen("$filename", "r"); - нет проверки на то, что файл можно прочитать.
2. $fsize = filesize($filename); - Если мы не можем открыть файл, то зачем тогда пытаемся узнать его размер?
3. Условие конечно хорошо,но см. п2.
4. Комментарии phpDoc над функцией - если пишете такие комментарии, то пожалуйста следите за их соответствию коду. Т.к. @return file означает что функция вернет файл. А функция на самом деле возвращает строку. И у меня IDE яростно подчеркивает это в функции ошибка. На работоспособность кода это конечно не влияет, но за державу обидно :)
Предлагаю заменить хотя бы на такой вариант:

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

/**
* Loads file
*
* @param string File name
* @return string content
* @access public
*/
function LoadFile($filename)
{
   $data = "";
   
   $f = fopen($filename, "rb");
   if (!$f) return $data;
   
   $fsize = filesize($filename);
   
   if ($fsize > 0)
      $data = fread($f, $fsize);

   fclose($f);
   
   return $data;
}
За это сообщение автора LutsenkoDenis поблагодарил:
Bagir (Ср мар 25, 2015 4:28 pm)
Рейтинг: 1.16%
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
Аватара пользователя
AHgpeu
Сообщения: 117
Зарегистрирован: Чт мар 12, 2015 11:46 am
Благодарил (а): 26 раз
Поблагодарили: 16 раз

Re: PHP код

Сообщение AHgpeu » Ср мар 25, 2015 1:25 pm

LutsenkoDenis, на мой взгляд проще выключить нойсы. в коде такое огромное количество переменных, создаваемых "на лету", что отлавливать их просто нереально.
и для РНР это абсолютно нормально
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: PHP код

Сообщение LutsenkoDenis » Ср мар 25, 2015 2:19 pm

AHgpeu писал(а):LutsenkoDenis, на мой взгляд проще выключить нойсы. в коде такое огромное количество переменных, создаваемых "на лету", что отлавливать их просто нереально.
и для РНР это абсолютно нормально
Ну, то что проще выключить - это понятно. И на какие-то нойсы я даже согласен забить, но например в условии ниже переменная $param_str может быть не объявленной. И после условия эта переменная используется. А это может повлечь за собой какую-нибудь ошибку.

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

if ($md != $this->name)
   $param_str = $this->saveParams();
elseif (IsSet($this->owner))
   $param_str = $this->owner->saveParams();
Т.е. я хочу сказать, что это может вызвать серьезные последствия.
Например нужно удалить файл в линуксе. В переменную заносится имя файла.
команда на удаление например такая rm -rf /var/www/majordomo/file.txt
Если в переменной будет пусто и не будет на это никакой проверки, то команда получится уже вот такая: rm -rf /var/www/majordomo/, которая собственно удалит majordomo

Даже если переменная создана "на лету", то внутри функции эта переменная как бы уже постоянная и над ней можно сделать проверку.

Или я находил в коде функцию которая должна возвращать какое-то значение. Но условие написано так, что функция ничего не возвращает. Ну понятно что php не компилируемый язык, и как бы пофиг. Но при использовании такой функции тоже возникнут ошибки, что не хорошо.

Так что лучше проверять по возможности.
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
Ответить