ホームページ > PHPフレームワーク > ThinkPHP > thinkphp が sqlserver ストアド プロシージャを呼び出して複数の結果セットを返す方法

thinkphp が sqlserver ストアド プロシージャを呼び出して複数の結果セットを返す方法

藏色散人
リリース: 2020-01-25 12:16:46
転載
2143 人が閲覧しました

thinkphp が sqlserver ストアド プロシージャを呼び出して複数の結果セットを返す方法

#まず拡張機能をインストールします

windows

2 つに分割します手順

1. PHP バージョンに対応する pdo 拡張機能を見つけて、ダウンロードして解凍し、php.ini で拡張機能を有効にします。注意する必要がある問題は、PHP バージョンと、それが PHP バージョンであるかどうかです。安全なバージョン

2 .ODBCドライバーのダウンロード https://docs.microsoft.com/zh-cn/sql/connect/odbc/download-odbc-driver-for-sql-server?view=sql-server -2017、注意する必要はありません。システムのインストール パッケージをダウンロードするだけです。

Linux は Windows に似ています。拡張機能をインストールするには、pecl

を直接使用できます。正常に読み込まれたら、 , もちろん phpinfo() で確認できますが、拡張機能をインストールして問題がたくさんあると、本当に下痢になります。

thinkphp は sqlsrv ストアド プロシージャを操作します

私が使用している tp バージョンは 5.0 で、複数のデータベースを操作しています。お役に立てれば幸いです

構成設定ファイル

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

// 账号数据库

   'UserDBConn' =>  [

       'type'            => 'sqlsrv',

       // 服务器地址

       'hostname'        => '139.129.1.1',

       // 数据库名

       'database'        => 'DB3',

       // 用户名

       'username'        => 'xxxx',

       // 密码

       'password'        => 'tt123!@#',

       // 端口

       'hostport'        => '5188'

   ],

   // 金币数据库

   'ScoreDBConn' =>  [

       'type'            => 'sqlsrv',

       // 服务器地址

       'hostname'        => '139.129.1.1',

       // 数据库名

       'database'        => 'DB2',

       // 用户名

       'username'        => 'xxxx',

       // 密码

       'password'        => 'tt123!@#',

       // 端口

       'hostport'        => '5188'

   ],

   // 记录数据库

   'RecordDBConn' =>  [

       'type'            => 'sqlsrv',

       // 服务器地址

       'hostname'        => '139.129.1.1',

       // 数据库名

       'database'        => 'DB1',

       // 用户名

       'username'        => 'xxxx',

       // 密码

       'password'        => 'tt123!@#',

       // 端口

       'hostport'        => '5188'

   ],

ログイン後にコピー

thinkphp/library/think/Model.phpを変更します

Append

1

2

3

4

5

6

7

8

9

10

11

12

/**

    * @param $DbconnName

    */

   protected function Dbconn($DbconnName){

       try{

           $conn = Db::connect($DbconnName);

       }catch (\InvalidArgumentException $e){

           echo '连接异常';

           die;

       }

       return $conn;

   }

ログイン後にコピー

model

Agent.php#を追加します## クエリと追加、削除、変更の両方に対してクエリを呼び出すことができますが、取得したい結果セットがない場合は、execute() を呼び出すことができます。

query() には欠点があります。バインディング パラメータの形式 (非パラメータ バインディング) が SQL に直接書き込まれる場合、これがストアド プロシージャではないと判断される可能性があります。

お願い特定の実装については、thinkphp/library/think/db/Connection.php の行 368 を確認してください。もちろん、結果セットは返されません。

procedure()

を呼び出すこともできます。このメソッドを呼び出すと、結果セットが返されます。 最初は、この問題が発生しました。バインドされたパラメータの形式で送信しなかったので、SQL を直接書いた場合、結果セットを取得できませんでした。その後、SQL に SET NOCOUNT ON; を追加しました。提出しました。かろうじてリターンを受け取りました。記事の最後に、最初に取得した結果セットの解決策の例を示しましたが、本当に下痢でした。文句を言わずに見てください。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

class Agent extends Model

{

    public $Dbname = 'UserDBConn';

    public function GetIndirectAgentList($agentId,$strAccount,$strSuperior,$iPageIndex,$pagesize)

    {

        $conn = $this->Dbconn($this->Dbname);

        try{

            $TotalCount = 0;

            $res = $conn::query('exec [dbo].[Agent_GetAgentList] :agentId,:strAccount,:strSuperior,:iPageIndex,:pagesize,:TotalCount', [

                'agentId' => $agentId,

                'strAccount' => [$strAccount, PDO::PARAM_STR],

                'strSuperior' => [$strSuperior, PDO::PARAM_STR],

                'iPageIndex' => [$iPageIndex, PDO::PARAM_INT],

                'pagesize' => [$pagesize, PDO::PARAM_INT],

                'TotalCount' => [$TotalCount, PDO::PARAM_INPUT_OUTPUT],

            ]);

        }catch (PDOException $e)

        {

            return false;

        }

        return $res;

    }

}

ログイン後にコピー

最初の

Agent.php

明らかに、

@AgentID

@TotalCount はここでは取得されません。 Agent_GetAgentList

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<code>public function GetIndirectAgentList($agentId,$strAccount,$strSuperior,$iPageIndex,$pagesize)

    {

        $conn = $this->Dbconn($this->Dbname);

        try{

            $res = $conn->query(&#39;

                SET NOCOUNT ON;

                declare @AgentID int;

                declare @TotalCount int;

                exec [dbo].[Agent_GetAgentList] &#39;.$agentId.&#39;,\&#39;&#39;.$strAccount.&#39;\&#39;,\&#39;&#39;.$strSuperior.&#39;\&#39;,&#39;.$iPageIndex.&#39;,&#39;.$pagesize.&#39;,@TotalCount output;

                select @AgentID as AgentID,@TotalCount as TotalCount

                &#39;);

        }catch (PDOException $e)

        {

            return false;

        }

        return $res;

}</code>

ログイン後にコピー
の結果セットのみを返します。ThinkPHP の関連知識の詳細については、

ThinkPHP チュートリアル

を参照してください。

以上がthinkphp が sqlserver ストアド プロシージャを呼び出して複数の結果セットを返す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート