duanjian7343 2012-10-06 21:55
浏览 127
已采纳

为什么当我在mysql中调用STORED PROCEDURE时,pdo-> lastInsertId()返回0?

i need return id of last inseted row in my database :

i have a class named DatabaseHandler to use 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;         
      }?>

and STORED PROCEDURE in 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$$

and when i call that like this , the database record is created but lastInsertId() return 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);

What i am doing wrong?

  • 写回答

1条回答 默认 最新

  • duanduan1993 2012-10-06 22:08
    关注

    Try as last command in your procedure:

    SELECT LAST_INSERT_ID();
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么