0

このようなストアドプロシージャを作成し、入力引数を使用してそのプロシージャを呼び出しました。通常の場合のエコークエリと同じように、引数を使用してプロシージャを呼び出しながら、プロシージャ自体を取得したいと思います。

            $procedure              =   "CREATE PROCEDURE pdruser_login(IN userName VARCHAR(300), IN password VARCHAR(500)) 
                                        BEGIN 
                                        DECLARE _sqlQuery VARCHAR(2046);
                                        SET _sqlQuery = 'SELECT login_id, authorized, admin_authorize FROM tbluser_login WHERE user_name = userName AND user_pwd = password AND authorized = 1 AND privacy_policy = 1 AND is_deleted = 0';
                                        SET @sqlQuery = _sqlQuery;
                                        PREPARE dynquery FROM @sqlQuery;
                                        EXECUTE dynquery;
                                        DEALLOCATE PREPARE dynquery;
                                        END;";              
            if (!mysqli_query($this->con,"DROP PROCEDURE IF EXISTS pdruser_login") ||!mysqli_query($this->con,$procedure))
                {
                    file_put_contents("minefile1.txt", "Stored procedure creation failed: (" . mysqli_errno($this->con) . ") " . mysqli_error($this->con));
                }
            if (!($result   =   mysqli_query($this->con,"CALL pdruser_login('".$userName."','".$password."'"))) 
                {
                    file_put_contents("minefile2.txt","CALL failed: (" . mysqli_errno($this->con) . ") " . mysqli_error($this->con));
                }   

ただし、上記の手順では、「CALLが失敗しました:(1064)SQL構文にエラーがあります。MySQLサーバーのバージョンに対応するマニュアルで、1行目の''の近くで使用する正しい構文を確認してください」というエラーが表示されます。

ストアドプロシージャの呼び出し中にストアドプロシージャクエリを表示するにはどうすればよいですか?複雑なクエリのエラーを簡単に追跡できるように、動的クエリを取得する方法はありますか?

4

2 に答える 2

0

何らかの理由でSQLを変数に格納しないため、デバッグ情報にSQLを含めることはできません

$sql = "DROP PROCEDURE IF EXISTS pdruser_login";
mysqli_query($this->con,$sql) or trigger_error(mysqli_error($this->con)." [$sql]");
$sql = $procedure;
mysqli_query($this->con,$sql) or trigger_error(mysqli_error($this->con)." [$sql]");
// and so on.

trigger_errorは、file_put_contentsよりも便利な方法であることに注意してください。エラーをログファイルに記録することができますが、画面に表示することもでき、非常に便利です。そして、それは不可欠なファイル/ラインスタンプを持っています

于 2013-03-26T06:35:41.670 に答える
0

最初にMySQLプロシージャを作成するには、;以外のDELIMITERを設定する必要があります。次に、プロシージャの実行後に区切り文字をリセットします。これは、すべてのbockが単一のクエリとして扱われる必要があるためですが、プロシージャ内のクエリはsqlステートメントを壊す可能性があります(;を使用しているため)。

mysqlサイトからの例。

DELIMITER // 
DROP PROCEDURE IF EXISTS GetAllProducts //
CREATE PROCEDURE GetAllProducts() 
BEGIN 
  SELECT * FROM products; 
END // 
DELIMITER ; 
于 2013-03-26T07:53:33.600 に答える