Как я могу сохранить условную оценку PHP в базе данных для последующего использования? - PullRequest
7 голосов
/ 29 августа 2011

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

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), поэтому мне не нужно жестко кодировать все эти правила клиентом или поддерживать клиентские версии одного и того же отчета. Я пытаюсь выяснить, могу ли я установить переменную или заменить условия. Что-то вроде:

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

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

UPDATE

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

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

Ответы [ 3 ]

3 голосов
/ 29 августа 2011

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

  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
}
2 голосов
/ 29 августа 2011

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

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

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

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

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

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

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

0 голосов
/ 29 августа 2011

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

...