【问题标题】:Eval code doesn't work评估代码不起作用
【发布时间】:2012-09-10 10:24:23
【问题描述】:

我尝试制作 e eval 代码,但出了点问题,我找不到错误。

我有这个:

解析错误:语法错误,/Applications/XAMPP/xamppfiles/htdocs/classes/databasehandler.php(57) 中的意外 ',' : eval()'d code on line 1

代码如下:

eval("$s->bind_param('".$binds."', ".$values.");");

$BINDS ARE: ss
$VALUES ARE: 'testing','hej123'

【问题讨论】:

  • 能贴出bind_param()方法的定义吗?
  • 您不需要 eval() 来动态调用 bind_param() - 您可以即兴发挥并改用 call_user_func_array,这是一种更清洁、更可靠且更快的方法来完成此操作
  • 你不是也扩展$s吗?
  • 是mysqli的bind_param(),不是吗? docs.php.net/mysqli-stmt.bind-param

标签: php eval


【解决方案1】:

双引号由 PHP 解析,所以 eval("$s->bind_param..."); 等于 eval($s."->bind_param...');。将双引号替换为单引号,您的 EVIL 代码将起作用。

如果您确定您的值由逗号分隔,为什么不自己创建数组?

$values = explode(',',preg_replace('/[\'"]/g','',$values));

或者类似的?

【讨论】:

    【解决方案2】:

    您为什么要为此使用eval()?可以这样实现:

    $binds = 'si';
    $values = array('a string', 4609);
    $args = array($binds) + $values;
    call_user_func_array(array($s, 'bind_param'), $args);
    

    上面的代码更快(不调用新的执行上下文),更安全(变量直接传递,没有转义的假设)。

    【讨论】:

    • bind_param 不支持数组作为第二个参数。
    • @xdazz 恐怕我没有费心去查,我只是翻译了他的代码。他没有具体说明它是什么库——据我所知,它可能是自定义的。
    • 使用时 call_user_func_array(array($s, 'bind_param'), array($binds, array($values)));我有:警告:mysqli_stmt::bind_param() [mysqli-stmt.bind-param]:类型定义字符串中的元素数与/Applications/XAMPP/xamppfiles/htdocs/classes/中的绑定变量数不匹配databasehandler.php 第 60 行
    • 好吧,我们在这里假设,因为我什至不知道您是在谈论 mysqli 还是其他东西。我会以我认为应该可行的方式重写代码。
    • 也不起作用。绑定中没有数组。我不知道你为什么插入数组。当我删除 array($binds) 我又遇到了一个错误。
    【解决方案3】:

    不要使用 Eval,当然也不要用于将参数绑定到查询这样琐碎的事情!

    【讨论】:

    • 我目前的代码是这样的,也许你可以重写它比我更好:
    • 我完全同意这种观点,但是这种事情需要作为评论发布,而不是作为答案发布,除非您也可以提供建设性的替代方案。
    猜你喜欢
    • 2018-12-11
    • 2018-11-05
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 2012-02-10
    • 1970-01-01
    相关资源
    最近更新 更多