CodeIgniter:通过URL传递变量 - 使用GET的替代方法

Joh*_*ant 10 variables url codeigniter get

我是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();
 }
}
?>
Run Code Online (Sandbox Code Playgroud)

使用以下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;
}
Run Code Online (Sandbox Code Playgroud)

然后使用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);
?>
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助...

rba*_*r86 34

说实话,创建一个表单来执行超链接的工作是一种语义,不是没有.

Codeigniter默认情况下完全剥离任何$ _GET参数.因此,如果不在配置中启用查询字符串,则无法执行以下操作:

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

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

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

public function questions()
{
  $question_id = $this->uri->segment(2);

  // now do something with our question_id
}
Run Code Online (Sandbox Code Playgroud)

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

$question_title = $this->uri->segment(3);
Run Code Online (Sandbox Code Playgroud)

第三段(问题标题slug)实际上被忽略了.但你可以用以下方法抓住它:

$route['question/(:num)'] = "questions_controller/show_question_by_id/$1";
Run Code Online (Sandbox Code Playgroud)

更多信息请访问:https://codeigniter.com/user_guide/libraries/uri.html

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

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

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

更多信息请访问:https://codeigniter.com/user_guide/general/routing.html

如果您希望在URL中包含无限数量的参数,或者不知道期望的参数,例如 /questions/1234/some-text-here

您可以使用mysite.com/my_page/param1/12/param2/foo/param3/bar/param4/baz/another-param/xyz-123URI方法将它们拆分为关联数组,以获得以下内容:

public function questions()
{
  $question_id = $this->uri->segment(2);

  // now do something with our question_id
}
Run Code Online (Sandbox Code Playgroud)

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


Phi*_*eon 10

如果你正在努力使用查询字符串,为什么要发布你的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
Run Code Online (Sandbox Code Playgroud)

这当然是查询字符串的替代品,但是如果你可以使用它来做.

parse_str()

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

parse_str($_SERVER['QUERY_STRING', $_GET');
Run Code Online (Sandbox Code Playgroud)

REQUEST_URI

将$ config ['uri_protocol']设置为"REQUEST_URI"并进一步启用查询字符串.REQUEST_URI不适用于所有服务器,所以这不是最完美的方法,即使它是最简单的方法.

  • 感谢您的帮助,虽然我没有看到您从"疯狂"评论来到哪里?!?我的帖子是关于样式提交框以显示为链接,似乎包含CSS相当明智......我们中的一些人可能在编码术语方面缺乏经验,但不一定疯狂...... (3认同)