将变量传递到PHP eval()函数中

6

我正在使用php eval()函数,以下是我的语句:

$uid = 8;
$str = 'SELECT COUNT(*) FROM uchome_blog WHERE uid=$uid';
eval("\$str = \"$str\"");
die("$str");
//$query = $_SGLOBAL['db']->query($str);
//$result = $_SGLOBAL['db']->fetch_array($query);

输出结果为:SELECT COUNT(*) FROM uchome_blog WHERE uid=$uid。 也就是说变量$uid没有传递进来。 如何将一个变量传递到计算后的字符串中。 谢谢。

2
WTF?你为什么需要eval?只需在赋值语句中放置双引号,然后忘记eval即可。 - Carlos Campderrós
可能这只是一个简单的例子,兄弟。 - WonderLand
注意:eval() 语言结构非常危险,因为它允许执行任意的 PHP 代码。因此,不建议使用它。如果您仔细验证后发现没有其他选择而必须使用此结构,请特别注意在没有适当验证之前不要传递任何用户提供的数据给它。 - Burhan Kashour
5个回答

4
根据php手册:http://php.net/manual/zh/function.eval.php

代码将在调用eval()的代码范围内执行。因此,定义或更改在eval()调用中的任何变量将在其终止后仍可见。

所以,如果您需要的变量在调用eval()的范围内定义,那么一切都应该正常工作。

3

你不能直接将变量插入到单引号字符串中。尝试使用以下方法:

$str = "SELECT COUNT(*) FROM uchome_blog WHERE uid=$uid"; // double-quotet

或者这样:
$str = 'SELECT COUNT(*) FROM uchome_blog WHERE uid='.$uid; // string-concatenation

1

变量替换仅适用于双引号字符串。

试试这个:

$uid = 8;
$str = "SELECT COUNT(*) FROM uchome_blog WHERE uid=$uid"; # variable gets substituted here
eval("\$str = \"$str\"");
die("$str");

我认为变量替换是在解析时发生的 - 它不是递归做的,所以在您的eval中,将$str的内容粘贴到字符串中,但这不会针对$str内部的$uid的内容再次执行。


1
你缺少一个分号。 试试这个:
eval("\$str = \"$str\";");

1
你可以使用这个工具,但它没有意义,而且对于使用 eval 来说逻辑是错误的。 示例1:
<?php
  $uid = 8;
  $OUTPUT = '<?php $str = "SELECT COUNT(*) FROM uchome_blog WHERE uid=$uid"; ?>';

  eval(" ?> $OUTPUT <?php ");
  echo $str;
  exit;
?>

例子2:

<?php
  $uid = 8;
  $str = '<?php $str = "SELECT COUNT(*) FROM uchome_blog WHERE uid=$uid"; ?>';

  eval(" ?> $str <?php ");
  echo $str;
  exit;
?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接