像许多其他人一样,使用 pdo lastInsertID() 对我来说仅返回 0。我已经查看了 stack Overflow 提出的所有帮助问题,并在网上进行了搜索,但仍然得到 0。我认为代码是正确的,但我显然错过了一些东西,因为无论我尝试什么,我仍然得到 0。
我的表有一个自动递增的 id 列(名为“id”)。它也是表的主键。我使用存储过程进行插入,因此代码如下所示:
$stmt = $pdo_write->prepare('CALL sp_Save_Requests(:formSecret,:ipAddress)');
$stmt->bindParam(':formSecret', $formSecret, PDO::PARAM_STR);
$stmt->bindParam(':ipAddress', $ipAddress, PDO::PARAM_STR);
$stmt->execute();
$lastID = $pdo_write->lastInsertID();
即使表中存在新的 ID,此操作始终返回 0 - 正如下面从 phpmyadmin 导出的内容所示。
我使用单独的连接,具体取决于我是选择还是插入/更新。在本例中,连接对象是:
try {
$pdo_write = new PDO("mysql:host=$myServer;dbname=$myDB", $myRW_UID, $myRW_PW);
$pdo_write->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
$pdo_write->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$pdo_write->setAttribute( PDO::ATTR_EMULATE_PREPARES,TRUE );
} catch(PDOException $e) {
echo 'RW Connection Failed: '.$e->getMessage();
exit();
}
一个可能的问题 - 我确实使用触发器在表中创建和设置 guid,但它被设置为在实际插入之前触发。尽管实际表的名称已更改,但来自表的 phpmyadmin 的转储如下。:
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";
-- Table structure for table `tbl_test`
CREATE TABLE `tbl_test` (
`id` int(10) NOT NULL,
`guid` varchar(100) NOT NULL,
`formSecret` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Triggers `tbl_test`
--
DELIMITER $$
CREATE TRIGGER `tr_TestRequests_GUID` BEFORE INSERT ON `tbl_test` FOR EACH ROW SET NEW.guid = UUID()
$$
DELIMITER ;
--
-- Indexes for table `tbl_test`
--
ALTER TABLE `tbl_test`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `guid` (`guid`),
ADD UNIQUE KEY `id` (`id`);
--
-- AUTO_INCREMENT for table `tbl_test`
--
ALTER TABLE `tbl_test`
MODIFY `id` int(10) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=44;
COMMIT;
如果不需要,我宁愿不使用选择来提取 ID。但是,我很困惑,希望有人能看到我所缺少的东西。非常感谢您的帮助。
最佳答案
事实证明,我在对 out 变量进行 id 赋值时遇到了语法错误。花了很长时间才看到它,但现在它可以工作了。
感谢您的反馈,让我再次回顾这一点。
关于php - MySQL 从 pdo lastInsertID 中获取 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51179054/