1

我花了一个小时左右试图找出这个错误。在我看来它是正确的,但我到目前为止还不是专家。所以我想我会问专家!我不断收到此错误:

解析错误:语法错误,意外的 '' (T_ENCAPSED_AND_WHITESPACE),期待标识符 (T_STRING) 或变量 (T_VARIABLE) 或数字 (T_NUM_STRING) 在 ... 第 29 行

从这行代码:

eval("$var_value = $_REQUEST['{$value}']");

这是它周围的代码..

function save_edits($var_name, $var_value)
{
    eval("{$var_name} = sql_safe({$var_value});");
    eval("mysql_query(\"UPDATE settings set {$var_name}='{$var_value}' where variable='{$var_name}'\") or die(mysql_error());");
}     
foreach ($_REQUEST as $key => $value)
{
    eval("$var_value = $_REQUEST['{$value}']");
    save_edits($value, $var_value);
}
4

2 回答 2

11

缺少一个]is 出现:

eval("$var_value = $_REQUEST['{$key}\'");
                                     ^^

还缺少一个)

eval("{$var_name} = sql_safe({$var_value};");
                                        ^^

但是,您应该避免eval付出很多代价,尤其是使用$_REQUESTs (暗示用户输入)。就目前而言,此查询将对您的网站有害:

http://your-site.com/?foo='];exec('rm%20*.*');

那么如何重构:

function save_edits($var_name, $var_value)
{
    $clean_name = mysql_real_escape_string($var_name);
    $clean_value = mysql_real_escape_string($var_value);
    $sql = "UPDATE settings "
        .= "SET    value = '{$clean_value}' "
        .= "WHERE  variable = '{$clean_name}'";
    mysql_query($sql) or die(mysql_error());
}     
foreach ($_REQUEST as $key => $value)
{
    save_edits($key, $value);
}

但是,您应该真正考虑使用:

CREATE TABLE settings
(
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  value VARCHAR(255)
);

然后,您可以清理名称和值字段。您可能还想研究使用PDO来更好地防止漏洞利用。

于 2012-12-19T15:08:10.460 回答
1

最大的问题是你的eval字符串评估产生了无意义的代码。尝试:

echo "$var_value = $_REQUEST['{$value}']";

查看该字符串中的变量是如何被插值的以及结果是什么。就是试图成为evald 以及产生语法错误的原因。

总的来说,再次:这是我一段时间以来见过的最可怕的代码。忘掉它。忘记eval存在。把它扔掉。白手起家。

于 2012-12-19T15:22:20.583 回答