Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Странно работает Eval в скрипте
Покинул форум
Сообщений всего: 8
Дата рег-ции: Апр. 2014
Помог: 0 раз(а)
Здравствуйте, Недели 2 назад написал своего рода модуль в котором использовалась функция EVAL- она строку конвертирует в bool т.к там используются сравнения(реализация редактируемых фильтров), который тогда работал на ура , я был рад и все такое, и продолжил писать другие фишки к своей системе. сегодня решил запустить этот модуль снова , и тут такая странная вещ выходит -
(сразу предупреждаю - это не сайт и вообще не ресурс для коллективного пользования так-што взлома быть неможет, - прога на локалхосте предназначена для конектов и парсинга других серверов в инете. т.к на других языках не умею )
Строчка кода исполняемая подставляемый фрагмент сравнения из БД:
($this->actManager($o,'ALG-current-actno')!=2) and ($this->actManager($o,'ALG-current-actno')!=1) and $this->search($body,"Тут строка обрабатываемая $this->search")
Тобиш все в норме, но на выводе вижу следующее:
Parse error: syntax error, unexpected T_STRING in Z:\home\HOST_NAME\www\controler.php(325) : eval()'d code on line 1
В ходе дебагов и иследований , я просто пребывал в шоковом состояние и путем медитаций пытался успокоиться, обнаружил что при некоторых манипуляциях , менял амперсанды на AND и обратно, менял переменные в функциях на просто строки,Вырезал все -сохранял -вставлял обратно, вообщем что я тока не делал, незнаю почему но в итоге запись сравнения остаеться такая-же по синтаксису , но вот незадача EVAl работает ,
починил ТАКИМ вот НЕПОНЯТНЫМ способом уже 2 фильтра, осталось 8 , так самое главное что те что я починил я даже сломать немогу -потому как незнаю почему они не работали???? я в шоке народ, может кто с такой ахенейю сталкивался? (Добавление)
Заметил еще одно, заменяя AND на && ошибка преобретает такой вид)
Parse error: syntax error, unexpected T_VARIABLE in Z:\home\HOSTNAME\www\controler.php(325) : eval()'d code on line 1
OrmaJever
Отправлено: 06 Апреля, 2014 - 11:31:53
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
функция eval это сущий ад за которую нужно убивать. Конвертация в булеан это
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Lexus277
Отправлено: 06 Апреля, 2014 - 11:40:58
Новичок
Покинул форум
Сообщений всего: 8
Дата рег-ции: Апр. 2014
Помог: 0 раз(а)
явное указание типа данных не поможет, т.к
Она в данном случае строку не воспринимает , так как она есть , а выдает ошибку синтаксическую. я знаю, и меня предупреждали уже, но хранить условия фильтра в коде и постоянно открывать файл я не хотел, я создал таблицу в бд и все условия запихал туда , но тут же нужна подстановка после извлечения записи из БД , помог EVAL , но сейчас эта штука просто смеется на до мной, добавлю то что такую-же операцию пробовал выполнить в отдельном файле вне системы, чисто для проверки EVAl все работает ровно.
Ад не то слово. (Добавление)
мне EVAL нужен , для подстановки значения переменных в условие, а после уже выполнить сравнение на уровне PHP кода там пхп сам укажет строке тип такой какой надо, буквально 2 недели назад все нормально было.
OrmaJever
Отправлено: 06 Апреля, 2014 - 11:51:02
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
вы в бд храните php код? Это в корне не верный подход. Не нужно тут доказывать что вам нужен eval и без него никак. Я как опытный человек могу рассказать что у вас просто проблема с архитектурой кода. Лучше исправить архитектуру чем eval поверьте.
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Lexus277
Отправлено: 06 Апреля, 2014 - 12:08:29
Новичок
Покинул форум
Сообщений всего: 8
Дата рег-ции: Апр. 2014
Помог: 0 раз(а)
я понимаю то что вы опытный человек в этом деле, извеняюсь , но дело в том что я даже не знаю чем заменить eval.
добавлю еще только что изменить строчку
и работает, тоесть как и было , я так и непонел что за бага была. (Добавление) охринеть но со стороны может смотрется будто такого и быть немогло
OrmaJever
Отправлено: 06 Апреля, 2014 - 12:16:24
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
Lexus277 пишет:
но дело в том что я даже не знаю чем заменить eval.
ну вот расскажите задачу, я вам помогу.
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Lexus277
Отправлено: 06 Апреля, 2014 - 14:20:21
Новичок
Покинул форум
Сообщений всего: 8
Дата рег-ции: Апр. 2014
Помог: 0 раз(а)
мне нужно хранить строки сравнения (Вне скрипта) в которых содержаться переменные, для последующей подстановки их значений в скрипте, чтобы в итоге получилась адекватная булева FALSE или TRUE в зависимости от значения переменных , в данном случае это тело письма или его тема, чтобы в скрипте подставить в IF(СЮДА)...
Проблему я решил так-же непонятно , как она и появилась (Вырезаю (CTRL-X) кусочек сравнения например 1 критерию которую подозреваю, запускаю фильтр и ОК(работает) затем возвращаюсь и вставляю (CTRL-V) кусочек обратно и нечего не меняется(все работает) , где логика то?), поэтому я не контролирую ситуации и скорее всего такая проблема может возникнуть и еще раз обратно-же по непонятным причинам в неудобное время. надо чтото менять, А может быть в БД строки как-то изменились(ну там побайтово)? ну там заместо англ о стала русс о поэтому не видно глазом и очевидно не ясно было (я выводил(ECHO) строчку (STRING) сравнения сразу до EVAL, и недоумевал ведь все нормально) , причина не ясна. что скажете? (Добавление)
Это функция в кратце, выполняющая перебор фильтров, так-же в нем есть и другие структуры реализуемые с помощью EVAL но они работали
$o это обьект полей заголовков письма полученый из IMAP
а $body это отдельно вызываемое тело от сообщения если Тема сообщения совпала с activeIf, чтобы не нагружать скрипт и канал связи лишний раз
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
Lexus277 пишет:
мне нужно хранить строки сравнения (Вне скрипта) в которых содержаться переменные, для последующей подстановки их значений в скрипте, чтобы в итоге получилась адекватная булева FALSE или TRUE в зависимости от значения переменных , в данном случае это тело письма или его тема, чтобы в скрипте подставить в IF(СЮДА)...
Я из этого мало что понял, если вы с базу записываете уже извесные строки аля
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Lexus277
Отправлено: 06 Апреля, 2014 - 15:05:40
Новичок
Покинул форум
Сообщений всего: 8
Дата рег-ции: Апр. 2014
Помог: 0 раз(а)
Результаты сравнения динамичны их незапишеш как статику в БД, т.к эти фильтры сверяют письма в ящике, а они меняются. для того чтобы решить сам конфликт с этим EVAL да простит меня бог, можно только ограничитсья условиями в самом файле скрипта, а это же неудобно
Eval по моей версии нужен был для реализации интерфейса, редактирования , создания и удаления, прямо из окна браузера, тоесть полное управление фильтрами и их содержанием
можно конечно записать условия без БД непосредственно в ФАЙЛ скрипта, естевственно я лишусь редактирования из браузера, т.к переменную в БД не положиш, а тока имя, которое только EVAL может интерпретировать. (Добавление)
$o в скрипте меняется, FiltrationDriver применяется при переборе сообщений и выполняет действие в зависимости от совпавшего УСЛОВИЯ:
я уже сам запутался в своей системе , код и вправду индусский , могу оправдываться это первый проект с НУЛЯ в прямом смысле начинал его писать когда знал тока как присвоить перенной значение , и в данный момент система содержит около 2.5к строк кода без HTML естевственно. тоесть какбы система из эксперементальной переросла в значимую.
Покинул форум
Сообщений всего: 8
Дата рег-ции: Апр. 2014
Помог: 0 раз(а)
Снова по непонятной причине появляется эта бага.
В базу записываются не строки , а имена переменных
OrmaJever пишет:
если же в бд вы записываете переменные типа
CODE (htmlphp):
скопировать код в буфер обмена
$var1 == $var2
то зачем и откуда они возьмутся при выводе из бд?
они беруться из текущего письма(текущей итерации) $o == текущий объект заголовков письма , тема, отправитель , имя, дата и кодировка..
$body == тело письма.
вспомогательные функции:
Search($input,$criteries);
OrmaJever
Отправлено: 06 Апреля, 2014 - 17:38:29
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
Lexus277 пишет:
они беруться из текущего письма(текущей итерации) $o == текущий объект заголовков письма , тема, отправитель , имя, дата и кодировка..
$body == тело письма.
дак в чём проблема их сравнивать в скрипте? Вы же всегда знаете их имена
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Lexus277
Отправлено: 06 Апреля, 2014 - 18:02:27
Новичок
Покинул форум
Сообщений всего: 8
Дата рег-ции: Апр. 2014
Помог: 0 раз(а)
Я заметил такую вещь уже конкретно: когда в строке нету логических операторов все нормально, в чем проблема может быть?
Если используется 2 Амперсанда(&&) как оператор "И"
$this->search($body,'Выезд в 7')&&$this->actManager($o,'ALG-current-actno')!=1
То вот такая ошибка:
Parse error: syntax error, unexpected T_VARIABLE in Z:\home\hostname\www\controler.php(324) : eval()'d code on line 1
еще в этом случае если
$this->search($body,'Выезд в 7') AND $this->actManager($o,'ALG-current-actno')!=1
то ошибка такая:
Parse error: syntax error, unexpected T_STRING in Z:\home\hostname\www\controler.php(324) : eval()'d code on line 1 (Добавление)
проблема в том что хочеться это все дело сделать в окне браузера и создавать новые фильтры когда захочется , так-же была идея садить за пульт блонду, поэтому нужно было упростить чтобы не в файл лазать 20 фильтров смотреть , а селектать из БД и выводить в удобночитаемом формате, и редактировать эти фильтры достаточно быстро , для гибкой подстройки критериев, т.к критерии фильтра сразу не поймеш, что человек напишет в сообщении непонятно - поэтому стало необходимо быстрое редактирование, для быстрого пополнения условий (вт.ч критерий) фильтра, пополнять нужно для того чтобы скрипт мог понимать приблизительно чего хочет человек в письме и отвечать ему автоматом, в след чего это все посадится на JS с автоовызовом функции запуска фильтра если определенное время прошло если комп включен
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.