【问题标题】:CodeIgniter: Passing variables via URL - alternatives to using GETCodeIgniter:通过 URL 传递变量 - 使用 GET 的替代方法
【发布时间】:2011-02-13 07:29:56
【问题描述】:

我是 CodeIgniter 的新手,刚刚发现使用 GET 方法通过 URL 传递变量的困难(例如 domain.com/page.php?var1=1&var2=2)。

我收集到一种方法是在 URI 段中传递变量,但还没有完全弄清楚如何做到这一点,因为它似乎创建了在控制器中具有名为特定 URI 段的函数的期望? ???

无论如何,我决定不使用 GET,而是通过使用隐藏输入字段中的变量调整提交按钮(伪装成链接)来使用 POST。我创建了以下似乎工作正常的解决方案,但我想知道我是否在正确的轨道上,或者是否有更简单的方法通过 CodeIgniter 中的链接传递变量?

我在 application/libraries/ 中创建了以下类

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class C_variables {

function variables_via_link($action, $link_text, $style, $link_data) {
    $attributes = array('style' => 'margin:0; padding:0; display: inline;');
    echo form_open($action, $attributes);
    $attributes = array('class' => $style, 'name' => 'link');
    echo form_submit($attributes, $link_text);
    foreach ($link_data as $key => $value){
        echo form_hidden($key, $value);
    }
    echo form_close();
 }
}
?>

使用以下 CSS:

/* 
SUBMIT BUTTON AS LINK
adapted from thread: http://forums.digitalpoint.com/showthread.php?t=403667
Cross browser support (apparently).
*/
.submit_as_link {
background: transparent;
border-top: 0;
border-right: 0;
border-bottom: 1px solid #00F;
border-left: 0;
color: #00F;
display: inline;
margin: 0;
padding: 0;
    cursor: hand /* Added to show hand when hovering */
}

*:first-child+html .submit_as_link {  /* hack needed for IE 7 */
border-bottom: 0;
text-decoration: underline;
}

* html .submit_as_link {    /* hack needed for IE 5/6 */
border-bottom: 0;
text-decoration: underline;
}

然后在 VIEW 中使用以下代码创建链接:

<?php
$link = new C_variables;
$link_data=array('var1' => 1, 'var2' => 2);
$link ->variables_via_link('destination_page', 'here is a link!', 
'submit_as_link', $link_data);
?>

感谢您的帮助...

【问题讨论】:

    标签: url codeigniter variables get


    【解决方案1】:

    说实话,创建一个表单来执行超链接的工作有点语义上的不。

    默认情况下,Codeigniter 会完全去除任何 $_GET 参数。因此,如果不在配置中启用查询字符串,您将无法执行以下操作:

    http://my-domain.com/script/?param=1&param2=foo

    对于初学者来说,基于分段的 URL 有点学习曲线,但很快就会变得有意义。 Stack Overflow 是基于分段的 URL 在实践中如何工作的一个很好的生产示例!

    因此,如果您想在 codeigniter 中复制 Stack Overflow 的问题视图页面,并使用以下 URL:

    例如; http://stackoverflow.com/questions/2728978/codeigniter-passing-variables-via-url-alternatives-to-using-get

    在您的默认控制器中创建以下方法:

    public function questions()
    {
      $question_id = $this->uri->segment(2);
    
      // now do something with our question_id
    }
    

    第三段(问题标题段)实际上被忽略了。但你可以通过以下方式抓住它:

    $question_title = $this->uri->segment(3);
    

    更多信息here

    如果您不喜欢在控制器中使用第一个 URI 段命名方法的想法。您可以在路由配置中创建自定义路由。

    因此,假设您创建了一个名为 questions_controller.php 的控制器,并有一个名为 show_question_by_id() 的方法。要保留 /questions/1234/some-text-here 样式的 URI,但使用上面的控制器/方法处理它,您可以创建以下路由:

    $route['question/(:num)'] = "questions_controller/show_question_by_id/$1";
    

    更多信息here

    如果您希望在 URL 中包含无限数量的参数,或者不知道需要哪些参数,例如mysite.com/my_page/param1/12/param2/foo/param3/bar/param4/baz/another-param/xyz-123

    您可以使用$this-&gt;uri-&gt;uri_to_assoc(1) URI 方法将它们拆分为关联数组,以获得以下信息:

      [array]
    (
        'param1' => '12'
        'param2' => 'foo'
        'param3' => 'bar'
        'param3' => 'baz'
        'another-param' => 'xyz-123'
    )
    

    然后您可以像使用 $_GET 数组一样处理这个问题。然后,您可以将此方法与自定义路由相结合,为您提供几乎任何您喜欢的 URI 和应用程序结构。您还可以获得自动清理每个参数和段的好处。这是一个学习曲线,一开始看起来像是额外的工作,但实际上非常灵活,可以帮助您构建结构良好的应用程序。

    【讨论】:

    • 谢谢,这是我一直在寻找的帮助,尽管我认为正确使用 URI 段可能需要一些时间。
    • 这是一个很好的学术解决方案。但 twitter、ebay 等继续使用 get。 get 也是一个标准(是的,实际上它是 HTTP 协议!)。因此,所有这些讨论都是没有意义的。 Codeigniter 不支持 HTTP GET 动词,这使得框架有些不可用,给出了一个 http 框架的事实。很好的解决方案,但不适用于网络。
    【解决方案2】:

    如果您正在为查询字符串而苦苦挣扎,为什么要发布您的 CSS?

    疯狂。

    无论如何,您可以在 CodeIgniter 中以多种方式重新创建对查询字符串的访问。

    uri_to_assoc()

    首先是美妙的关联 URI 段。

    示例网址:http://example.com/controller/method/name/value/name2/value2

    您可以使用以下代码来访问这两个值:

    $get = $this->uri->uri_to_assoc();
    echo $get['name']; // value
    echo $get['name2']; // value2
    

    这当然是查询字符串的替代品,但如果你可以使用它,那就去做吧。

    parse_str()

    如果您有钩子或MY_Controller 之类的全局代码,您可以使用以下单行代码重新填充 $_GET:

    parse_str($_SERVER['QUERY_STRING', $_GET');
    

    REQUEST_URI

    将您的 $config['uri_protocol'] 设置为“REQUEST_URI”并进一步启用查询字符串。 REQUEST_URI 不会在所有服务器上工作,所以这不是最完美的方法,尽管它是最简单的。

    【讨论】:

    • 感谢您的帮助,尽管我看不出您的“疯狂”评论来自哪里?!?我的帖子是关于设置提交框以显示为链接的样式,包含 CSS 似乎相当明智......我们中的一些人可能在编码方面经验不足,但不一定是疯了......
    • 样式化提交框?您确定您在正确的问答网站上吗?
    • 冷静下来,约翰,只是有一点乐趣。这个帖子有帮助吗?
    • @JohnDurrant 应该感谢 Phil Sturgeon 回答了你的问题 :) 不要抱怨他的有趣言论。
    • 大声笑。经典的菲尔鲟鱼。
    【解决方案3】:

    我使用它并且它有效:

    首先您将变量放入查询字符串中,如下所示:

    redirect('mycontroler/senddata/'.$name.'/'.$email);
    

    在 mycontroler 中我以这种方式接收参数:

    public function senddata($name,$email)
    {}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 2012-11-29
      • 1970-01-01
      相关资源
      最近更新 更多