为啥当我在 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 有状态小部件时,它没有改变另一个有状态小部件的状态

当我在 Thread 对象上调用 run() 时,为啥我的 Java 程序会泄漏内存?

PHP为啥不能调用MySQL

为啥当我在 grails 上删除一对多关系上的父级时,会在子级上调用 beforeInsert 事件?