使用PDO

时间:2016-02-28 14:34:26

标签: php mysql pdo

我想在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";
  }      

当我运行代码时,它说成功运行但没有任何内容进入表

2 个答案:

答案 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可以处理多个语句。您应该将其分成两个单独准备和执行的语句。