Вызов функции из базы данных в PHP

#php #eval

#php #eval

Вопрос:

У меня есть это требование, в котором указано, что я должен иметь сигнатуру функции в качестве значения в столбце базы данных. Итак, что мне нужно сделать, это получить это значение, которое затем вызовет функцию в коде. Например …. допустим, у меня есть столбец в базе данных с именем «Signature», который имеет значение SendMail(); . Мне нужно иметь возможность получать возвращаемое значение, а затем сохранять его в другой таблице. Проблема в том, что когда я использую функцию eval для $i[‘Signature’], функция вызывается, но я не могу получить возвращаемое значение. Что я делаю не так? Вот пример:

 $query = "SELECT signature FROM tbl WHERE id = 1 ";
$signature = mysql_query($query);
while ($i = mysql_fetch_array($signature)){
   //Here the function is being called properly but I can't get the return value.
   $email= eval($i['Signature']);
   if(mysql_num_rows($i) == 0){
      //insert the returned value into another table.
      $insertString = "INSERT INTO tbl (email) VALUES ('$email')";
   }
}

function SendMail()
{
   $email= 'Have a great day'
   return $email;
}
  

Кроме того, я обязательно получу некоторые комментарии типа «eval — это зло», поэтому, если есть лучший способ, пожалуйста, посоветуйте.

Комментарии:

1. Если вам нужно придерживаться eval, по крайней мере, сначала проверьте, действительно ли содержимое столбца подписи действительно допустимо. Возможно, через function_exists функцию: php.net/manual/en/function . function-exists.php

Ответ №1:

из документации

 eval() returns NULL unless return is called in the evaluated code, in which case the value passed to return is returned. 
  

Поэтому вы должны добавить return :

 $email= eval('return ' . $i['Signature']);
  

альтернативно:

 eval('$email = '  . $i['Signature']);
  

Комментарии:

1. Я попробую это сделать. Я только что прочитал это утверждение, но не до конца понял его.

Ответ №2:

Вам было бы лучше сохранить имя функции в виде строки в одном столбце, а аргументы для передачи функции в виде сериализованного массива в другом столбце. Тогда вы могли бы использовать call_user_func для получения возвращаемого значения из функции без использования eval()

Комментарии:

1. Интересно. Я попробую это сделать.