我正在尝试使用第一个表的id将数据插入到两个表中。我尝试了几种可能性,但似乎都没有效果。请参阅下面我正在使用的当前方法。它插入到第一个表而不是第二个表。另外,没有任何错误告诉我我做错了什么。
如果有人能告诉我哪里出错了那会很棒。
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();
}
}
建议的副本与我尝试使用last_insert_id()函数的问题不同。
答案 0 :(得分:2)
分离查询可能会有所帮助,您需要首先执行第一个查询,然后获取第一个插入的ID,然后使用id插入新表。如果使用事务,则应该在提交之前使用lastInsertId 否则它将返回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();
}
}
}
?>
答案 1 :(得分:2)
使用Transactions,首先执行第一个命令并获取Last Insert Id,在下一次插入时使用它。
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;
}
}