CodeIgniter URI参数部分绕过" if"声明

时间:2015-02-25 16:37:17

标签: php codeigniter

亲爱的人们,美好的一天。我是社区的新手,但在编程方面却不是那么多。让我讲简短的故事。

我正在基于CodeIgniter Framework(v 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'应列出此Web系统中存在的角色(例如admin,user,ect),并告诉我有多少用户,按角色分类。 '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');
}

看起来不错吧?嗯,问题是,当我在'角色'索引并转到'roles / usuario / 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->段(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';

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

1 个答案:

答案 0 :(得分: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';

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