2

プロシージャ (phpMyAdmin ではルーチンと呼ばれる) を作成しようとしていますが、現在、次のクエリがあります。

BEGIN

INSERT INTO `users` (`username`, `password`, `email`, `user_role_id`,` date_registered`)
    VALUES (_username, _password, _email, (SELECT `ID` FROM `roles` WHERE `role_name` = _role) , _date);

END;

しかし、これは機能しません。変数を role_ID に宣言しようとしましたが、これも機能しませんでした。誰かがこれを修正するのを手伝ってくれますか?

ノート

表示されるパラメーター (アンダースコア ( ) で始まる_) はすべて、phpMyAdmin ルーチン クリエーターで使用されるINパラメーターです。

編集

私が試した他のコードはこれです:

BEGIN

DECLARE role_id AS/*=*/ (SELECT `ID` FROM `roles` WHERE `role_name` = _role); /* tried both AS and = */

INSERT INTO `users` (`username`, `password`, `email`, `user_role_id`, `date_registered`)
    VALUES (_username, _password, _email, role_id, _date);

END;

また、 の小さなエラーに気づき、DECLARE上記のコードを次のように変更しました。

BEGIN

DECLARE @role_id ;
SET @role_id = (SELECT `ID` FROM `roles` WHERE `role_name` = _role);

INSERT INTO `users` (`username`, `password`, `email`, `user_role_id`, `date_registered`)
    VALUES (_username, _password, _email, @role_id, _date);

END;

しかし、まだ運がありません

4

2 に答える 2

0

これを行う方法を考え出しました - サブクエリを使用していませんが、次のストアド プロシージャがあります。

BEGIN

INSERT INTO `users` (`username`, `password`, `email`, `user_role_ID`, `date_registered`)
    VALUES (username, pwd, email, role, datenow);

END

そして、このPHP関数とクラスはそれを動作させます:

class create_user
{
    public static function CreateUser($username, $password, $email, $role)
    {
        global $link;
        #region Get role id
        $role_q = "SELECT `ID` FROM `roles` WHERE `role_name` = '{$role}';";
        $role_rs = mysqli_fetch_row($link->query($role_q));
        $role = $role_rs[0];
        #endregion

        #region Create user
        $link->query("CALL sp_create_user('{$username}', '" . hash("sha256", $password) . "', '{$email}', '{$role}', '" . date("y-m-d H:i:s") . "')") ? $inserted = true : $inserted = false;
        #endregion

        #region check if user created
        if ($inserted)
        {
            return true;
        }
        else
        {
            return "User was not created. Either the username or email is already in use.";
        }
        #endregion
    }
}

誰かがサブクエリでこれを行うことができれば、これはうまくいくので正しい答えになりますが、私の質問に対する完全な答えではありません。

ハッピーSQL!

于 2015-10-02T10:56:16.557 に答える