Php 将信息从一个视图传递到另一个视图

Php 将信息从一个视图传递到另一个视图,php,codeigniter,Php,Codeigniter,编辑1。 “我的数据库”中的查询结果显示在“我的视图”页面上。每个唯一结果旁边都有一个按钮: // first_view.php <?php echo form_open('controller/method'); ?> <?php foreach($results_found as $item): ?> <p><?php echo $item->name ?></p> <p><?php form_sub

编辑1。 “我的数据库”中的查询结果显示在“我的视图”页面上。每个唯一结果旁边都有一个按钮:

// first_view.php    
<?php echo form_open('controller/method'); ?>
<?php foreach($results_found as $item): ?>
<p><?php echo $item->name ?></p>
<p><?php form_submit('buy','Buy This'); ?></p>
但是,实际显示的是first_view.php上显示的最后一个结果,而不是用户选择的结果

我的问题是,如果用户单击按钮4,我如何将特定选择显示在另一个视图上

编辑结束1

原始问题

我的视图页面(CodeIgniter)以多个链接的形式显示数组的内容。如果用户单击某个链接,我希望用户被带到另一个查看页面(通过控制器),该页面提供有关该特定链接的更多信息(存储在数组中的特定位置)

我的问题是,如何在第二个视图文件中访问和显示数组中特定位置的内容,而不会在第二个视图中出现“Undefined variable error”(未定义变量错误)

以下是我试图以代码形式做的事情

// my_controller.php
$array_name['variable_name'];
$this->load->view('first_view.php');

// first_view.php
<?php foreach($variable_name as $vn): ?>
<?php echo anchor('controller_name' $vn->info ?> // if user clicks on 3rd link
<?php endforeach ?>                              // I want to beable to access
                                                 // index 2 of the array in the 
                                                 // second view file so I can 
                                                 // display more info 
// second_view.php
<?php $vn[2]->info ?>
//my_controller.php
$array_name['variable_name'];
$this->load->view('first_view.php');
//first_view.php

您可以使用URL中的参数将信息传递到第二个视图。

数组最初来自何处?我想它是来自数据库还是其他“可预测”的数据源?在这种情况下,您可以在链接到第二个页面时通过URL简单地传递对该数据的引用(例如,来自数据库的主键)。如果你没有足够的信息来做这件事,你可能需要重新考虑你的设计。让一个视图访问另一个不同视图的内容是个坏主意。当然,您可以创建视图片段(只需在其他模板中“包含”一个PHP文件),以最小化代码重复

我不熟悉CodeIgniter的工作原理,但这实际上只是一般的web开发逻辑

编辑

应该发生的是表单将自己提交给控制器。然后,您的控制器检查POST数据并决定用户从列表中所做的选择。然后它重定向到第二个控制器,在URL中传递一个参数,以便第二个控制器可以从数据库中查找该项

这是一个基本的示例,没有使用您的特定用例,只是一些语义伪代码。我希望你能跟着我来。该示例是一个虚构的多语言书店,用户在看到该语言的书籍列表之前选择一种语言。框架代码纯粹是虚构的。为了简洁起见,我省略了所有内容,包括健全性检查,因此您只能看到实现此工作流的部分:

语言选择控制器

语言选择表

现在BooksController可以实现一个视图,该视图以在上一个控制器上选择的语言显示所有书籍。为实现这一点所做的一切就是在两个控制器之间的URL中传递该语言的主键


PS:不要将会话用于此类内容。那是一个坏习惯。保持安静。

您可以随时使用会话或


您可以在显示第一页时存储数据。然后,您可以在下一个视图中检索它。

听起来您需要两个控制器和两个视图

控制器1查询数据库以获得一个事物列表。调用控制器“列表”,方法“索引”

控制器2查询数据库以获取关于一个特定事物的更多信息。调用控制器“item”,方法“detail”,第三个URL参数将是项目的名称或可以传递到数据库中的其他标识符


第三个参数提供了用于查询数据库以查找有关该书的更多信息的信息。作为控制器2的一部分完成此查询,并将数据传递给视图2

其他答案建议使用会话数据。我认为这是一种奇怪的想法,因为会话数据用于特定于用户的信息,而有关书籍的详细信息不是特定于用户的。

您要做的(在我看来)是创建表单,生成
sumbit按钮,然后关闭该表单

如果您想使用表单来表示用户想要购买什么,您必须根据结果为每一行生成表单,类似这样(它是生成的html,但您需要编辑它以满足您的需要):

编辑(伪代码不够:):




+1.这是我第一次创建一个网站,所有这些对我来说都是新的,我确信当我创建网站的时候,我会重新思考所有这些。我认为我的原始数组来自我的控制器,在我加载视图之前的一行:first_view.phpOk,假设您刚刚将这些数据硬编码到控制器中,并且没有从数据库中获取这些数据,那么第一步将是将该数组从控制器中取出并放入它自己的类,这将是一个模型类。现在,您链接到的第二个控制器可以加载同一个模型类并从中获取数据。MVC设计中的另一个一般原则。将模型逻辑置于控制器之外;)如果一分贝在等式中,它就更有意义了。谢谢你回复d11wtq。事实上,我已经将数据从数据库中取出并显示在视图中。有关更多信息,请参见编辑1。答案将根据此新信息更新。请原谅伪代码。我试图为自己和他人的利益描绘设计原则,而不是复制粘贴示例;)抱歉,我误读了您的代码块,并认为会话->集在模板中。我的错。删除了关于不在模板中设置数据的注释。其余的仍然有效。谢谢你的回复。我是新来的,但这听起来像是解决办法。好的,我已经自动加载了会话。现在,我想弄清楚的是(I)如何将数组的索引放入会话数据中,以及(ii)在何处写入(在控制器或视图中)。Th
// first_view.php    
<?php echo form_close(); ?>
// second_controller.php
$c = $this->session->userdata('choice');


