Как я могу сохранить условный код PHP в базе данных для последующего использования?


В нашем текущем приложении у меня есть отчет, который содержит что-то вроде:

if($foo == 3 || $bar > 3) {
    $e = someFunction();
};

Но для другого клиента это же выражение может быть:

if($foo == 3 || $bar == 5 && $foobar != 9) {
    $e = someFunction();
};

Существует ли прямой способ хранения двух разных выражений, просто

$foo == 3 || $bar > 3 OR $foo == 3 || $bar == 5

Биты в базе данных (MySQL), поэтому мне не нужно жестко кодировать все эти правила клиентом или поддерживать клиентские версии одного и того же отчета. Я пытаюсь выяснить, могу ли я установить переменную o для замены условий. Что-то вроде:

$conditions = $row_rsConditions['condition_row']    //Get $foo == 3 || $bar > 3 from the DB and store it as $conditions
if($conditions) {
    $e = someFunction();
};

Может быть > 100 разных клиентов, и у каждого клиента может/будет свой набор выражений. Я просто не уверен в правильном/лучшем способе сделать это.

ОБНОВЛЕНИЕ:

Я думаю, что понимаю проблемы, связанные с использованием функции PHP eval(). Но из-за количества возможных комбинаций я склоняюсь к использованию базы данных для хранения условий (пока не уверен в использовании eval())

Имеет ли это какое-либо значение (безопаснее), если есть нет ли пользовательского интерфейса, который записывает данные в поле/таблицу условий? Это может быть что-то, с чем мы справимся в одиночку.

Author: hakre, 2011-08-29

3 answers

Я бы очень осторожно относился к хранению логики в базе данных.

  1. ваш код больше не находится в одном месте.
  2. логика в базе данных вряд ли будет находиться под управлением исходного кода
  3. если вы измените код и нарушите всю логику, специфичную для клиента, вам придется вернуться в базу данных и отредактировать ее для каждого клиента.
  4. другие люди могут иметь доступ к базе данных и могут изменить код на что-то вредоносное.

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

Любые настраиваемые функции могут быть добавлены в качестве метода в базовый класс и переопределены для конкретной реализации клиента.

Используйте оператор switch для создания экземпляра класса на основе идентификатора или имени клиента (что-то, что не меняется), которое вы уже храните в базе данных.

switch ($client_name) {

case "abc ltd":
   $customlogic = new CustomLogicAbc();
   break;

case "zyx ltd":
   $customlogic = new CustomLogicXyz();
   break;

default: 
   $customlogic = new CustomLogicDefault();
   break;

}

if ($customlogic->doSomething($parm1, $parm2)) {
  // custom logic has been applied
}
 3
Author: bumperbox, 2011-08-29 12:14:22

Чтобы уточнить мой комментарий:

Ваш последний код почти то, что я имел в виду:

$conditions = $row_rsConditions['condition_row'];    //Get "$foo == 3 || $bar > 3"
if(eval("return (" . $conditions . ");")) {
    $e = someFunction();
}

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

Другим вариантом, который немного сложнее, но не настолько подвержен неправильному использованию, было бы кодирование условий. Поскольку кажется, что вы сравниваете только 2 переменные с значение каждого из них вы могли бы сохранить для каждой переменной примерно так:

0 !=
1 ==
2 >=
3 <=
4 >
5 <

Чтобы сохранить отношение и дополнительно сохранить значение, с которым его следует сравнивать. Таким образом, прямое выполнение кода, сохраненного в базе данных, отсутствует.

 2
Author: Nobody, 2011-08-29 12:53:48

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

 0
Author: Fivell, 2017-05-23 11:55:45