【问题标题】:PHP PDO Microsoft SQL Server: SQLSTATE[24000]: [Microsoft][ODBC Driver 11 For SQL Sever] - Invalid Cursor StatePHP PDO Microsoft SQL Server: SQLSTATE[24000]: [Microsoft][ODBC Driver 11 For SQL Server] - 游标状态无效
【发布时间】:2016-09-14 03:46:22
【问题描述】:

我有这个 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;

【问题讨论】:

  • sp_GetAthleteId(?) 中的查询是什么

标签: php sql-server pdo


【解决方案1】:

形成这个SOURCE 得到Invalid cursor state 错误的原因,

SQLFetch 或 SQLFetchScroll 将游标定位在 StatementHandle 上。如果 SQLFetch 或 SQLFetchScroll 未返回 SQL_NO_DATA 则驱动程序管理器返回此错误,如果 SQLFetch 或 SQLFetchScroll 返回 SQL_NO_DATA 则驱动程序返回此错误。

StatementHandle 上打开了一个游标。

与 StatementHandle 关联的准备好的语句包含定位的更新或删除语句,并且游标定位在结果集的开头之前或结果集的结尾之后。

所以检查存储过程是否返回任何结果,并尝试替换 $getAthleteID->fetch(PDO::FETCH_ASSOC)

$getAthleteID->fetchAll(PDO::FETCH_ASSOC);

【讨论】:

    【解决方案2】:

    我整个上午都在为此苦苦挣扎,直到找到答案:

    确保您已为您的存储过程设置了 SET NOCOUNT - 所有那些显示“(受影响的 x 行)”的行只会混淆 PDO 驱动程序并导致它不创建结果集.

    HTH

    【讨论】:

      猜你喜欢
      • 2019-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      相关资源
      最近更新 更多