无法使用 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 函数的主要内容,如果未能解决你的问题,请参考以下文章