Maison  >  Article  >  cadre php  >  Comment thinkphp appelle la procédure stockée sqlserver pour renvoyer plusieurs jeux de résultats

Comment thinkphp appelle la procédure stockée sqlserver pour renvoyer plusieurs jeux de résultats

藏色散人
藏色散人avant
2020-01-25 12:16:221957parcourir

Comment thinkphp appelle la procédure stockée sqlserver pour renvoyer plusieurs jeux de résultats

Installez d'abord l'extension

windows

divisée en deux Étapes

1. Recherchez l'extension pdo correspondant à votre version de PHP, téléchargez-la et décompressez-la, et activez l'extension dans php.ini. Les problèmes auxquels vous devez faire attention sont la version de PHP et s'il s'agit d'une version. version sécurisée

2 .Téléchargez le pilote ODBC https://docs.microsoft.com/zh-cn/sql/connect/odbc/download-odbc-driver-for-sql-server?view=sql-server -2017, rien à noter. Téléchargez simplement le package d'installation pour votre système

Linux est similaire à Windows pour installer des extensions, vous pouvez directement utiliser pecl

Lorsque vous le chargez avec succès, vous pouvez le voir dans phpinfo(), bien sûr, si vous installez des extensions et qu'il y a beaucoup de problèmes, vous aurez vraiment la diarrhée.

thinkphp exploite la procédure stockée sqlsrv

La version TP que j'utilise est la 5.0 et j'exploite plusieurs bases de données, j'espère qu'elle pourra vous être utile

. Fichier de configuration

 // 账号数据库
    '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'
    ],

Modifier thinkphp/library/think/Model.php

Ajouter

 /**
     * @param $DbconnName
     */
    protected function Dbconn($DbconnName){
        try{
            $conn = Db::connect($DbconnName);
        }catch (\InvalidArgumentException $e){
            echo '连接异常';
            die;
        }
        return $conn;
    }

Ajouter un modèle à la fin

Agent.php

Vous pouvez appeler query pour la requête et l'ajout, la suppression et la modification. Si vous n'avez pas l'ensemble de résultats que vous souhaitez obtenir, vous pouvez appeler execute().

query() présente un inconvénient. Si la forme de vos paramètres de liaison (liaison sans paramètre) est écrite directement dans SQL, il peut juger qu'il ne s'agit pas d'une procédure stockée

S'il vous plaît ; vérifiez la ligne 368 de thinkphp/library/think/db/Connection.php pour l'implémentation spécifique. Bien entendu, aucun jeu de résultats ne sera renvoyé.

Vous pouvez également appeler procedure() Si cette méthode est appelée, l'ensemble de résultats sera renvoyé.

J'ai eu ce problème au début. Je ne l'ai pas soumis sous forme de paramètres liés. Si j'écrivais directement sql, je ne pouvais pas obtenir le jeu de résultats. Plus tard, j'ai ajouté SET NOCOUNT ON à mon sql. soumission. J'ai à peine reçu le retour. À la fin de l'article, j'ai donné un exemple de la solution pour l'ensemble de résultats que j'avais initialement obtenu, mais c'était vraiment foiré. Vous pouvez y jeter un œil et ne pas vous plaindre.

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;
    }
}

L'original Agent.php

n'obtient évidemment pas @AgentID et @TotalCount ici ; il ne retournera que l'ensemble de résultats de Agent_GetAgentList

public function GetIndirectAgentList($agentId,$strAccount,$strSuperior,$iPageIndex,$pagesize)
    {
        $conn = $this->Dbconn($this->Dbname);
        try{
            $res = $conn->query('
                SET NOCOUNT ON;
                declare @AgentID int;
                declare @TotalCount int;
                exec [dbo].[Agent_GetAgentList] '.$agentId.',\''.$strAccount.'\',\''.$strSuperior.'\','.$iPageIndex.','.$pagesize.',@TotalCount output;
                select @AgentID as AgentID,@TotalCount as TotalCount
                ');
        }catch (PDOException $e)
        {
            return false;
        }
        return $res;
}

Pour pour plus de connaissances ThinkPHP, veuillez visiter le Tutoriel ThinkPHP !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer