Php 如何从laravel中的mysql存储过程中获取多个结果集
我想从laravel中的存储过程中获取多个结果集。我有办法做到这一点吗? 目前,我可以使用以下代码获取单行数据:Php 如何从laravel中的mysql存储过程中获取多个结果集,php,mysql,stored-procedures,laravel-5,laravel-4,Php,Mysql,Stored Procedures,Laravel 5,Laravel 4,我想从laravel中的存储过程中获取多个结果集。我有办法做到这一点吗? 目前,我可以使用以下代码获取单行数据: $result = DB::statement('CALL user_login(' . $userId . ',"' . $password . '",'
$result = DB::statement('CALL user_login(' . $userId . ',"'
. $password . '",'
. '@success'.','
. '@first_Name'
);
$res = DB::select('select @success AS success, @first_Name AS firstName);
Here is my stored procedure:
DELIMITER //
DROP PROCEDURE IF EXISTS user_login//
create procedure user_login (IN userid VARCHAR(50),
IN password VARCHAR(50),
out success int,
OUT first_Name VARCHAR(255),
)
begin
declare count int(1);
set count =0;
select firstName, count(*)
into first_Name, count
from `tmc`.user where user_id = userid and pwd=password;
if count >0 then
set success =0;
else
set success=1;
end if;
end//
我正在使用下面的代码,它工作得非常完美。改变它以适应你的需要
public static function CallRaw($procName, $parameters = null, $isExecute = false)
{
$syntax = '';
for ($i = 0; $i < count($parameters); $i++) {
$syntax .= (!empty($syntax) ? ',' : '') . '?';
}
$syntax = 'CALL ' . $procName . '(' . $syntax . ');';
$pdo = DB::connection()->getPdo();
$pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, true);
$stmt = $pdo->prepare($syntax,[\PDO::ATTR_CURSOR=>\PDO::CURSOR_SCROLL]);
for ($i = 0; $i < count($parameters); $i++) {
$stmt->bindValue((1 + $i), $parameters[$i]);
}
$exec = $stmt->execute();
if (!$exec) return $pdo->errorInfo();
if ($isExecute) return $exec;
$results = [];
do {
try {
$results[] = $stmt->fetchAll(\PDO::FETCH_OBJ);
} catch (\Exception $ex) {
}
} while ($stmt->nextRowset());
if (1 === count($results)) return $results[0];
return $results;
}
结果调用将是:
CALL spGetData(?,?,?)
如果只有一个结果集,它将按原样返回。如果有更多,它将返回一个结果集数组。该键使用$pdo->setAttribute(\pdo::ATTR\u EMULATE\u PREPARES,true)代码>。如果没有它,将抛出一个可怕的SQLSTATE[HY000]:常规错误:2053
异常
try{}catch()块用于消除无法获取的结果集。特别是,我有两个过程返回两个结果集,一个作为更新(或其他执行语句)的结果,最后一个作为实际数据。带有执行查询的fetchAll()
上引发的异常将是PDOException
警告:功能未优化。您可以通过一次参数传递来重写它。如果存储过程返回多个输出,在这种情况下,您可以通过两种方法来处理这种情况
Gotovendor\laravel\framework\src\illumb\Database\Connectors\Connector.php
并将PDO::ATTR\u EMULATE\u PREPARES
设置为true
开发API时会产生问题,因为当响应以JSON形式返回时,所有API都会以字符串形式返回数字,例如:{“status”:“1”}
,但它应该是{“status”:1}
向特定情况添加新连接。您必须仅针对特定API而不是在所有API中处理上述问题。所以我建议选择第二个选项
在config/database.php中添加连接
将下面的代码使用到连接中
'mysql_procedure' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => 'sv_',
'prefix_indexes' => true,
'strict' => false,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),PDO::ATTR_EMULATE_PREPARES => true
]) : [],
],
根据您的配置更新详细信息
$procRslts = DB::connection('mysql_procedure')
->select("CALL user_login(?,?,?,?)", array( $userId ,$password,$success,$firstName ));
我认为,在这种情况下,您不需要传递最后两个参数,您可以编写逻辑int过程从数据库中获取
您可以获得存储过程返回的多个输出。请在回答中添加一些说明-解决问题需要哪些部分,以及原因?@NicoHaase感谢您的建议。我希望现在一切都好。
$procRslts = DB::connection('mysql_procedure')
->select("CALL user_login(?,?,?,?)", array( $userId ,$password,$success,$firstName ));