PDO在多行查询时获取失败

时间:2014-07-19 16:52:48

标签: php mysql pdo

我认为我对PDO的运作方式存在根本的困惑。我有这个半复杂的多行查询,在DB中插入一行,但是在完成后我需要插入的id(aid)。我有另一个函数的类似代码完全正常,但这个没有返回任何东西。我得到null的结果。当我在phpmyadmin中执行相同的操作(用测试值替换params)时,我得到了预期的aid。我做错了什么?

function add_list_activity($activity, $lid, $db) 
{
  $data = array();

  $query = " 
      INSERT INTO activities
      (`name`) VALUES (:activity);

      SET @act_id = LAST_INSERT_ID();

      INSERT INTO lists_activities 
      (`aid`, `lid`) VALUES (@act_id, :lid);

      SELECT aid FROM activities WHERE aid = @act_id;
  "; 

  // The parameter values 
  $query_params = array( 
      ':activity' => $activity,
      ':lid' => $lid
  ); 

  try 
  { 
      $stmt = $db->prepare($query); 
      $result = $stmt->execute($query_params); 
  } 
  catch(PDOException $ex) 
  {  
      die("Failed to run query: " . $ex->getMessage()); 
  }
  $data = $stmt->fetch();

  return $data;
}

谢谢!

1 个答案:

答案 0 :(得分:2)

你是对的,你对PDO准备好的陈述能力有误解。您不能一次传递多个SQL语句;你要做的事情需要四个不同的预备陈述。

另请注意,您可以通过使用这些语句来简化LAST_INSERT_ID()的使用,每个语句都作为单独的预准备语句。

INSERT INTO activities (`name`) VALUES (:activity)

SELECT LAST_INSERT_ID() AS aid

INSERT INTO lists_activities (`aid`, `lid`) VALUES (LAST_INSERT_ID(), :lid)

如果出于性能原因需要在一个服务器往返中执行所有这些操作,您可以创建一个存储函数来执行此操作。