存储过程和 mysql_insert_id 问题
Posted
技术标签:
【中文标题】存储过程和 mysql_insert_id 问题【英文标题】:stored procedures and mysql_insert_id issue 【发布时间】:2012-10-06 10:37:33 【问题描述】:我的问题是: 我创建了一个从 php 到 mysql 的存储过程。现在,在有人谈论这种做法之前,该程序运行良好。 问题是这样的,当我从 php 调用该过程并且我知道已输入一条记录时,mysql_insert_id() 返回 0...任何想法为什么?
哦,是的,我的 id 字段是 AUTO_INCREMENT 和 PRIMARY KEY
附言 如果有一种简单的方法可以在这里格式化我的代码,请告诉我。我把pre放在html里,但是好像效果不太好。
Ty 提前。
$PROCEDURE_INSERT_UPDATE_BOARD = " 创建过程 InsertUpdateBoard(IN `pNewBoardUUID` CHAR(36), 在 `pOldBoardUUID` CHAR(36) 中, 在 `pSimName` VARCHAR(40) 中, 在 `pOwnerName` VARCHAR(64) 中, 在 `pOwnerUUID` CHAR(36) 中, 在 `pLandmark` VARCHAR(80) 中, 在 `pVersion` VARCHAR(10) 中, 在`pManagerUUID` CHAR(36) 中, 在 `pBoardURL` CHAR(80) 中, IN `pPassword` CHAR(8)) 开始 调用 InsertUpdateSims(`pSimName`); 调用 InsertUpdateAvatars(`pOwnerName`, `pOwnerUUID`); 插入板(`boardUUID`,`simId`,`ownerId`,`landmark`, `version`, `managerId`, `boardURL`, `password`) 值(`pOldBoardUUID`, (从 2starsglobal.sims 中选择 rS.id 作为 rS 其中 rS.name=`pSimName`), (从 2starsglobal.avatars 中选择 rA.id 作为 rA 其中 rA.UUID = `pOwnerUUID`), `pLandmark`,`pVersion`, (从 2starsglobal.avatars 中选择 rA2.id 作为 rA2 其中 rA2.UUID = `pManagerUUID`), `pBoardURL`, `pPassword`) 在重复键更新`boardUUID`=`pNewBoardUUID`, `地标`=`pLandmark`,`版本`=`pVersion`, `boardURL`=`pBoardURL`; 结尾 ";还有 PHP 代码
function InsertUpdateBoard($boardNewUUID, $boardOldUUID, $simName,
$ownerName, $ownerUUID, $boardLandmark,
$versionNumber, $managerUUID, $boardURL)
$password = generatePassword(8);
$query = "CALL InsertUpdateBoard('$boardNewUUID', '$boardOldUUID', '$simName',
'$ownerName', '$ownerUUID', '$boardLandmark',
'$versionNumber', '$managerUUID', '$boardURL',
'$password')";
mysql_query($query) or die("ERROR:QUERY_FAILED " . mysql_error());
if(mysql_affected_rows() > 0)
if(mysql_insert_id() > 0)
echo "SUCCESS,$password";
else
echo "SUCCESS";
else
echo 'FAILED:BOARD_REGISTRATION_UPDATE';
【问题讨论】:
【参考方案1】:用 google 十秒发现this page
注意,如果你调用一个 MySQL 存储过程来插入一条新记录 然后引用 $db->insert_id;你会得到 0 回来,而不是最后一次 已插入 ID。
因此有必要在 MySQL 存储过程中添加一行 比如
选择 last_insert_id() 作为 intRecordKey;
在插入之后,查询将返回新的键值。
【讨论】:
我不知道你在 google 中输入了什么,我尝试了所有与 mysql_insert_id() 和存储过程等等有关的东西。还有 LAST_INSERT_ID()。无论如何,我的解决方法是在过程中放置一个 INOUT pInsertId INT UNSIGNED 参数并 SET pInsertId = LAST_INSERT_ID();哪个完成了这项工作。我更喜欢你的回答。谢谢。以上是关于存储过程和 mysql_insert_id 问题的主要内容,如果未能解决你的问题,请参考以下文章
在单个查询中将 SQL 关系插入到 2 个表,而不使用 mysql_insert_id()