2016-07-26 63 views
0

我设法得到最后一个插入查询的最后一个ID,但也没有为第二个ID查询。我怎样才能做到这一点?我既需要填充连接表获取最后2个自动增量ID

$query="INSERT INTO $dbname.Product (Description, ***, **, **, **) VALUES ('$des','$**', '$**', '$**', '$**')"; 
     $result = mysqli_query($conn,$query); 
     $id = mysqli_insert_id($conn); 
     $query2 = "INSERT INTO $dbname.Classification (**, **, **) VALUES ('$**', '$**', '$***')";  

     $result2 = mysqli_query($conn,$query2); 
     $id2 = mysqli_insert_id($conn); 
     echo $id; 
     echo $id2; //print the same ID as $id2 
+0

是什么让你觉得这是错的?由于您未插入同一张表中,因此ID可能相同。另外:SQL注入... – rlanvin

+0

谢谢。我发现我的错误,我忘了更改分类表中的ID为AUTO INCREMENT – Bobby

+0

**警告**:使用'mysqli'时,应该使用[参数化查询](http://php.net/manual/en/mysqli .quickstart.prepared-statements.php)和['bind_param'](http://php.net/manual/en/mysqli-stmt.bind-param.php)将用户数据添加到您的查询中。 **不要**使用字符串插值或连接来完成此操作,因为您创建了严重的[SQL注入漏洞](http://bobby-tables.com/)。 **绝不**将'$ _POST'或'$ _GET'数据直接放入查询中,如果有人试图利用您的错误,这会非常有害。 – tadman

回答

1

如果评估有用于由两个不同的用户在同一秒内创建两个产品没有风险,你可以使用像这样的查询。

INSERT INTO $dbname.myTable (id_product, id_classification) VALUES((SELECT id_product FROM $dbname.Product ORDER BY id_product DESC LIMIT 1), (SELECT id_classification FROM $dbname.Classification ORDER BY id_classification DESC LIMIT 1)); 

如果很多人都在相同的和冲突的风险创造产品高,那么我会用一个存储过程,我想每个之后存储在一个变量最后插入id的值查询。

DELIMITER // 

CREATE PROCEDURE createProduct(
[your paramters], 
dbName AS VARCHAR(50) 
) 
BEGIN 

    DECLARE idProduct INT(10) UNSIGNED; 
    DECLARE idClassification INT(10) UNSIGNED; 

    DECLARE EXIT HANDLER FROM SQLEXCEPTION BEGIN 
     ROLLBACK; 
     RESIGNAL; 
    END; 

    START TRANSACTION; 

    INSERT INTO dbname.Product (Description, ***, **, **, **) VALUES ('$des','$**', '$**', '$**', '$**'); 

    SET idProduct = LAST_INSERTED_ID(); 

    INSERT INTO dbname.Classification (**, **, **) VALUES ('$**', '$**', '$***'); 

    SET idClassification = LAST_INSERTED_ID(); 

    INSERT INTO $dbname.myTable (id_product, id_classification) VALUES (idProduct, idClassification); 

    COMMIT; 

END//