MySQL - elágazó tranzakció

MySQL - elágazó tranzakció
2009-10-30T16:40:51+01:00
2009-10-30T17:35:27+01:00
2022-11-15T12:05:43+01:00
inf3rno
Üdv.

Van egy problémám, amihez keresem az eszközt.
Van egy beléptető és egyuttal regisztráló oldalam. A különbség annyi, hogy a regisztrációhoz a jelszót 2x kell megadni.

A problémám a regisztrációval van. Egyrészt ellenőriznem kell, hogy létezik e már az email cim, amihez reggelnek, másrészt gondolom, hogy ha már ugyanarra a cimre reggel valaki, akkor csak elfelejtette, hogy már reggelt. Ezért ilyenkor ahelyett, hogy a szokásos "már létezik felhasználó az email cimhez" szöveggel visszaléptetném, szeretném ha belépne az illető.
Ha nem létezik a felhasználó, akkor viszont felvinném az email cimet és a jelszót.
Mindkét esetben a felhasználó id-je (primaryKey,autoIncrement) ami vissza kell, hogy jöjjön.

Nos ezt egymás utáni querykkel megoldani elég kényelmetlen, ezért gondoltam arra, hogy utánanézek a tranzakciókezelésnek, viszont nem vagyok biztos benne, hogy mindezt tranzakcióval meg lehet csinálni, vagy egyáltalán az a legjobb megoldás a témára. Szóba jöhet még nálam tárolt eljárás is.

Egyelőre útmutatás kéne, hogy mi a jó megoldás, és miért, mert nincs sok tapasztalatom adatbázis kezeléssel, tranzakciókkal meg tárolt eljárásokkal meg abszolut semmi.
Mutasd a teljes hozzászólást!
Ha egy banki alkalmazást fejlesztenél, akkor megérteném a dologt, de egyébként ez fölösleges óvatosság. A legtöbb szolgáltató amúgyse támogatja mysql-ben az innodb-t, szal nem fogsz tudni tranzakció kezelést használni.

De ha nagyon szeretnéd, még akkor sem kell elágazás a tranzakció kezelésbe, tárolt eljárás pedig nem lesz jó, hiszen nem csak db hiba lehet, hanem egyéb hiba is.

select - email cím meglétének ellenőrzése
az elágazás itt php-ban lesz
begin transaction
insert
select last_insert_id
commit

Mutasd a teljes hozzászólást!

  • szerintem az ilyesmit phpban kell megoldani nem sqlben
    Mutasd a teljes hozzászólást!
  • 3 sor phpben, mysql oldalon pedig nem 3 sor.

    ha user már regisztrált, de a jelszó helyes, akkor beléptetheted.

    Ha rossz a jelszó, készíthetsz egy 'jelszó reset' feature -t, linkben küldesz az emailcímére egy linket, ha rákattint beadhat új jelszót.
    Mutasd a teljes hozzászólást!
  • Hát én link helyett berakom sessionbe a hibára vonatkozó adatokat, aztán átiránytom a beviteli oldalra, ami kirja a hibaüzit. Nem is ez a gondom, hanem az, hogy az user mit lát abból, ha db hiba van. A jelszónál még oké, mert azt ki tudom iratni, viszont ha regisztrál az illető, aztán a felhasznalo_id-t nem tudom visszaadni, mert ott megszakad a kapcsolat, akkor az adatbázisba bekerül a dolog, de a felhasználó nem értesül róla, hogy ő most reggelve van, meg be is lépett, mert az id-je nem került bele a sessionbe. Ilyenkor szeretnék rollbackelni. Szóval az új user insertjét és az userid lekérését tenném egy tranzakcióba. Ez érthető?
    Mutasd a teljes hozzászólást!
  • Hát egy részét mindenképp.
    Mutasd a teljes hozzászólást!
  • A tranzakciókban is egymás után query-k vannak. A tranzakció abban különbözik a lekérdezések szimpla sorozatától, hogy az esetleges adatmódosítások csak a tranzakció lezártával véglegesítődnek, vagy egyik módosítás sem teljesül.

    Amit te szertnél, arra a tranzakció nem igazán jó, mert max 1db insert van benne (új felhasználó létrehozása), azt meg minek önmagában tranzakcióba tenni?

    Igazából itt max 3 db sql utasítás van:

    select - email cím ellenőrzése
    insert - új felhasználó beszúrása
    select - last_insert_id() lekérdezése

    Az 1. select normális megírásával pedig létező e-mail cím esetén már nincs probléma, bár fogalmam sincs, hogy mi szükséged lenne az esetben a felhasználó id-jére.

    Sztenderd megoldás:

    select count(*) from felhasznalok where email=...
    Ha ez 0, akkor insert, ha 1, akkor átirányítod ahová akarod. De a select-be beteheted a userid-t is és akkor az is visszajön (select email, userid from felhasznalok where email=...).
    Mutasd a teljes hozzászólást!
  • Ha egy banki alkalmazást fejlesztenél, akkor megérteném a dologt, de egyébként ez fölösleges óvatosság. A legtöbb szolgáltató amúgyse támogatja mysql-ben az innodb-t, szal nem fogsz tudni tranzakció kezelést használni.

    De ha nagyon szeretnéd, még akkor sem kell elágazás a tranzakció kezelésbe, tárolt eljárás pedig nem lesz jó, hiszen nem csak db hiba lehet, hanem egyéb hiba is.

    select - email cím meglétének ellenőrzése
    az elágazás itt php-ban lesz
    begin transaction
    insert
    select last_insert_id
    commit

    Mutasd a teljes hozzászólást!
  • Sessionben id alapján szeretném letárolni, nem email cim alapján.
    Mutasd a teljes hozzászólást!
  • A legtöbb szolgáltató amúgyse támogatja mysql-ben az innodb-t, szal nem fogsz tudni tranzakció kezelést használni.

    Ez viszont igaz, most nézem, hogy csak myisamot tud a szerver, szóval a tranzakció ugrott, hacsak nem átteszem pgsqlre. (Amit most nem szeretnék.)
    Mutasd a teljes hozzászólást!
  • És szerinted mi a francért írtam a select last_insert_id()-t????? Vagy php-ból simán mysql_insert_id(). Az 1. select-be meg azt a mezőt teszed bele, amit csak szeretnél.
    Mutasd a teljes hozzászólást!
  • Konkrétan erre irtam.
    Az 1. select normális megírásával pedig létező e-mail cím esetén már nincs probléma, bár fogalmam sincs, hogy mi szükséged lenne az esetben a felhasználó id-jére.

    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd