如何将参数传递给codeigniter方法

时间:2012-05-09 14:05:46

标签: php codeigniter get arguments

我在codeigniter控制器中有一个方法,它有时通过url调用,有时在内部从控制器的另一个方法调用。当我在内部调用它时,我传递一个参数数组。简化版方法:

(在控制器内)

function get_details($args='') {

    if (isset($args['first_name'])) 
    {
        $first_name = $args['first_name'];
    } 
    else
    {
        $first_name = $this->uri->segment(3);
    } 

    ... do some other stuff ...

}

该方法被称为:

<domain>/<controller>/get_details/abcd/efgh 

或来自控制器的另一个功能:

$this->get_details(array('first_name'=>'abcd', 'last_name'=>'efgh'));

我期待通过url调用方法时,isset($ args ['first_name'])将为false,但似乎以这种方式调用参数。我尝试打印了几件事,这就是我得到的:

print_r($args)  ---->   abcd

echo($args['first_name'])  ----> a

echo($args['whatever_index_I_use'])  ----> a  

似乎url的第三个参数被传递给方法(通过codeigniter?),但是无法解决为什么数组索引似乎被设置,我只能想到的是php正在转换字符串到一个int,所以$args['whatever_index_I_use'], becomes $args[0] ??

不确定这是一个codeigniter事情还是我错过了一个微妙的PHP。

非常感谢任何能够解释正在发生的事情的人。

感谢。

3 个答案:

答案 0 :(得分:4)

我不知道这是一个错误还是一个预期的行为,但在Strings docs中有一条评论可以准确显示您的体验。如果您使用字符串的文本和索引,它将返回第一个字符。要避免它,首先检查参数是数组还是字符串:

if(is_array($args)) {
    echo($args['first_name']);
}

答案 1 :(得分:2)

要完成@SérgioMichels的答案,原因是因为PHP期望一个整数作为给定的索引。当你给它一个字符串时,PHP会将字符串转换为整数,并假设字符串不以数字开头,类型转换将返回0,否则,它将返回前导数字。

$str = 'abcdefghi';
var_dump($str['no_number']); // Outputs: string(1) "a"
var_dump($str['3something']); // Outputs: string(1) "d"

答案 2 :(得分:1)

要专门回答您的问题 - 这将解决您的错误:

function get_details($args='') 
{
    if (is_array($args))
    {
        $first_name = $args['first_name'];
    } 
    else
    {
        $first_name = $this->uri->segment(3);
    } 
    ... do some other stuff ...
}

但是您的代码存在一些问题。首先,您声明您将方法称为

<domain>/<controller>/get_details/abcd/efgh 

但您不接受控制器中的“efgh”变量。为此,您需要将功能更改为

function get_details($first, $last) 

在这种情况下,您现在可以将该函数称为

$this->get_details('abcd', 'efgh');

现在你甚至不需要测试数组等,这是一个更好的解决方案IMO。

如果您决定坚持使用数组,请更改:

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

$first_name = $args;

因为根据定义 - $ args是第3个URI段。