我想我对PDO的工作原理有一个基本的困惑。我有这个半复杂的多行查询,将一行插入到DB中,但我需要插入完成后的id (aid
)。我对另一个函数有类似的代码,它工作得很好,但是这个函数没有返回任何东西。我得到null
的结果。当我在phpmyadmin中执行相同的事情(用测试值替换参数)时,我得到了预期的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;
}
谢谢!
你是对的,你对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)
如果出于性能原因需要在一次服务器往返中完成所有这些操作,可以创建一个存储函数来完成。