【问题标题】:Changing uri when using get variable in codeigniter在 codeigniter 中使用 get 变量时更改 uri
【发布时间】:2013-05-16 11:41:38
【问题描述】:

我刚刚开始学习 Codeignitor。我正在开发一个 Web 应用程序,我在其中使用 get variable ,并从数据库加载数据并显示它。 所以我的网址看起来像:

http://localhost/abc/book/?isbn=123456

我希望我的网址看起来像

http://localhost/abc/book/123456

我认为借助 URI 库和 URI 段可以轻松完成,但我必须严格使用 GET METHOD。请提出解决方案,以便使用 GET 方法获得上述 URL。

下面是我的控制器的 book 方法:

public function book()
{
    $slug = $this->input->get('isbn',TRUE);
    if($slug == FALSE)
    {
        $this->load->view('books/error2');
    }
    else
    {
        $data['book'] = $this->books_model->get_book($slug);

        if (empty($data['book'])) 
        {
            $data['isbn'] = $slug;
            $this->load->view('books/error',$data);
        }
        else
        {
        $data['title'] = $data['book']['title'];
        $this->load->view('templates/header',$data);
        $this->load->view('books/view',$data);
        $this->load->view('templates/footer');
        }
    }
}

【问题讨论】:

  • 你的意思是说你应该得到这个值:123456只能使用get方法但是你的URL不应该包含query string!也应该像传递参数一样传递该值???
  • 实际上给了我一个问题陈述,其中指出:“页面 URL 应该是这样的 localhost/abc/book{{ isbn number }} 示例:localhost/abc/book/92384533 isbn number is a GET variable 。适当的配置应该是为 GET var 制作。获取 isbn 编号并显示所有书籍详细信息,包括与该 isbn 编号对应的书籍图像。现在我有点困惑,这里的 GET 变量到底是什么。上面发布的问题是基于我对这个问题陈述的理解。
  • Rite...我正确地回答了您的问题...!我正在努力……

标签: php codeigniter web-applications


【解决方案1】:

如果您的唯一目的是不必更改 html 表单,为什么我们不编写一个小包装器?

对于这个小技巧,您只需要一条正确的路线。

class book extends MY_Controller{

    public function __construct()
    {

        parent::__construct();
        // If the isbn GET Parameter is passed to the Request 
        if($this->input->get('isbn'))
        {
            // Load the URL helper in order to make the 
            // redirect function available
            $this->load->helper('url');

            // We redirect to our slugify method (see the route) with the 
            // value of the GET Parameter
            redirect('book/' . $this->input->get('isbn'));
        }

    }

    public function slugify($isbn)
    {
        echo "Put your stuff here but from now on work with segments";
    }

}

现在的路线

$route['book/(:any)'] = "book/slugify/$1";

无论何时http://example.com/book/?isb=4783

它将路由到http://example.com/book/4783

GET 参数被传递给我们的 slugify 方法,然后您可以在其中使用 URI 段。无需触摸 HTML 表单。

如果你坚持在你的脚本中处理 GET 参数,这当然行不通。

【讨论】:

  • 简单明了!我正在尝试使用.htaccess 来实现这一目标,但仍然让我头疼!
  • 谢谢 :) 如果您将构造函数代码重新定位到钩子中,效率会更高。因此,您可以一次覆盖所有控制器,并且不需要我目前拥有的那种讨厌的开销 :)
  • 这就是我想要的。非常感谢!
  • 它抛出一个错误:“调用未定义的函数重定向()”我认为如果用户输入让说 456 那么它试图重定向到不可用的函数“book/456”,它引发错误。正如你所说,我已经正确配置了 routes.php。
  • 你需要加载 url helper。我总是自动加载 url 帮助程序,因此我忘了在这里手动加载它:) 我只会编辑我的帖子。
【解决方案2】:

也许我遗漏了一些东西,但是您可以使用 get 方法使用 URI 段将参数传递给您的函数:

public function book($slug)
{
    if($slug == FALSE)
    {
        $this->load->view('books/error2');
    }
    else
    {
        $data['book'] = $this->books_model->get_book($slug);

        if (empty($data['book'])) 
        {
            $data['isbn'] = $slug;
            $this->load->view('books/error',$data);
        }
        else
        {
        $data['title'] = $data['book']['title'];
        $this->load->view('templates/header',$data);
        $this->load->view('books/view',$data);
        $this->load->view('templates/footer');
        }
    }
}

CodeIgniter User Guide中所述:

如果您的 URI 包含两个以上的段,它们将作为参数传递给您的函数。

例如,假设您有一个这样的 URI:

example.com/index.php/products/shoes/sandals/123

您的函数将传递 URI 段 3 和 4(“凉鞋”和“123”):

<?php
class Products extends CI_Controller {

    public function shoes($sandals, $id)
    {
        echo $sandals;
        echo $id;
    }
}
?> 

【讨论】:

  • 对不起,我有点困惑,就像我有一个表单,用户可以在其中输入一个 get 变量 "isbn" ,然后将其重定向到该控制器的方法手册,然后再重定向到该部分的其余部分。如果我将使用您建议的方法,那么我将如何获取“isbn”的值,即获取通过表单提交的变量。
  • 我明白你在说什么。看起来@Thomas David Plat 的答案符合您的要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 2016-10-05
相关资源
最近更新 更多