Maison > cadre php > PensezPHP > le corps du texte

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

藏色散人
Libérer: 2020-01-25 12:16:46
avant
1953 Les gens l'ont consulté

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'
    ],
Copier après la connexion

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;
    }
Copier après la connexion

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;
    }
}
Copier après la connexion

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;
}
Copier après la connexion

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!

Étiquettes associées:
source:cnblogs.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal