存储过程和 mysql_insert_id 问题

Posted

技术标签:

【中文标题】存储过程和 mysql_insert_id 问题【英文标题】:stored procedures and mysql_insert_id issue 【发布时间】:2012-10-06 10:37:33 【问题描述】:

我的问题是: 我创建了一个从 phpmysql 的存储过程。现在,在有人谈论这种做法之前,该程序运行良好。 问题是这样的,当我从 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 问题的主要内容,如果未能解决你的问题,请参考以下文章

mysql_insert_id 替代 postgresql

mysql_insert_id() 返回 0

在单个查询中将 SQL 关系插入到 2 个表,而不使用 mysql_insert_id()

mysql : 使用任何命令代替 mysql_insert_id();在 PHP 中?

pl/sql编译存储过程卡住的解决方法

oracle存储过程:将select查询的结果存到变量中