【问题标题】:Undefined variable on Codeigniter when try to pass data from controller尝试从控制器传递数据时 Codeigniter 上的未定义变量
【发布时间】:2019-07-15 11:44:03
【问题描述】:

我是 Codeigniter 的新手。我尝试将一些数据传递到视图中。我有这样的路线:

$route['accounts/(:any)'] = 'accounts/$1';

在我的 Account 类中,我有这样的注册功能:

public function register()
    {
        $csrf  = array(
            'name' => $this->security->get_csrf_token_name(),
            'hash' => $this->security->get_csrf_hash()
        );
        $this->load->view('partials/head');
        $this->load->view('partials/nav');
        $this->load->view('auth/register',$csrf);
        $this->load->view('partials/footer');
    }

然后在我的 register.php 中,我尝试像这样打印 $crsf:

<input type="hidden" name="<?=$csrf['name'];?>" value="<?=$csrf['hash'];?>" />

当我访问我在 compro.xyz/accounts/register 中的页面时,它给了我这个错误:

A PHP Error was encountered
Severity: Notice

Message: Undefined variable: csrf

Filename: auth/register.php

Line Number: 13

Backtrace:

File: D:\xampp\htdocs\compro\application\views\auth\register.php
Line: 13
Function: _error_handler

File: D:\xampp\htdocs\compro\application\controllers\Accounts.php
Line: 19
Function: view

File: D:\xampp\htdocs\compro\index.php
Line: 315
Function: require_once

" value="
A PHP Error was encountered
Severity: Notice

Message: Undefined variable: csrf

Filename: auth/register.php

Line Number: 13

Backtrace:

File: D:\xampp\htdocs\compro\application\views\auth\register.php
Line: 13
Function: _error_handler

File: D:\xampp\htdocs\compro\application\controllers\Accounts.php
Line: 19
Function: view

File: D:\xampp\htdocs\compro\index.php
Line: 315
Function: require_once

" />

好像我的注册机无法识别$csrf。我真的不知道是什么原因造成的,我通常使用 Twig,因为它是 Codeiginter,所以我对它了解不多。目前我正在使用最新版本。

【问题讨论】:

    标签: php codeigniter codeigniter-3


    【解决方案1】:

    $csrf 不会是视图上的变量。

    namehash 将。

    如果你想拥有$csrf,你需要这个数据数组:

    $csrf  = array(
        'csrf'=> array(
            'name' => $this->security->get_csrf_token_name(),
            'hash' => $this->security->get_csrf_hash()
        )
    );
    

    但是,如果您使用帮助器form_open,则无需将自己的输入隐藏。

    另外,您可以在视图中使用$this-&gt;security

    【讨论】:

    • 我不使用 form_open,因为我使用 Ajax 来验证和发送数据。这就是为什么我需要手动检查它。
    • 我明白了。好的,我会使用它看起来更有效。顺便说一句,如果我想验证 get_csrf_token_name() 和 get_csrf_hash() 并将它们与我刚刚在上面写的输入进行比较,对吗?
    • 你是否在配置中启用了CSFR?
    • 如果是,会自动验证。
    【解决方案2】:

    https://www.codeigniter.com/user_guide/general/views.html#adding-dynamic-data-to-the-view

    $data = array(
            'title' => 'My Title',
            'heading' => 'My Heading',
            'message' => 'My Message'
    );
    
    $this->load->view('blogview', $data);
    

    因此,您可以看到 $data 在视图中不可用,但 $title$heading$message 可用。

    同样,$csrf 不会出现在您的视图中,但 $name$hash 会出现。为清楚起见,将$csrf 重命名为$data

    $data  = array(
        'name' => $this->security->get_csrf_token_name(),
        'hash' => $this->security->get_csrf_hash()
    );
    $this->load->view('auth/register', $data);
    

    编辑 - 一种更简洁的书写和理解方式是:

    $this->load->view('auth/register', array(
       'name' => $this->security->get_csrf_token_name(),
       'hash' => $this->security->get_csrf_hash()
    ));
    

    【讨论】:

    • 现在仍然遇到同样的问题,它说未定义变量:数据
    • 传递给$this-&gt;load-&gt;view 的变量对视图永远不可用。它的 contents 被外推到新的变量中以供使用。尝试改用$name$hash
    • 还有一件事,你知道如何检查这个 csrf 是否有效吗?
    • 它应该会自动为您处理 - stackoverflow.com/questions/6244669/….
    • 您的 AJAX 表单需要将其传递给您的应用程序,但实际验证会自动发生 - 只要您发送 post 请求。
    猜你喜欢
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 2017-09-03
    相关资源
    最近更新 更多