为啥当我在 mysql 中调用 STORED PROCEDURE 时 pdo->lastInsertId() 返回 0?
Posted
技术标签:
【中文标题】为啥当我在 mysql 中调用 STORED PROCEDURE 时 pdo->lastInsertId() 返回 0?【英文标题】:why pdo->lastInsertId() return 0 when i call STORED PROCEDURE in mysql?为什么当我在 mysql 中调用 STORED PROCEDURE 时 pdo->lastInsertId() 返回 0? 【发布时间】:2012-09-27 16:05:40 【问题描述】:我需要返回我的数据库中最后插入的行的 id:
我有一个名为 DatabaseHandler 的类来使用 pdo
<?php class DatabaseHandler
private static $_mHandler;
private function __construct()
private static function GetHandler()
if (!isset(self::$_mHandler))
try
self::$_mHandler =
new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD,
array(PDO::ATTR_PERSISTENT => DB_PERSISTENCY));
self::$_mHandler->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
self::$_mHandler->setAttribute(PDO::mysql_ATTR_USE_BUFFERED_QUERY, true);
catch (PDOException $e)
self::Close();
trigger_error($e->getMessage(), E_USER_ERROR);
return self::$_mHandler;
public static function Close()
self::$_mHandler = null;
public static function Execute($sqlQuery, $params = null)
try
$database_handler = self::GetHandler();
$statement_handler = $database_handler->prepare('set names utf8; ' . $sqlQuery);
$statement_handler->execute($params);
$result=$database_handler->lastInsertId();
catch(PDOException $e)
self::Close();
trigger_error($e->getMessage(), E_USER_ERROR);
return $result;
?>
和 mysql db 中的存储过程:
CREATE PROCEDURE `sp_users_Insert`(IN _username VARCHAR(50), IN _email VARCHAR(50), IN _password CHAR(32), IN _ip VARCHAR(15), IN _reg_date INT, IN _ref_id MEDIUMINT)
BEGIN
INSERT INTO n_users
(username , email , password , ip , reg_date , ref_id )
VALUES(_username , _email , _password , _ip , _reg_date , _ref_id );
END$$
当我这样调用时,会创建数据库记录,但 lastInsertId() 返回 0:
$username =me;
$email=me@me.com;
$password =msadss;
$ip =12.0.0.1;
$reg_date =1347284764;
$ref_id =12;
$sql = 'CALL `sp_users_Insert`(:username,:email,:password,:ip,:reg_date,:ref_id)';
$params = array (':username' => $username, ':email' => $email, ':password' => $password, ':ip' => $ip, ':reg_date' => $reg_date, ':ref_id' => $ref_id);
DatabaseHandler::Close();
return DatabaseHandler::Execute($sql, $params);
我做错了什么?
【问题讨论】:
【参考方案1】:尝试作为程序中的最后一个命令:
SELECT LAST_INSERT_ID();
【讨论】:
我怎样才能用 DatabaseHandler 得到这个?? 不与您现在使用的执行功能。 ID 像 SELECT 结果一样返回。以上是关于为啥当我在 mysql 中调用 STORED PROCEDURE 时 pdo->lastInsertId() 返回 0?的主要内容,如果未能解决你的问题,请参考以下文章
当我在括号中调用它时,Thymeleaf 不会解析我的应用程序中的片段。这是为啥?
在 Winform 中,为啥当我在一个数据源上调用 PropertyChanged 时所有绑定的属性都会更新?
为啥当我在其小部件中调用 Flutter 有状态小部件时,它没有改变另一个有状态小部件的状态