php - 为什么当我在 mysql 中调用存储过程时 pdo->lastInsertId() 返回 0?

标签 php mysql stored-procedures pdo last-insert-id

我需要返回数据库中最后插入行的 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 数据库中的存储过程:

 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);

我做错了什么?

最佳答案

在你的过程中尝试作为最后一个命令:

SELECT LAST_INSERT_ID();

关于php - 为什么当我在 mysql 中调用存储过程时 pdo->lastInsertId() 返回 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12764222/

相关文章:

java - nameValuePair 数组列表的数值等效项?

mysql - 最新版本的Workbench在尝试导出数据库时需要旧的Mysql版本,但无法降级Mysql(Wamp服务器)(带有错误屏幕截图)

来自多行的 MySQL 条件

MySQL - 检测和处理存储过程中的锁等待超时

php - Laravel 上的图像更新并删除旧图像

php - PHP中的SQL解析器?

php - MySQL存储过程或函数以特定格式返回人名

sql - PostgreSQL 函数返回表或 SETOF

php - jquery上传完成后重定向到新页面

MYSQL - 根据动态值选择