我有这个PHP脚本,它应该为系统添加一个新的运行。每次运行它时,它都会告诉我游标状态无效。我无法弄清楚为什么会发生这种错误。在进入下一段代码之前,我已经进行了closeCursor()调用。这是php脚本,它会在第42行抛出错误(我的CreatePersonalRun存储过程的执行命令):
if (isset($emailAddress, $caloriesBurnt, $dateRecorded, $deleted, $endTime, $startTime, $runType, $routeId)) {
$getAthleteID = $dsn->prepare("{CALL sp_GetAthleteId(?)}");
$getAthleteID->bindParam(1, $emailAddress, PDO::PARAM_STR);
$getAthleteID->execute();
$athleteData = $getAthleteID->fetch(PDO::FETCH_ASSOC);
$athleteId = $athleteData["AthleteID"];
$getAthleteID->closeCursor();
$runType = 0;
$deleted = false;
if ($athleteId != null) {
$getAthleteID->closeCursor();
$addRun = $dsn->prepare("{CALL sp_CreatePersonalRun(?,?,?,?,?,?,?,?)}");
$addRun->bindValue(1, $athleteId);
$addRun->bindValue(2, $caloriesBurnt);
$addRun->bindValue(3, $dateRecorded);
$addRun->bindValue(4, $deleted);
$addRun->bindValue(5, $endTime);
$addRun->bindValue(6, $routeId);
$addRun->bindValue(7, $startTime);
$addRun->bindValue(8, $runType);
$addRun->execute(); //This is where the error is thrown
if ($addRun->rowCount() > 0) {
echo json_encode(array("code" => 100, "message" => "Run has been added to the system successfully!"));
} else {
echo json_encode(array("code" => 200, "message" => "Something went wrong with adding the run to the system"));
}
} else {
echo json_encode(array("code" => 200, "message" => "Athlete does not exist"));
}
我的getAthleteId存储过程的代码:
ALTER PROCEDURE [dbo].[sp_GetAthleteId]
@emailAddress nvarchar(400)
AS
SELECT * FROM Athlete WHERE EmailAddress = @emailAddress;
答案 0 :(得分:0)
形成SOURCE这个Invalid cursor state
错误的原因,
通过SQLFetch或SQLFetchScroll将游标定位在StatementHandle上。如果SQLFetch或SQLFetchScroll尚未返回SQL_NO_DATA,则驱动程序管理器将返回此错误,如果SQLFetch或SQLFetchScroll已返回SQL_NO_DATA,则由驱动程序返回此错误。
在StatementHandle上打开了一个游标。
与StatementHandle关联的预准备语句包含一个定位更新或删除状态,t,并且光标位于结果集开始之前或结果集结束之后。
所以检查storeprocdure是否正在撤回任何结果,并尝试替换
$getAthleteID->fetch(PDO::FETCH_ASSOC)
与
$getAthleteID->fetchAll(PDO::FETCH_ASSOC);
答案 1 :(得分:0)
我整个上午一直在努力,直到找到答案:
确保你的存储过程有SET NOCOUNT ON - 所有那些表示“(x行受影响)”的行只是混淆了PDO驱动程序并导致它没有创建结果集
HTH