PHP-MYSQL, vissza tudom kérdezni az utoljára bevitt adatokat?
Van egy űrlapom, amin több beviteli mező van, de csak egyet kötelező megadni. Ez a mező nem egyedi azonosító, tehát előfordulhat az adatbázisban, hogy vannak azonos sorok. Tehát erre nem tudok keresni.
Azt szeretném elérni, hogy amikor feldolgozom és elküldöm az űrlapot az adatbázisnak, majd sikeresen be is írta, akkor vissza is olvassa annak a sornak az id-jét (az id automatikusan növelt mező, tehát adatbázisba írás előtt ezt nem tudom). Párhuzamosan többen is használják az űrlapot, ezért olyat nem tudok csinálni, hogy pl. a legutolsó sort kérdezem le, mert közbe egy másik felhasználó is vihet fel adatokat az adatbázisba.
Esetleg használjak session-t, amit eltárolok egy plusz oszlopban, és ez alapján keressem vissza a beírt sort?
Köszi
Ebben a nyomorult MySQL-ben még RETURNING kifejezés sincs, ami az insertből visszaadná az ID értékét, de van helyette
SELECT LAST_INSERT_ID();
lásd: [link]
Ez a LAST_INSERT_ID az adott DB kapcsolatra vonatkozik, tehát a párhuzamos insertek nem zavarnak be neki. Ez tűnik a legelegánsabb megoldásnak.
Néztem én is a last_insert_id-t, de manual szerint elavult.
Találtam egy másik megoldást:
SELECT id FROM tabla ORDER BY reg_date DESC LIMIT 1
Ezt közvetlenül adatbázisba írás után használom.
Így elvileg nem akadhatok össze másik felhasználóval?
Tehát ha egyszerre küldjük el az űrlapot, akkor is először az egyikünk insert-je és select-je hajtódik végre? Vagy előfordulhat, hogy mindketten beírjuk, és mindketten a legutolsó vesszük ki?
Amúgy a session tényleg egyszerűbbnek tűnik, lehet mégis azzal oldom meg.
Köszi!
Nem tudom mi az elavult benne, szerintem használd nyugodtan, tekintettel arra, hogy ebben az ótvaros nyomorékban (értsd: MySQL) még szekvenciákat sem lehet normálisan használni, csak auto_increment létezik...
Az általad felvetett megoldás nem jó, az a select már simán visszaadhatja az adatokat, amit egy másik tranzakció közben beinsertált.
Csak ezért letárolni a sessiont szerintem felesleges és pazarló, nem egy szép megoldás.
A legjobb megoldás persze az, ha PostgreSQL-re váltasz, ami egy tényleg igen jó adatbáziskezelő, ellentétben a szutyok MySQL-lel. Postgresben van egyrészt szekvencia, másrészt az INSERT utasításhoz lehet RETURNING-et írni, ami visszaadja, hogy milyen érték íródott a táblába...
rollup helyett van WITH pl, ami sokkal univerzálisabb, lásd például itt:
az insert...set-nek meg én nem sok értelmét látom...
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!