多个查询和LastInsertId

How wrong is that query? Can I insert multiple queries like that? Can I use lastInsertId like that?

$pdo = Database::connect();
    $dflt = 'DEFAULT';

    $query1 = "INSERT INTO utilizador(email, pass, nome, dt_registo, tipo, activo) 
                  VALUES (:email, '$hashed_password', :nome, :dt_registo, :tipo, :activo)";
    $stmt = $pdo->prepare($query1);
    $stmt->execute();
    $insertedid = $pdo->lastInsertId("utilizador");

    $query2 ="INSERT INTO aluno(morada, cd_postal, cidade, utilizador_id)
                VALUES (:morada, :cpostal, :cidade,'$insertedid')";

    $stmt2 = $pdo->prepare($query2);
    $stmt2->execute();

    $hashed_password = hash( 'sha512', $_POST['password']);
    $stmt->bindParam(':email',$_POST['email']);
    $stmt->bindParam(':nome',$_POST['nome']);
    $stmt->bindParam(':dt_registo',$dflt);
    $stmt->bindParam(':tipo',$dflt);
    $stmt->bindParam(':activo',$dflt);
    $stmt->bindParam(':morada',$_POST['morada']);
    $stmt->bindParam(':cpostal',$_POST['cpostal']);
    $stmt->bindParam(':cidade',$_POST['cidade']);

    if($stmt->execute()){        
        echo "Product was created.";
    }else{
        echo "Unable to create product.";
    }
    Database::disconnect();
}
catch(PDOException $exception){
    echo "Error: " . $exception->getMessage();
}

I've already been searching but couldn't find how to use both in a query and I already expired all the solutions, not sure which is wrong.

EDIT: I'm starting to think its more than the query, if someone notice something..

JAVASCRIPT

$(document).on('submit', '#create-aluno-form', function() {
    // show a loader img
    $('#loader-image').show();

    // post the data from the form
    $.post("registar.php", $(this).serialize())
        .done(function(data) {           
            // show create product button
            $('#create-aluno').show();
            showProducts();
        });
    return false;
});

Most likely your statement fails to insert, Your code is full of problems:

  • You used prepare statement but yet you put values in the query string
  • hashed_password is undefined in the first query
  • You try to bind multiple queries at once
  • wrong order prepare the first query, execute , then bind the parameters -$pdo->lastInsertId(); is enough not sure why you pass "utilizador"

Try this approach:

try{
    $pdo = Database::connect();
    $dflt = 'DEFAULT';
    $hashed_password = hash( 'sha512', $_POST['password']);

    $query1 = "INSERT INTO utilizador(email, pass, nome, dt_registo, tipo, activo) 
                  VALUES (:email, :pass, :nome, :dt_registo, :tipo, :activo)";
    $stmt = $pdo->prepare($query1);
    $stmt->bindParam(':email',$_POST['email']);
    $stmt->bindParam(':pass',$hashed_password);
    $stmt->bindParam(':nome',$_POST['nome']);
    $stmt->bindParam(':dt_registo',$dflt);
    $stmt->bindParam(':tipo',$dflt);
    $stmt->bindParam(':activo',$dflt);
    if($stmt->execute()){
        //query1 success
        $insertedid = $pdo->lastInsertId();
        $query2 ="INSERT INTO aluno(morada, cd_postal, cidade, utilizador_id)
                  VALUES (:morada, :cpostal, :cidade, :utilizador_id)";
        $stmt2 = $pdo->prepare($query2);
        $stmt2->bindParam(':morada',$_POST['morada']);
        $stmt2->bindParam(':cpostal',$_POST['cpostal']);
        $stmt2->bindParam(':cidade',$_POST['cidade']);
        $stmt2->bindParam(':utilizador_id',$insertedid);
        if($stmt2->execute()){        
            //query2 success
        }else{
            //query2 failed
        }
    }else{
            //query1 failed
    }

    Database::disconnect();
}
catch(PDOException $exception){
    echo "Error: " . $exception->getMessage();
}

I think these will useful to you.

 $query = "INSERT INTO utilizador(email, pass, nome, dt_registo, tipo, activo) 
              VALUES (:email, '$hashed_password', nome, :dt_registo, :tipo, :activo)";

 $query_1 = " INSERT INTO aluno(morada, cd_postal, cidade, utilizador_id) 
                      VALUES (:morada, :cpostal, :cidade, mysql_insert_id())";

    $stmt = $pdo->prepare($query);
    $stmt_1 = $pdo->prepare($query_1);

these will useful to you.

 mysql_select_db('test');
 mysql_query("INSERT INTO mytable (name) values ('venkatesh')");
 printf("Last inserted record has id %d
", mysql_insert_id());

Thank you.

Try this....

$query1 = "INSERT INTO utilizador(email, pass, nome, dt_registo, tipo, activo) 
              VALUES (:email, '$hashed_password', nome, :dt_registo, :tipo, :activo);";
    $stmt = $pdo->prepare($query1);
    $stmt->execute();

     $query2 ="INSERT INTO aluno(morada, cd_postal, cidade, utilizador_id) 
                        VALUES (:morada, :cpostal, :cidade, LAST_INSERT_ID());";
    $stmt2 = $pdo->prepare($query2);
    $stmt2->execute();

Because insert the query not get last insert id. so separate those queries

You have to use the

mysql_insert_id()

to get the last inserted record's id

see here

INSERT INTO questions VALUES(NULL, 'My question');

INSERT INTO answers VALUES(NULL, LAST_INSERT_ID(), 'Answer 1');
INSERT INTO answers VALUES(NULL, LAST_INSERT_ID(), 'Answer 2');
INSERT INTO answers VALUES(NULL, LAST_INSERT_ID(), 'Answer 3');

Now I Have using LAST_INSERT_ID();

INSERT INTO answers VALUES
          (NULL, LAST_INSERT_ID(), 'Answer 1') , 
          (NULL, LAST_INSERT_ID(), 'Answer 2') , 
          (NULL, LAST_INSERT_ID(), 'Answer 3');

OR

also we can try this way

INSERT INTO questions VALUES(NULL, 'My question');
SET @id = (SELECT LAST_INSERT_ID());
INSERT INTO answers VALUES(NULL, @id, 'Answer 1');
INSERT INTO answers VALUES(NULL, @id, 'Answer 2');
INSERT INTO answers VALUES(NULL, @id, 'Answer 3');

It was just an example for you

$query1 = "INSERT INTO utilizador(email, pass, nome, dt_registo, tipo, activo) 
              VALUES (:email, '$hashed_password', nome, :dt_registo, :tipo, :activo);";
    $stmt = $pdo->prepare($query1);
    $stmt->execute();
    $insertedid = $pdo->lastInsertId("utilizador");

     $query2 ="INSERT INTO aluno(morada, cd_postal, cidade, utilizador_id) 

Ref link:-http://www.dreamincode.net/forums/topic/169597-pdolastinsertid/

                        VALUES (:morada, :cpostal, :cidade,'$insertedid'
);";
    $stmt2 = $pdo->prepare($query2);
    $stmt2->execute();