0

我有一个如下所示的 MySQL 函数:

delimiter #
create function activate_user
(
    p_activation_hash char(32)
)
returns int
deterministic
begin
    declare v_ret int unsigned default 0;

    if (char_length(p_activation_hash) != 32) then
        return 0;
    end if;

    insert ignore into users (email, password_hash, first_name, last_name, company_name)
        select email, password_hash, first_name, last_name, company_name
        from user_activation
        where activation_hash = p_activation_hash
        and expiry_date > now();

    return last_insert_id();
end #
delimiter ;

如果我使用 CodeIgniter 像这样称呼它:

$query = $this->db->query("select activate_user(?);", array($this->input->get('key')));

var_dump($query->result_object());

var_dump($query->result_array());

我可以获得如下所示的结果数组或对象:

array
  0 => 
    object(stdClass)[16]
      public 'activate_user('5c9835e8dee7e1b43691708f503cb7f5')' => string '0' (length=1)

array
  0 => 
    array
      'activate_user('5c9835e8dee7e1b43691708f503cb7f5')' => string '0' (length=1)

显然,由于关键,它不是很有用,我真的不想做一个 foreach 似乎应该有更好的方法?

我认为mysql函数的一大优点是返回整数之类的东西,但是在php中读取这些整数似乎很乱,我错过了什么吗?


供您参考,这是我得到的最简洁的信息:

$query = $this->db->query("select activate_user(?) as user_result;", array($this->input->get('key')));
$result = current($query->result_array());

echo "function result: " . $result['user_result'];
4

2 回答 2

2

结果显示该函数返回零。如果你给你的函数调用起别名,你可能有更明智的时间阅读结果:

$query = $this->db->query("select activate_user(?) AS user_result;", array($this->input->get('key')));

现在函数调用被别名为 user_result 的列名,无需密钥即可更容易阅读。然后您可以将结果读取为:

$result = $query->result_array();
echo "function result = " . $result['user_result'];
于 2012-08-28T21:58:00.330 回答
2

问题不在于 MySQL 函数,而query()在于 PHP 中的函数。

尝试指定一个来源:

 $query = $this->db->query("select activate_user(?);", $this->input->get('key'));

看看这是否有帮助。您可以使用AS来简化返回值:

 SELECT activate_user(?) as status;

否则你可以试试

 $value = (int)(array_values($query[0])[0])

访问数组的第一个键的第一个子元素的第一个元素,或类似的东西。您可能必须将其写为

 $values = array_values($query[0]);
 $value  = (int)$values[0]
于 2012-08-28T21:59:51.440 回答