Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выполнение условия из переменной 
:(
    Опции темы
Black_leopard
Дата 19.6.2015, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 18.10.2006

Репутация: нет
Всего: нет



Всем доброго дня!

Столкнулся с задачей: В админке для определенных элементов прописывают условия отображения на сайте, необходимо чтобы эти условия выполнялись в конструкции if.

Т.е. в админке например выставили в определенном поле условие "1 > 2" (упрощенно)
Надо чтобы код правильно выполнился 

Код

$cond = "1 > 2";
                    
if ($cond)
{
    echo("TRUE");
}
else
{
    echo("FALSE");
}


В таком случае выводит true. Пробовал eval() выдает всегда false.

Подскажите, пожалуйста, как правильно переменную подставить в условие?
Спасибо.
PM MAIL   Вверх
ksnk
Дата 19.6.2015, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Black_leopard @  19.6.2015,  10:41 Найти цитируемый пост)
 в определенном поле условие "1 > 2" (упрощенно)

А неупрощено? Какие условия вообще бывают? Какой сложности, какие переменные и откуда берутся?

Для простого и тупого примера - будет работать так
Код

if(eval('return '.$cond)){
 // yes
} else {
 // no
}
 
Более быстро по скорости выполнения - пользоваться create_function. В функцию можно и параметры передать. при некоторой ловкости рук.
Оба способа имеют серьезный недостаток - если пользователь указал совсем уж корявую строку для выполнения, то вся админка свалится по ошибке компиляции. Напрочь, скорее всего вместе с редактором условия. При удачном расположении рук - локальный апокалипсис гарантирован  smile 



Это сообщение отредактировал(а) ksnk - 19.6.2015, 12:16


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ksnk
Дата 19.6.2015, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Придумался такой в меру разумный вариант
Код

function evalcode($cond,$filename='conditions.php'){
    static $conds=array();

    if(!isset($conds[$cond])){
        if(file_exists($filename))  {
            $conds=include $filename;
        }
        if(!isset($conds[$cond])){
            if(file_exists($filename)){
                $context=file_get_contents($filename);
            } else {
                $context='<?php
return [
];
';
            }
            file_put_contents(preg_replace('/\];\s*$/s',
                '"'.addslashes($cond).'"=>function(){ return '.$cond.';},
    ];
'
                ,$context),$filename);
            $conds=include $filename;
        }
        
    }
    if(!isset($conds[$cond])){
        // Oops wtf! :( 
        return null;
    } else {
        return call_user_func($conds[$cond]);
    }
};

Писался на коленке, без проверки, так что вот.
В результате, создается файл вида
Код

<?php
return [
'2>1'=>function(){return 2>1;},
...
];

В файле сами собой, магическим образом собираются все условия, которые попадаются в базе. Прелесть этого подхода, по сравнению с обычным eval'ом, кроме ужасающе серьезного ускорения, в том, что потенциально можно проверить свежесозданный файл, с помощью запуска exec('php -l <имя файла>'). После чего можно убедиться, что синтаксических ошибок нет и продолжать жить долго и счастливо. Эту проверку предлагаю дописать самостоятельно smile



Это сообщение отредактировал(а) ksnk - 19.6.2015, 13:48


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Black_leopard
Дата 19.6.2015, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 18.10.2006

Репутация: нет
Всего: нет



Спасибо, интересное решение. Сохранил, попозже разберу что к чему тут.

Пока остановился на первом предложенном варианте:

Код

if(strlen($strCondition) > 0 && (@eval("return ".$strCondition.";")))
{
   //вывод
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0561 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.