mysql - 存储过程和 mysql_insert_id 问题

标签 mysql stored-procedures last-insert-id

我的问题是: 我创建了一个从 php 到 mysql 的存储过程。现在,在有人谈论这种做法之前,该程序运行良好。 问题是这样的,当我从 php 调用该过程并且我知道已经输入了一条记录时,mysql_insert_id() 返回 0...有什么想法吗?

哦,是的,我的 id 字段是 AUTO_INCREMENT 和 PRIMARY KEY

附注 如果这里有一种简单的方法来格式化我的代码,请告诉我。我把 pre 放在了 html 里,但是好像效果不是很好。

提前联系。

$PROCEDURE_INSERT_UPDATE_BOARD = 
"
CREATE PROCEDURE InsertUpdateBoard(IN `pNewBoardUUID` CHAR(36),
                                   IN `pOldBoardUUID` CHAR(36),
                                   IN `pSimName` VARCHAR(40), 
                                   IN `pOwnerName` VARCHAR(64),
                                   IN `pOwnerUUID` CHAR(36),
                                   IN `pLandmark` VARCHAR(80),
                                   IN `pVersion` VARCHAR(10),
                                   IN `pManagerUUID` CHAR(36),
                                   IN `pBoardURL`    CHAR(80),
                                   IN `pPassword` CHAR(8))
    BEGIN   
        CALL InsertUpdateSims(`pSimName`); 
        CALL InsertUpdateAvatars(`pOwnerName`, `pOwnerUUID`);

        INSERT INTO boards(`boardUUID`, `simId`, `ownerId`, `landmark`,
                                   `version`, `managerId`, `boardURL`, `password`)
                            VALUES(`pOldBoardUUID`,                                      
                            (SELECT rS.id FROM 2starsglobal.sims AS rS
                                    WHERE rS.name=`pSimName`),
                            (SELECT rA.id FROM 2starsglobal.avatars AS rA
                                    WHERE rA.UUID = `pOwnerUUID`),
                            `pLandmark`, `pVersion`,
                            (SELECT rA2.id FROM 2starsglobal.avatars AS rA2 
                                    WHERE rA2.UUID = `pManagerUUID`),
                            `pBoardURL`, 
                            `pPassword`)
        ON DUPLICATE KEY UPDATE `boardUUID`=`pNewBoardUUID`, 
                    `landmark`=`pLandmark`, `version`=`pVersion`,
                    `boardURL`=`pBoardURL`; 
    END
";

And the Php code

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'; 
    }       

}

最佳答案

用谷歌十秒找到this page

Note that if you Call a MySQL stored procedure to insert a new record and then reference $db->insert_id; you will get 0 back, not the last inserted ID.

It is therefore necessary to add a line to your MySQL Stored Procedure such as

select last_insert_id() as intRecordKey;

after the insert so that the query will return the new key value.

关于mysql - 存储过程和 mysql_insert_id 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12759023/

相关文章:

sql - 帮助限制内部连接

MySQL 给出 JOINed 表中每一行的结果

mysql - 如何计算一列中分隔值之间重复值的数量并将该值存储在另一个表中

sql - 禁止存储过程中的事务

mysql - SQL 查询总和和行总数

sql-server-2005 - 从日期中减去 SQL Server 中的天数

sql-server - 如果表设计发生变化,确定存储过程中的错误

php - BEFORE UPDATE 触发器会影响 mysqli_insert_id 结果吗?

php - 使用外键时 LAST_INSERT_ID() 被更改

php - 如何在 mysql-php 中检索所有最后插入的行 ID?