2016-07-26 2 views
0

Мне удалось получить последний 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

Что заставляет вас думать, что это неправильно? Поскольку вы не вставляете в ту же таблицу, возможно, что идентификатор один и тот же. Также: SQL-инъекция ... – rlanvin

+0

Спасибо. Я нашел свою ошибку, я забыл изменить идентификатор в таблице классификации на 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)); 

Если много людей могут создавать продукты в то же и риск конфликтов высоки, то я бы использовал хранимые процедуры и я хранится значение последней вставленной идентификатор в переменной после каждого запрос.

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// 
Смежные вопросы