无法使用 Smarty 从 PHP 代码创建 TPL 函数

Posted

技术标签:

【中文标题】无法使用 Smarty 从 PHP 代码创建 TPL 函数【英文标题】:Can't create TPL Function from PHP Code using Smarty 【发布时间】:2015-12-21 17:36:17 【问题描述】:

我创建了一个函数来运行 SQL 查询,输出数据,这看起来很好,问题是我现在不能用它做任何事情,因为我不能使输出到模板工作。

php 代码:

 function getCategories() 
    try 
        foreach($this->pdo->query("SELECT categories.cat_id, categories.cat_name, categories.cat_description FROM categories") as $row) 
            $rows[] = $row;
        
     catch(PDOException $e) 
        print "Error!:" . $e->getMessage();
        return false;
    
    return $rows;
    $smarty = new Smarty();
    $smarty->assign('categories', $rows);

简单地返回这个:

return $rows; 替换为return $smarty->assign('categories', $rows); 只会呈现一个空白页面。

我在模板中使用这个:$categories.cat_name

谁能帮我解决这个问题?

我正在尝试使用 Smarty 重写一个易受攻击的蹩脚论坛脚本,因此它是一个值得尝试开发脚本的基础。它实际上只是我尝试使用 Smarty 重写的类别、主题和登录/注册系统 atm。

【问题讨论】:

你能告诉我们你想在哪里使用分类的html吗? HTML 与此事无关,因为 Smarty 必须声明该变量才能使其正常工作...您应该使用 "$smarty->assign('categories', $rows);"分配 $categories。变量,然后在(点)之后添加其余部分,以便 Smarty 从该行中提取信息。 Smarty 的做法与 PHP 本身不同。 php 是唯一与此相关的问题.. 【参考方案1】:

问题是您创建了一个新的 smarty 对象,为它分配了一个变量,但没有使用它来显示您的模板 - 所以这个对象会丢失。

我建议像这样将 Smarty 对象传递给您的函数:

function getCategories(&$smarty) 
    $rows = array();
    if($result = $this->pdo->query("SELECT categories.cat_id, categories.cat_name, categories.cat_description FROM categories")) 
        $rows = $result->fetchAll();
    
    $smarty->assign('categories', $rows);

通过这种方式,对象引用将被传递给函数 - 您将能够分配您想要的任何变量,而无需返回它。只需确保发送用于渲染模板的 Smarty 对象即可。

【讨论】:

好的,但我将如何实际运行查询并返回结果以使其正常工作?因为我实际上无法完成这项工作..我之前尝试过,但找不到任何现有的代码或示例,说明如何执行 SQL 查询并将其输出到除捕获之外的行,最后我结束了使用我现有的代码不起作用......因为如果我这样做:i.imgur.com/FIWlM73.png 那么我最终会得到i.imgur.com/VuEVH4j.png & 如果我尝试 $sql = query 那么我得到一个变量的 $sql 错误,我想无论如何都要使用 PDO... 您使用了错误的 PDO - 您应该获取结果以获取数组。 PDO::query 返回一个PDOStatement 对象,例如需要用PDOStatement::fetchAll 获取。我更新了我的答案,以给出正确使用 PDO 的示例。 太棒了!我以为它终于可以工作了。 & 然后i.imgur.com/nXI9NfQ.pngS 第 51 行:'code' if($result = $this->pdo->query->("SELECT categories.cat_id, categories.cat_name, categories.cat_description FROM categories")) 你能用你的新代码更新你的问题,看看语法错误是从哪里来的吗? 更新后的代码与上面相同。i.imgur.com/BYxVwm4.png 语法错误来自我上面列出的第 51 行。

以上是关于无法使用 Smarty 从 PHP 代码创建 TPL 函数的主要内容,如果未能解决你的问题,请参考以下文章

Smarty:无法识别继续标签

PHP - Smarty 模板 - 如何创建与上下文无关的模板

使用smarty需要修改php配置么

smarty 模板怎样使用php标签

在 Smarty tpl 文件中使用 PHP 代码

Smarty基础