#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. Интересно. Я попробую это сделать.