【问题标题】:Smarty internal errorSmarty 内部错误
【发布时间】:2013-04-05 14:46:28
【问题描述】:

查看服务器 PHP 错误日志发现,某种类型的 PHP 通知出现频率最高,这与 Smarty 有关。我发现a question 似乎描述了同样的错误,但实际上没有答案。

通知如下(有不同的变量声明为未定义):

PHP Notice:  Undefined variable: is_admin in /usr/share/php/Smarty/sysplugins/smarty_internal_data.php on line 291

我想知道如何调试这个,因为没有提供数据(如模板名称)。

下面我会给你一些代码的想法(你可以详细阅读here,因为它都是开源的)。

因此,在名为header.php 的文件中创建了一个全局 smarty 对象,并且在同一个文件中进一步设置了一些全局 smarty 变量,包括上述通知中的变量:

//init Smarty
require_once('Smarty.class.php');

$smarty = new Smarty();
...
$smarty->assign('is_admin', is_admin() ? 1 : 0);

然后通过调用$smarty->display(...) 将这个header.php 包含在需要显示一些HTML 的每个文件中。所以我假设在存在$smarty 对象的任何文件中,该对象都有一个名为is_admin 的变量。但是,似乎并非如此。

此外,关于未设置变量的“正常”Smarty 警告看起来不同:

PHP Notice:  Undefined index: sent_id in /var/www/smarty_dir/templates_c/a5aab2c66c44442365a39981ba9be18e0a1f11ad.file.history.tpl.cache.php on line 123

有什么想法吗?

更新。 我阅读了一些日志,发现当用户进入页面并获得 302 HTTP 状态时似乎会出现此类警告。这可能是由于以下代码(它位于 smarty 构造函数调用之后但变量分配之前:

//cookie check
if (!is_logged() && isset($_COOKIE['auth'])) {
    if ($user_id = check_auth_cookie()) {
        if (user_login('', '', $user_id, $_COOKIE['auth'])) {
            header("Location:".$_SERVER['REQUEST_URI']);
            return;
        }
    }
}

所以我想我应该在这个块之后移动$smarty 初始化,它可能会有所帮助。我仍然很好奇它与这个问题的关系。

【问题讨论】:

  • 在你的 header.php 中你分配了许多变量,例如is_loggedreadonlygoalsuser_permission_* 等。smarty 可以看到这些变量吗?
  • 是的,至少没有关于其他变量的类似警告。但是,$is_admin 可能是模板中使用最多的一个
  • 尝试通过简单地删除 smarty 缓存目录中的所有内容来清除 smarty 缓存。
  • 是的,已经这样做了。我们会看看这是否有帮助。
  • 好吧,这似乎没有帮助。

标签: php smarty


【解决方案1】:

我想我明白了。问题出在代码中,包括

header("Location:".$_SERVER['REQUEST_URI']);
return;

我的错误是return 在这种情况下不像exit,因为当您从required 或incuded 的文件中调用return 到另一个文件时,您只需返回控制到另一个文件。我不知道这个功能。

【讨论】:

    【解决方案2】:

    'is_admin', is_admin() 您正试图将函数 is_admin() 作为变量 {$is_admin} 分配给 Smarty 模板,在我看来,这是不可能的。

    将返回结果赋值给一个变量,即:

    $var = is_admin();
    $smarty->assign('is_admin', $var);
    

    【讨论】:

    • 错误。如果 is_admin() 则分配返回值。
    • 我不这么认为。由于括号存在,所以应该使用函数调用的结果。
    • 不,这是可能的。它将分配函数返回的值,因此与您刚刚将返回值分配给 $var 的方式相同。
    • 那么,如果声明了函数,为什么会出现未定义变量的错误?
    • assign 是否真的为$is_admin 赋值,还是在 Smarty 内部创建了一些东西?
    猜你喜欢
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多