Ce face mysqli_insert_id
Când tabelul are o coloană AUTO_INCREMENT, MySQL alege singur id-ul rândului nou. mysqli_insert_id îți spune ce id a primit, ca să îl poți folosi imediat, de exemplu pentru a salva produsele unei comenzi noi sau pentru a redirecționa către pagina ei.
Valoarea este păstrată separat pentru fiecare conexiune, deci nu se încurcă cu inserările făcute în același timp de alți vizitatori. Dacă ultima interogare nu a generat un id, rezultatul este 0.
Exemplele de pe această pagină folosesc baza de date magazin, cu tabelul produse (coloanele id INT AUTO_INCREMENT, nume VARCHAR(100) NOT NULL, pret INT și stoc INT) și patru rânduri: Laptop (3200 lei, 5 buc.), Mouse (80 lei, 40 buc.), Monitor (900 lei, 0 buc.) și Tastatură (150 lei, 12 buc.). Comenzile SQL sunt explicate în secțiunea MySQL. Rezultatele au fost scrise pentru MySQL 8, pentru că exemplele au nevoie de un server de baze de date.
Parametri
| Parametru | Descriere |
|---|---|
$mysql |
Conexiunea pe care s-a făcut INSERT-ul. |
Ce returnează
Id-ul generat sau 0.
Exemple
Exemplul 1: Id-ul produsului nou
<?php
$conn = mysqli_connect("localhost", "ana", "parola_ta", "magazin");
mysqli_set_charset($conn, "utf8mb4");
mysqli_execute_query($conn, "INSERT INTO produse (nume, pret, stoc) VALUES (?, ?, ?)", ["Boxe", 320, 6]);
$id = mysqli_insert_id($conn);
echo "Produsul a fost salvat cu id-ul $id.\n";
echo "Link: /produs.php?id=$id";
Rezultat (cu un server MySQL și tabelul produse de mai sus)
Produsul a fost salvat cu id-ul 5.
Link: /produs.php?id=5
Exemplul 2: Comandă și rândurile ei
Id-ul comenzii noi este folosit imediat pentru rândurile din tabelul legat. Tranzacția face ca ambele inserări să reușească împreună.
<?php
$conn = mysqli_connect("localhost", "ana", "parola_ta", "magazin");
mysqli_begin_transaction($conn);
mysqli_execute_query($conn, "INSERT INTO comenzi (client) VALUES (?)", ["Ana"]);
$idComanda = mysqli_insert_id($conn);
foreach ([2 => 1, 4 => 2] as $idProdus => $bucati) {
mysqli_execute_query($conn, "INSERT INTO comenzi_produse (comanda_id, produs_id, bucati) VALUES (?, ?, ?)", [$idComanda, $idProdus, $bucati]);
}
mysqli_commit($conn);
echo "Comanda #$idComanda are 2 produse.";
Rezultat (cu un server MySQL și tabelele comenzi, comenzi_produse)
Comanda #1 are 2 produse.
Greșeli frecvente
- Afli id-ul nou cu
SELECT MAX(id) FROM produse. Dacă doi vizitatori salvează în același timp, poți primi id-ul celuilalt.mysqli_insert_ideste sigur.
Comenzi înrudite
mysqli_prepare: Pregătește o interogare SQL cu semne ? în loc de valori. Este metoda sigură împotriva SQL injection.mysqli_affected_rows: Returnează câte rânduri au fost modificate de ultimul INSERT, UPDATE, DELETE sau REPLACE.mysqli_query: Trimite o interogare SQL către baza de date. Pentru SELECT returnează un rezultat din care citești rândurile.PDO: PDO este interfața PHP comună pentru baze de date: același cod funcționează cu MySQL, PostgreSQL sau SQLite.