Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Insert data to two tables using last id PDO PHP MySQL

Tags:

php

mysql

pdo

I am trying to insert data to two tables using the id for the first table. I have tried several possibilities but none seem to work. Please see below for the current method I am using. It is inserting to the first table but not the second. Plus there isn't any error telling me what I did wrong.

If anyone can tell me where I am going wrong that would be great.

public function addContact($cnt_fname,$cnt_lname,$cnt_email,$cnt_phone,$cnt_type,$cnt_company,$cnt_web,$cnt_add1,$cnt_add2,$cnt_city,$cnt_state,$cnt_post,$cnt_country,$cnt_status) {
    try
    {

    $stmt = $this->conn->prepare("

    START TRANSACTION;

    INSERT INTO LeadContact(lead_fname,lead_lname,lead_email,lead_phone,lead_type,lead_company,lead_add1,lead_add2,lead_city,lead_state,lead_post,lead_country,lead_status) 
    VALUES(:cnt_fname,:cnt_lname,:cnt_email,:cnt_phone,:cnt_type,:cnt_company,:cnt_add1,:cnt_add2,:cnt_city,:cnt_state,:cnt_post,:cnt_country,:cnt_status);

    INSERT INTO LeadCompany(company_phone,company_type,company_name,company_website,company_add1,company_add2,company_city,company_state,company_post,company_country,company_status,company_contact) 
    VALUES(:cnt_phone,cnt_type,:cnt_company,:cnt_web,:cnt_add1,:cnt_add2,:cnt_city,:cnt_state,:cnt_post,:cnt_country,:cnt_status,last_insert_id());

    COMMIT;
    ");

    $stmt->bindparam(":cnt_fname", $cnt_fname);
    $stmt->bindparam(":cnt_lname", $cnt_lname);
    $stmt->bindparam(":cnt_email", $cnt_email);                                       
    $stmt->bindparam(":cnt_phone", $cnt_phone);                                       
    $stmt->bindparam(":cnt_type", $cnt_type);                                         
    $stmt->bindparam(":cnt_company", $cnt_company);                                       
    $stmt->bindparam(":cnt_add1", $cnt_add1);                                         
    $stmt->bindparam(":cnt_add2", $cnt_add2);                                         
    $stmt->bindparam(":cnt_city", $cnt_city);                                         
    $stmt->bindparam(":cnt_state", $cnt_state);                                       
    $stmt->bindparam(":cnt_post", $cnt_post);                                         
    $stmt->bindparam(":cnt_country", $cnt_country);                                       
    $stmt->bindparam(":cnt_status", $cnt_status);
    $stmt->bindparam(":cnt_web", $cnt_web);

    $stmt->execute();

    return $stmt;

}
catch(PDOException $e)
{
    echo $e->getMessage();
}               
}

The suggested duplicate is not the same question as I am trying to use the last_insert_id() function.

like image 361
robolist Avatar asked Mar 15 '26 20:03

robolist


2 Answers

Use Transactions, first execute the first command and get Last Insert Id, use it on the next insert.

public function addContact($cnt_fname,$cnt_lname,$cnt_email,$cnt_phone,$cnt_type,$cnt_company,$cnt_web,$cnt_add1,$cnt_add2,$cnt_city,$cnt_state,$cnt_post,$cnt_country,$cnt_status)
{

    try {
        $db->beginTransaction();

        $stmt = $db->prepare("INSERT INTO LeadContact(lead_fname,lead_lname,lead_email,lead_phone,lead_type,lead_company,lead_add1,lead_add2,lead_city,lead_state,lead_post,lead_country,lead_status) 
  VALUES(:cnt_fname,:cnt_lname,:cnt_email,:cnt_phone,:cnt_type,:cnt_company,:cnt_add1,:cnt_add2,:cnt_city,:cnt_state,:cnt_post,:cnt_country,:cnt_status)");
        $stmt->bindparam(":cnt_fname", $cnt_fname);
        $stmt->bindparam(":cnt_lname", $cnt_lname);
        $stmt->bindparam(":cnt_email", $cnt_email);
        $stmt->bindparam(":cnt_phone", $cnt_phone);
        $stmt->bindparam(":cnt_type", $cnt_type);
        $stmt->bindparam(":cnt_company", $cnt_company);
        $stmt->bindparam(":cnt_add1", $cnt_add1);
        $stmt->bindparam(":cnt_add2", $cnt_add2);
        $stmt->bindparam(":cnt_city", $cnt_city);
        $stmt->bindparam(":cnt_state", $cnt_state);
        $stmt->bindparam(":cnt_post", $cnt_post);
        $stmt->bindparam(":cnt_country", $cnt_country);
        $stmt->bindparam(":cnt_status", $cnt_status);

        $insertId = $db->lastInsertId();

        $stmt = $db->prepare("INSERT INTO LeadCompany(company_phone,company_type,company_name,company_website,company_add1,company_add2,company_city,company_state,company_post,company_country,company_status,company_contact) 
  VALUES(:cnt_phone,:cnt_type,:cnt_company,:cnt_web,:cnt_add1,:cnt_add2,:cnt_city,:cnt_state,:cnt_post,:cnt_country,:cnt_status,:id)");
        $stmt->bindparam(":cnt_phone", $cnt_phone);
        $stmt->bindparam(":cnt_type", $cnt_type);
        $stmt->bindparam(":cnt_company", $cnt_company);
        $stmt->bindparam(":cnt_web", $cnt_web);
        $stmt->bindparam(":cnt_add1", $cnt_add1);
        $stmt->bindparam(":cnt_add2", $cnt_add2);
        $stmt->bindparam(":cnt_city", $cnt_city);
        $stmt->bindparam(":cnt_state", $cnt_state);
        $stmt->bindparam(":cnt_post", $cnt_post);
        $stmt->bindparam(":cnt_country", $cnt_country);
        $stmt->bindparam(":cnt_status", $cnt_status);
        $stmt->bindparam(":id", $insertId);
        $stmt->execute();

        $db->commit();
    } catch (PDOException $ex) {
        //Something went wrong rollback!
        $db->rollBack();
        throw $ex;
    }
}
like image 148
TenTen Peter Avatar answered Mar 17 '26 13:03

TenTen Peter


Separating the queries might help, you need to first execute the first query then get the ID of that first insert then use the id to insert new table.Remember, if you use a transaction you should use lastInsertId BEFORE you commit otherwise it will return 0

<?php
public function addContact($cnt_fname, $cnt_lname, $cnt_email, $cnt_phone, $cnt_type, $cnt_company, $cnt_web, $cnt_add1, $cnt_add2, $cnt_city, $cnt_state, $cnt_post, $cnt_country, $cnt_status)
{
    try {
        $this->conn->BeginTransaction();

        $stmt = $this->conn->prepare("INSERT INTO LeadContact(lead_fname,lead_lname,lead_email,lead_phone,lead_type,lead_company,lead_add1,lead_add2,lead_city,lead_state,lead_post,lead_country,lead_status) 
    VALUES(:cnt_fname,:cnt_lname,:cnt_email,:cnt_phone,:cnt_type,:cnt_company,:cnt_add1,:cnt_add2,:cnt_city,:cnt_state,:cnt_post,:cnt_country,:cnt_status);");

        $stmt->bindparam(":cnt_fname", $cnt_fname);
        $stmt->bindparam(":cnt_lname", $cnt_lname);
        $stmt->bindparam(":cnt_email", $cnt_email);
        $stmt->bindparam(":cnt_phone", $cnt_phone);
        $stmt->bindparam(":cnt_type", $cnt_type);
        $stmt->bindparam(":cnt_company", $cnt_company);
        $stmt->bindparam(":cnt_add1", $cnt_add1);
        $stmt->bindparam(":cnt_add2", $cnt_add2);
        $stmt->bindparam(":cnt_city", $cnt_city);
        $stmt->bindparam(":cnt_state", $cnt_state);
        $stmt->bindparam(":cnt_post", $cnt_post);
        $stmt->bindparam(":cnt_country", $cnt_country);
        $stmt->bindparam(":cnt_status", $cnt_status);

        if ($stmt->execute()) {

            //insert to table 2

            $inserted_id = $this->conn->lastInsertId(); //get last id


            $sql = $this->conn->prepare("INSERT INTO LeadCompany(company_phone,company_type,company_name,company_website,company_add1,company_add2,company_city,company_state,company_post,company_country,company_status,company_contact) 
    VALUES(:cnt_phone,cnt_type,:cnt_company,:cnt_web,:cnt_add1,:cnt_add2,:cnt_city,:cnt_state,:cnt_post,:cnt_country,:cnt_status,:insertid)");
            $sql->bindparam(":cnt_fname", $cnt_fname);
            $sql->bindparam(":cnt_lname", $cnt_lname);
            $sql->bindparam(":cnt_email", $cnt_email);
            $sql->bindparam(":cnt_phone", $cnt_phone);
            $sql->bindparam(":cnt_type", $cnt_type);
            $sql->bindparam(":cnt_company", $cnt_company);
            $sql->bindparam(":cnt_add1", $cnt_add1);
            $sql->bindparam(":cnt_add2", $cnt_add2);
            $sql->bindparam(":cnt_city", $cnt_city);
            $sql->bindparam(":cnt_state", $cnt_state);
            $sql->bindparam(":cnt_post", $cnt_post);
            $sql->bindparam(":cnt_country", $cnt_country);
            $sql->bindparam(":cnt_status", $cnt_status);
            $sql->bindparam(":insertidr", $inserted_id);

            if ($sql->execute()) {
                return $sql;
            }

        } else {

            throw new Exception("Error inserting");

        }

        if ($this->conn->commit()) {
            $success = true;
        } else {
            throw new Exception('Transaction commit failed.');
        }

    }
    catch (Exception $e) {
        try {
            // something went wrong, we have to rollback
            $this->conn->rollback();
            // and display the error message
            echo $e->getMessage();
        }
        catch (Exception $f) {
            // and display the error message
            echo $f->getMessage();
        }
    }
}
?>
like image 44
Masivuye Cokile Avatar answered Mar 17 '26 13:03

Masivuye Cokile



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!