使用 ODBC 将插入值 PDO 的 ID 返回给 MSSQL


Return IDs of inserted values PDO to MSSQL using ODBC

我需要在此函数中获取添加到数据库中的订阅者的id数组:

function insert_test($pdo, $fullname, $email) {
if ($SQL = $pdo->prepare("INSERT INTO subscribers ([dateAdded],[dateUpdated],[fullname],[email],[isActive]) VALUES (GETDATE(), GETDATE(), :fullname, :email, 1)")) {
    $SQL->bindValue(':fullname', $fullname, PDO::PARAM_STR);
    $SQL->bindValue(':email', $email, PDO::PARAM_STR);
    $SQL->execute();
    return array('status'=> true);
} else {
    return array('status'=> false);
}
}

但是,我正在努力弄清楚如何获取值并在数组中返回它们,如下所示:

return array('status'=> true,'ids'=> $ids);

我已经阅读并发现 SCOPE_IDENTITY() 可能是获取这些值的最可靠方法,但我不知道将其放在此函数中的哪个位置以返回我需要的值。数据库中的主键是 id 列。

会是这样的:

if ($SQL = $pdo->prepare("INSERT INTO subscribers ([dateAdded],[dateUpdated],[fullname],[email],[isActive]) VALUES (GETDATE(), GETDATE(), :fullname, :email, 1) SELECT SCOPE_IDENTITY()"))

然后在该参数之后绑定一个称为$ids的参数,还是我完全想多了?

任何帮助将不胜感激!

编辑:我尝试使用与此问题中类似的函数,并收到无效光标错误,因此将其调整为如下所示(请注意closeCursor是如何修复无效光标错误的):

function insert_test($pdo, $fullname, $email) {
    if ($SQL = $pdo->prepare("INSERT INTO subscribers ([dateAdded],[dateUpdated],[fullname],[email],[isActive]) OUTPUT INSERTED.id VALUES (GETDATE(), GETDATE(), :fullname, :email, 1)")) {
        $SQL->bindValue(':fullname', $fullname, PDO::PARAM_STR);
        $SQL->bindValue(':email', $email, PDO::PARAM_STR);
        $SQL->execute();
        $SQL->closeCursor();
        $ids = $SQL->fetchAll(PDO::FETCH_ASSOC);
        return array('status'=> true, 'id' => $ids);
    } else {
        $pdo = null;
        return array('status'=> false);
    }
}

此函数的返回结果现在如下所示:

Array
(
    [status] => 1
    [id] => Array
        (
        ) 
)

所以看起来输出没有正常工作?这越来越奇怪了...

想通了伙计们!

closeCursor();方法的位置存在问题,函数现在如下所示:

function insert_test($pdo, $fullname, $email) {
    if ($SQL = $pdo->prepare("INSERT INTO subscribers ([dateAdded],[dateUpdated],[fullname],[email],[isActive]) OUTPUT INSERTED.id VALUES (GETDATE(), GETDATE(), :fullname, :email, 1)")) {
        $SQL->bindValue(':fullname', $fullname, PDO::PARAM_STR);
        $SQL->bindValue(':email', $email, PDO::PARAM_STR);
        $SQL->execute();    
        $ids = $SQL->fetchAll(PDO::FETCH_ASSOC);
        $SQL->closeCursor();
        foreach ($ids as $id) {
            return $id['id'];
        }
    } else {
        $pdo = null;
        return false;
    }
}

因此,当 insert_test($pdo, $fullname, $email); 位于包含要插入的数据的每个循环中时,函数会根据需要返回每个 id。

如果有人能看到任何固有的问题,请告诉我!