【问题标题】:Php Display While Loop From FunctionPHP 显示 While Loop From 函数
【发布时间】:2013-01-24 06:46:02
【问题描述】:

我有一个关于显示函数内容的问题,这个函数显示了一个while循环。

这是我模型中的一个函数:

function get_results($id)
{
    $stmt = "select * where ... "
    $stmt = $this->BEAR->Database->query($stmt);

    $result = '';

    while($row = mysqli_fetch_array($stmt))
    {
        $result .= '<div>';
        $result .= $row['name'];
        $result .= '</div>';
    }

    $this->BEAR->Template->setData('loop', $result, FALSE);
}

这是我的控制器:

    $BEAR->Webprofile->get_results(Template->getData('id'));

这是我的观点:

<?php echo $this->getData('loop');?>

这将毫无问题地在我的视图中显示循环。但我希望在我的模型中没有任何 HTMl,是否有这样做(因为这会导致我的模型中出现大量 HTML)。也许我可以在模型中设置数据,然后在我的视图中获取数据。

我尝试在模型函数中单独设置 while 循环,如下所示:

 while($row = mysqli_fetch_array($stmt))
    {
       $this->BEAR->Template->setData('name', $row['name']);
       $this->BEAR->Template->setData('name', $row['age']);
    }

然后调用Controller中的函数并调用每个setData,但这只是显示第一个结果而不是完整的while循环内容。

因此,我希望在我的视图中显示我的 while 循环的所有内容(使用 HTML),但希望我的函数只是获取和设置数据。这可以做到吗?任何想法或指导将不胜感激。

【问题讨论】:

  • 我不确定我是否理解,您基本上是想从您的 PHP 中获取实时 html 输出?如果是这样,AJAX 适合您。
  • 不,基本上是从我的模型中获取数据并在 while 循环中设置每一行。然后在我的模型中调用该函数并分别显示我模型中的设置行。
  • 如果您从 2 个不同的控制器调用 $model->get_results 会发生什么,然后一年后您想更改其中一个控制器的输出格式...您不能因为您是在模型中创建输出。您的模型应该只返回数据集。您的控制器应该调用 model->get_results 并将结果数据集传递给视图(模板)。在上面的示例中,您将在模型中组合视图
  • 您使用的是哪个框架?代码点火器?
  • @Matt 我明白这一点,因此我问这个问题;)我想知道一种方法来做你刚才所说的事情。 Ally我没有使用框架,本质上是我自己创建的MVC框架:)

标签: php mysql


【解决方案1】:

您需要对您的 MVC 应用一些纪律。您的模型需要返回原始数据。它应该只返回对象或数据数组。关键是一致性。

您的视图需要包含所有代码以添加您的 html 格式。拥有一个简单地调用您编写的模型函数的视图,该函数会输出一个 div 或有序列表,这会使视图的整个概念变得毫无用处。你的视图应该提供所有的 HTML 代码。

由于您使用的是 PHP,因此您可以轻松地加入和退出 HTML。

从您的模型中的类似内容开始:

function get_results($id)
{
    $stmt = "select * where ... "
    $stmt = $this->BEAR->Database->query($stmt);

    $results = array();

    while($row = mysqli_fetch_array($stmt))
    {
        $results[] = $row['name'];       
    }
    return results; 
}

从那里,您应该能够确定您的控制器应该调用此函数,并将 $results 与特定视图文件一起传递到您的视图/模板中以进行渲染。

【讨论】:

    【解决方案2】:
    function get_results($id)
    {
        $stmt = "select * where ... "
        $stmt = $this->BEAR->Database->query($stmt);
    
        $result = '';
        $result = mysqli_fetch_array($stmt);
        return $result;
    }
    

    然后在你的控制器中:

     $this->BEAR->Template->setData('loop', $model->get_results($id), FALSE);
    

    然后在你的模板中

    foreach($rows as $row){
         ....do something with each row
    }
    

    如何从模型中获取数据然后传递给模板的完整示例

    class MyController {
        function controller_showResults(){
            $model = new Model();
            $results = $model->get_results($_GET['id']);
            $this->BEAR->Template->setData('loop', $results, FALSE);
        }
    }
    

    现在视图假设模板中 setData 的第一个参数是传递给视图的变量,并且该变量是 $results

    <?php foreach($loop as $l): ?>
        <div><?php echo $l['name'] ?></div>
    <?php endforeach; ?>
    

    【讨论】:

    • 这肯定行不通,因为我没有在视图中获取数据,因为我需要使用 $this->Template->getData('loop');确定吗?
    • 让我更新我的答案,以便更好地表达我的意思
    • 感谢马特的回复,我理解那部分.. 设置数据,但 foreach 部分不需要通过使用 getter 来获取该数据... 是这样的:$this- >模板->getData('循环');谢谢你的时间:)
    • 不,这是视图 $this->BEAR->Template 我会将数据传递给视图,然后在视图中处理循环。你可以有一个严格的 HTML 视图。在这种情况下,您将在控制器中创建 html,但模型仍将仅返回数据集的数组。让我更新我的答案...
    • 看看codeigniter...您可以非常快速地设置它并很好地掌握框架如何处理从模型到视图的变量传递。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多