Recupero dell'ultimo ID di inserimento da MySql usando PHP

Ho due tabelle nel database MySql, una è sales_order e l'altra è sales_order_details che contiene i dettagli dell'ordine nella tabella sales_order . Ovviamente, esiste una relazione uno a molti da sales_order a sales_order_details .

Quando un cliente effettua un ordine, la prima voce viene inserita nella tabella sales_order e in base sales_order auto_increment della tabella sales_order , la voce corrispondente viene inserita nella tabella sales_order_details .

Sto usando la function last_insert_id() MySql per recuperare il corrispondente order_id dalla tabella sales_order , qualcosa del genere.

 insert into sales_order_details(order_id, prod_id, prod_price)values(last_insert_id(), 5, 1500); 

Sta funzionando. La function last_insert_id() recupera l'ultimo ID inserito dalla rispettiva tabella che è univoco per una particolare connessione (per quanto ne so).

Ora ho bisogno dello stesso order_id che viene recuperato e inserito di recente dalla function last_insert_id() per inviarlo come numero di fattura a un sistema di pagamento.

Posso provare a utilizzare la function PHP mysql_insert_id() ma non sono sicuro che funzioni come specificato. Qual è il modo corretto per recuperare l'ultimo ID di inserimento che garantisce sempre di recuperare l'ID specifico che è sempre associato a un particolare ordine?

Ci sono 2 modi per risolvere questo problema:

Dopo aver inserito la voce in sales_order:

  1. Ottieni l' last_insert_id e lo memorizza in una variabile php, quindi inserisci questo valore nelle query pertinenti.

  2. Memorizza last_insert_id in una variabile definita dall'utente MySql e utilizza la variabile nella query anziché last_insert_id .

codice di esempio per l'opzione 2

SET @last_order_id = last_insert_id();

 insert into sales_order_details (order_id, prod_id, prod_price) values (@last_order_id, 5, 1500);` insert into sales_invoice (order_id, invoice_id) values (@last_order_id, 1);` 

http://ca.php.net/manual/en/mysqli.insert-id.php

è la properties; che stai cercando. È completamente affidabile

mysql_insert_id (e tutte le funzioni di mysql_) sono deprecate.

Entrambi * LAST_INSERT_ID () * e * mysql_insert_id () * funzionano come pubblicizzati, vale a dire: recupereranno l'ultimo ID inserito in qualsiasi tabella durante la session / connessione corrente.

Finché non si inserisce in più di una tabella incrementata automatica prima di recuperare questo ID, si è sicuri che sia quello corretto.

Fai attenzione anche quando inserisci più valori nella stessa tabella, riceverai il valore per il primo di essi ma non necessariamente consecutivi (una session / connessione diversa potrebbe aver inserito anche alcuni nuovi record).

Di solito mi piace fare cose del genere:

 START TRANSACTION; INSERT INTO sales_order ...; SET @last_order = LAST_INSERT_ID(); INSERT INTO sales_order_details (order_id) VALUES ($last_order); SELECT @last_order; COMMIT; 

Il set di risultati di questa query dovrebbe contenere una singola colonna e una singola row contenente il valore dell'ultimo ordine.

Ma di nuovo, di solito lo faccio soprattutto per la sicurezza transazionale degli aggiornamenti.

 START TRANSACTION; SELECT * FROM sales_order WHERE order_id = 2 FOR UPDATE; UPDATE sales_order_details SET quantity = 9 WHERE order_id = 2 AND prod_id = 3; UPDATE sales_order SET price_to_pay = (SELECT SUM(quantity*price) FROM sales_order_details WHERE order_id = 2); COMMIT; 

La transazione dovrebbe garantire che le operazioni siano atomiche (tutte eseguite senza interruzione da altri processi);

Se wheressi fare lo stesso senza una transazione o dal codice dell'applicazione, la quantità potrebbe essere aggiornata da un altro thread e letta da un terzo thread prima che tu facessi l'aggiornamento del prezzo. Cedendo un falso "price_to_pay" all'utente.

Vorresti ristrutturare le tue query solo un po '.

  1. Inserisci il record nella tabella sales_order
  2. Usa la function php mysql_insert_id() per recuperare l'id del record sales_order : $sales_order_id = mysql_insert_id()
  3. Riscrivi il tuo inserto in questo modo: `inserisci nei valori sales_order_details (order_id, prod_id, prod_price) ($ sales_order_id, 5, 1500);

Basta usare mysql_insert_id() subito dopo aver inserito sales_order. Starai bene.

mysql_insert_id( ) restituisce sempre l'id generato per un collumn AUTO_INCREMENT dalla query precedente . (Vedi il manuale PHP )

Non capisco esattamente quale ID vuoi recuperare, ma per recuperarlo usando PHP devi sempre farlo subito dopo la query. Per esempio:

 // Query A mysql_query( 'INSERT INTO table_a ( id, name ) VALUES ( NULL, "Henry" )' ); $idA = mysql_insert_id( ); // Query B mysql_query( 'INSERT INTO table_b ( id, name, a_id ) VALUES ( NULL, "Wotton", ' . $idA . ' )' ); $idB = mysql_insert_id( ); // Query C mysql_query( 'INSERT INTO table_c ( id, name, a_id ) VALUES ( NULL, "Rick", ' . $idA . ' )' ); 

Il vantaggio di archiviarli in una variabile PHP è che il tuo sistema o framework non può rovinare le tue query eseguendo un'altra query mentre non ne sei a conoscenza.

  1. Database CREATE TABLE MyGuests ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, email VARCHAR(50), reg_date TIMESTAMP ) ------------------------------------------------------------------- 1. Example (MySQLi Object-oriented) ------------------------------------------------------------------- <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', '[email protected]')"; if ($conn->query($sql) === TRUE) { $last_id = $conn->insert_id; echo "New record created successfully. Last inserted ID is: " . $last_id; } else { echo "Error: " . $sql . "<br>" . $conn->error; } $conn->close(); ?> ------------------------------------------------------------------- 2. Example (MySQLi Procedural) ------------------------------------------------------------------- <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Create connection $conn = mysqli_connect($servername, $username, $password, $dbname); // Check connection if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', '[email protected]')"; if (mysqli_query($conn, $sql)) { $last_id = mysqli_insert_id($conn); echo "New record created successfully. Last inserted ID is: " . $last_id; } else { echo "Error: " . $sql . "<br>" . mysqli_error($conn); } mysqli_close($conn); ?> ------------------------------------------------------------------- 3. Example (PDO) ------------------------------------------------------------------- <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDBPDO"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // set the PDO error mode to exception $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', '[email protected]')"; // use exec() because no results are returned $conn->exec($sql); $last_id = $conn->lastInsertId(); echo "New record created successfully. Last inserted ID is: " . $last_id; } catch(PDOException $e) { echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?>