与许多其他示例一样,使用pdo lastInsertID()对我来说仅返回0。我查看了堆栈溢出提出的所有帮助程序问题,在网上进行搜索,但我仍然得到0。我认为代码是正确的,但是无论如何尝试,我仍然会得到0,我显然错过了一些东西。 / p>
我的表有一个自动递增的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;
如果不需要,我宁愿不使用select来提取ID。但是,我很沮丧,希望有人能看到我的缺失。非常感谢您的任何帮助。
答案 0 :(得分:0)
结果是我在对out变量的id分配中遇到语法错误。永远花时间看到它,但现在可以使用。
感谢您的反馈,让我再次回顾一下。