【问题标题】:CodeIgniter URI Parameter is partially bypassing an "if" statementCodeIgniter URI 参数部分绕过“if”语句
【发布时间】:2015-02-25 16:37:16
【问题描述】:

亲爱的人们,美好的一天。我是社区的新手,但在编程方面并不多。让我带来短篇小说。

我正在创建一个基于 CodeIgniter 框架 (v 2.1.4) 的小应用程序。我已经配置了整个代码,因此我不必在 URL 上编写“index.php”部分,并且我还将默认控制器配置为不写在 URL 中。由于 '$this->session->flashdata()' 方法,我还确保每个控制器的每个方法都链接到一个具有 div 能够显示错误消息的视图。

所以,假设我的默认控制器名为“inicio”。为了从我的本地服务器运行它,我转到我的浏览器并在地址栏中写下以下行:

URL: http://localhost/vga/

并配置了 application/config/routes.php 这样我就可以避免不必要的写入

$route['default_controller'] = 'inicio';
$route['404_override'] = '';
$route['inicio'] = '';

我把 .htaccess 的设置放了

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php/$0 [PT,L] 

仅此而已。这会将我带到默认控制器,该控制器由会话管理器控制,它强制我填写登录表单,以便访问此页面的内部。

URL: http://localhost/vga/acceso

此登录有一个指向基本注册表单的链接,它的作用就像一个魅力。

URL: http://localhost/vga/acceso/registro

甚至还有一个配置文件控制器,可以让我查看和编辑我自己的配置文件。好东西,我什至不需要 URI 段参数,因为 ID 是由会话传递的。

除了默认控制器的配置之外,我没有触及 application/config/routes.php。到目前为止,一切都很酷。

现在,我的头疼来了。

我创建了一个新控制器来控制此页面中的“角色”。这个控制器有 3 个方法:

class Roles extends  CI_Controller {
    function index() {}
    function editar() {}
    function usuarios() {}
}

每种方法背后的基本思想都相当简单。

'index' 应该列出这个 Web 系统中存在的角色(例如 admin、user 等),并告诉我有多少用户,按角色分类。 “editar”应该让我编辑每个角色的基本方面。 “usuarios”应该让我列出每个角色中存在的用户。

我对每种方法都进行了编程,它们工作得很好。问题在于在奇怪的情况下显示的该死的 flashdata,特别是在 'editar' 和 'usuarios' 方法中。

为什么它们很特别?嗯,与其他所有方法相比,它们拥有 3 个 URI 段:控制器、方法和只有一个参数。

这是场景:

“editar”和“usuarios”都有某些共同的代码行:

/*
    I'll be trying to edit a specific numeric entry,
    and force it to be zero in case of empty segment. 
    The page should be redirected in this case.
*/
$id = $this->uri->segment(3, 0); 
if( $id == 0 ){
    $this->session->set_flashdata('message', 'Error #X' ); /* Only these controllers have this Error Code */
    redirect( 'roles' , 'refresh');
}

看起来不错,对吧?好吧,问题是,当我在“角色”索引中并转到“角色/usuario/1”(这是现有数据)或“角色/编辑器/1”(也是现有数据)时,那些页面按预期显示干净。当我在浏览器上按“刷新”或从此时转到任何页面时,问题就来了……因为在所有情况下,系统都会抛出“错误#X”消息……并且该页面未重定向,正如我在 $id = 0 的情况下所期望的那样。所以,我假设流程绕过了 if 语句,足以设置 $this->session->flashdata('message') 变量,但不足以命令重定向方法。

这里真是头疼。然后,我开始思考,尝试进一步利用application/config/routes.php这个特性,所以我设置了一些规则,文件变成了这样:

$route['default_controller'] = 'inicio';
$route['404_override'] = '';
$route['inicio'] = '';
$route['roles_usuarios/(:any)'] = 'roles/usuarios/$1';
$route['roles_editar/(:any)'] = 'roles/editar/$1';

瞧,该死的消息在奇怪的情况下停止显示,仅在我期望显示时显示(当 $this->uri->segment(3) 未插入 URL 时,或者它的值时在我的数据库中不存在,以防将其用作数据库查询的参数)。

$this->uri->segment(3) 怎么可能绕过 if 语句?

我设法发现这可能是一个路由问题,因为替换

$route['roles_usuarios/(:any)'] = 'roles/usuarios/$1';
$route['roles_editar/(:any)'] = 'roles/editar/$1';

通过

$route['roles/usuarios/(:any)'] = 'roles/usuarios/$1';
$route['roles/editar/(:any)'] = 'roles/editar/$1';

再次触发异常,我真的不想在我的网址中使用下划线。

我很乐意感谢这里的任何帮助。


更新:解决了。让我分享我的知识。

使用@AdrienXL 的指南,我设法找到了一种让 htaccess 工作的方法,其中包括在 routes.php 中明确 3 段 uri 路由的代码行,并为中的任何其他路由设置通用规则前一个角色控制器之后的角色控制器。

这些是现在的文件:

.htaccess

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

routes.php

$route['default_controller'] = 'inicio';
$route['404_override'] = '';
$route['inicio'] = '';
$route['roles/editar/(:num)'] = 'roles/editar/$1';
$route['roles/usuarios/(:num)'] = 'roles/usuarios/$1';
$route['roles/(:any)'] = 'roles/index';

现在系统可以完美运行。谢谢!

【问题讨论】:

  • 我认为这个问题是由所有 .htacess 的东西引起的。除了使用 uri->segment,您还可以尝试使用参数,例如function editar($id = 0) {} 。您的新路线也是多余的。就像 1=1
  • 我已经尝试过使用方法参数,但效果还是一样。此外,关于新路线,我尝试删除修复(删除带下划线的行),但问题仍然存在。如果您认为问题出在 .htaccess 中,您能指导我吗?
  • 忘记最后一件事,我设法解决了它。我会更新主帖。感谢您的指导,@AdrienXL!
  • 很高兴知道!我仍然对你的路线有点怀疑,但如果它有效。请在答案中写下您的解决方案并将其标记为已接受,以便您的问题在论坛中显示为已解决。写得很好,顺便说一句;)
  • 谢谢,我会照你说的做的。我只能在两天后接受我的回答。你是第一个帮助我的人,希望以后能帮到你!

标签: php codeigniter


【解决方案1】:

更新:解决了。让我分享我的知识。

使用@AdrienXL 的指南,我设法找到了一种让 htaccess 工作的方法,其中包括在 routes.php 中明确 3 段 uri 路由的代码行,并为中的任何其他路由设置通用规则前一个角色控制器之后的角色控制器。

这些是现在的文件:

.htaccess

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

routes.php

$route['default_controller'] = 'inicio';
$route['404_override'] = '';
$route['inicio'] = '';
$route['roles/editar/(:num)'] = 'roles/editar/$1';
$route['roles/usuarios/(:num)'] = 'roles/usuarios/$1';
$route['roles/(:any)'] = 'roles/index';

现在系统可以完美运行。谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 2021-11-04
    • 2017-07-04
    相关资源
    最近更新 更多