我想在PDO中运行MySQL嵌套查询。当我在phpmyAdmin控制台中运行查询时,它成功执行。但它不会在php文件中使用pdo代码执行。
下面是代码:
try{
$dbh->beginTransaction();
$stmt2 = $dbh->prepare( "INSERT INTO `members`( `username`, `email`, `password`, `time_created`)
VALUES (:username , :email , :password , NOW());
INSERT INTO `members_groups` (`member_id` , `group_id`)
VALUES((SELECT MAX(member_id) FROM members) ,
(SELECT group_id FROM groups WHERE permission = 0 ))
");
$stmt2->bindParam('username', $username , PDO::PARAM_STR);
$stmt2->bindParam(':email', $email , PDO::PARAM_STR);
$stmt2->bindParam(':password', $password , PDO::PARAM_STR);
if($stmt2->execute()){
$dbh->commit();
echo "registered successfully";
}
}
catch (Exception $e){
$dbh->rollback();
echo "an error has occurred";
}
当我运行代码时,它说成功运行但没有任何内容进入表
答案 0 :(得分:0)
如果groups
中的多行与WHERE
条件匹配,则查询失败。此版本至少应该正确解析:
INSERT INTO `members_groups`(`member_id` , `group_id`)
SELECT m.member_id, g.group_id
FROM (SELECT MAX(member_id) as member_id FROM members
) m CROSS JOIN
(SELECT group_id
FROM groups
WHERE permission = 0
) g;
但是,如果遇到重复项并且您有唯一性约束,则可能仍会出现重复键错误。
答案 1 :(得分:0)
您似乎忘记了第一次bindParam调用中参数名称开头的':'。
另外,我有点怀疑PDO :: prepare可以处理多个语句。您应该将其分成两个单独准备和执行的语句。