CodeIgniter URI参数部分绕过“;如果“;陈述


CodeIgniter URI Parameter is partially bypassing an "if" statement

大家好。我是社区里的新手,但对编程不太了解。让我把短篇小说带来。

我正在创建一个基于CodeIgniter Framework(2.1.4版)的小应用程序。我已经配置了整个代码,这样我就不必在URL上写"index.php"部分,而且我还将默认控制器配置为不写在URL中。我还确保每个控制器的每个方法都链接到一个视图,该视图的div能够显示错误消息,这要归功于"$this->session->flashdata()"方法。

比方说,我的默认控制器叫做"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"应该列出这个网络系统中存在的角色(如管理员、用户等),并告诉我有多少用户,按角色分类。"editar"应该让我编辑每个角色的基本方面。"usuarios"应该显示每个角色中现有的用户列表。

我对每种方法都进行了编程,它们运行得很好。这个问题依赖于在奇怪的情况下显示的该死的flash数据,特别是在"editar"answers"usuarios"方法中。

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

这就是场景:

"editar"answers"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');
}

看起来不错,对吧?问题是,当我在"roles"索引中,转到"roles/uusario/1"(这是现有数据)或"roles/editar/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';

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

我很乐意感谢任何伸出援手的人。


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

使用@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';

现在,该系统运行完美。谢谢

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

使用@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';

现在,该系统运行完美。谢谢