#まず拡張機能をインストールします
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 で、複数のデータベースを操作しています。お役に立てれば幸いです構成設定ファイル// 账号数据库 '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' ],
/** * @param $DbconnName */ protected function Dbconn($DbconnName){ try{ $conn = Db::connect($DbconnName); }catch (\InvalidArgumentException $e){ echo '连接异常'; die; } return $conn; }
Agent.php#を追加します## クエリと追加、削除、変更の両方に対してクエリを呼び出すことができますが、取得したい結果セットがない場合は、execute() を呼び出すことができます。
query() には欠点があります。バインディング パラメータの形式 (非パラメータ バインディング) が SQL に直接書き込まれる場合、これがストアド プロシージャではないと判断される可能性があります。
お願い特定の実装については、thinkphp/library/think/db/Connection.php の行 368 を確認してください。もちろん、結果セットは返されません。
procedure() を呼び出すこともできます。このメソッドを呼び出すと、結果セットが返されます。 最初は、この問題が発生しました。バインドされたパラメータの形式で送信しなかったので、SQL を直接書いた場合、結果セットを取得できませんでした。その後、SQL に SET NOCOUNT ON; を追加しました。提出しました。かろうじてリターンを受け取りました。記事の最後に、最初に取得した結果セットの解決策の例を示しましたが、本当に下痢でした。文句を言わずに見てください。
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明らかに、
と @TotalCount
はここでは取得されません。 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;
}
以上がthinkphp が sqlserver ストアド プロシージャを呼び出して複数の結果セットを返す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。