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関数のポイントの大きな利点の1つは整数のようなものを返すことだと思いましたが、これらの整数を読むことは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

問題は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 に答える
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 に答える