// second_view.php
echo 'Your Choose: '. $c;
// my_controller.php
$array_name['variable_name'];
$this->load->view('first_view.php');

// first_view.php
<?php foreach($variable_name as $vn): ?>
<?php echo anchor('controller_name' $vn->info ?> // if user clicks on 3rd link
<?php endforeach ?>                              // I want to beable to access
                                                 // index 2 of the array in the 
                                                 // second view file so I can 
                                                 // display more info 
// second_view.php
<?php $vn[2]->info ?>
class LanguagesController ... {
  public function selectLanguage() {
    // If the user submitted the form, collect the language_id
    // and redirect to the BooksController
    if ($this->_request->get('language_id')) {
      return $this->_response->redirect(array(
        'controller' => 'BooksController',
        'action' => 'viewBooks',
        'language_id' => $this->_request->get('language_id')
      ));
    }

    $languages = Language::findAllWithBooksInStock();
    $this->_view->set('languages', $languages);
  }
}
<form method="post">
  <fieldset>
     <label for="language">Select a language</label>
     <select name="language_id" id="language">
       <?php foreach ($languages as $lang): ?>
         <option value="<?php escape($lang->id); ?>"><?php escape($lang->name); ?></option>
       <?php endforeach; ?>
     </select>
  </fieldset>
  <fieldset>
    <input type="submit" name="submit" value="Continue" />
  </fieldset>
</form>
class BooksController ... {
  public function viewBooks() {
    $language = Language::findById($this->_request->get('language_id'));
    $books = Book::findAllWithLanguage($language);

    $this->_view->set('language', $language)
                ->set('books', $books);
  }
}
<!-- repeat row times -->
<?php foreach($items as $item): ?>
<p><?php echo $item->name; //echo name ?>
  <?php form_open(/*your settings*/); ?>
  <input type="hidden" name="idToAdd" value="<?php echo $item->id;?>" />
  <input type="submit" value="Buy this" />
  </form>
</p>
<?php endforeach; ?>
<!-- end repeat -->