MySQL从pdo lastInsertID

时间:2018-07-04 18:09:17

标签: php mysql pdo

与许多其他示例一样,使用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。但是,我很沮丧,希望有人能看到我的缺失。非常感谢您的任何帮助。

1 个答案:

答案 0 :(得分:0)

结果是我在对out变量的id分配中遇到语法错误。永远花时间看到它,但现在可以使用。

感谢您的反馈,让我再次回顾一下。