MS-SQL / ODBC SCOPE_IDENTITY() (_mysql_insert_id()_)

Skjámynd

Höfundur
gnarr
Kóngur
Póstar: 6494
Skráði sig: Lau 29. Mar 2003 19:54
Reputation: 313
Staðsetning: Reykjavík
Staða: Ótengdur

MS-SQL / ODBC SCOPE_IDENTITY() (_mysql_insert_id()_)

Pósturaf gnarr » Mið 13. Apr 2005 10:18

Ég er alveg í vandræðum með þetta. Mér bara tekst ekki að fá þetta til að virka. Ég er búinn að prófa þetta:

Kóði: Velja allt

$add_all = "INSERT INTO $table (FOO) values('BAR')";
odbc_exec($conn,$add_all) or die("Villa");
$getid = odbc_exec('SELECT SCOPE_IDENTITY()');
$_SESSION['id'] = $getid;


og þetta:

Kóði: Velja allt

$add_all = "INSERT INTO $table (FOO) values('BAR')";
odbc_exec($conn,$add_all) or die("Villa");
$getid =  odbc_exec('SELECT @@IDENTITY');
$_SESSION['id'] = $getid;


hjálp væri VEL þegin :?


"Give what you can, take what you need."

Skjámynd

Stutturdreki
Of mikill frítími
Póstar: 1702
Skráði sig: Þri 27. Apr 2004 14:03
Reputation: 38
Staða: Ótengdur

Pósturaf Stutturdreki » Mið 13. Apr 2005 10:43

Hmm.. og hvað er það sem virkar ekki?

Insert eða Select?

Geri eiginlega ráð fyrir að það sé Select, þarftu ekki að skilgreina hvaða töflu þú ætlar að ná í Identity gildið úr?

Þarf að fletta þessu upp..



Skjámynd

Höfundur
gnarr
Kóngur
Póstar: 6494
Skráði sig: Lau 29. Mar 2003 19:54
Reputation: 313
Staðsetning: Reykjavík
Staða: Ótengdur

Pósturaf gnarr » Mið 13. Apr 2005 10:46

select virkar ekki. ég ætla að prófa að setja töfluna í svigann. en ég hef hvergi séð það gert þegar ég hef leitað að þessu með google.

ég hef reyndar aldrei fundið neinn sem að er að nota odbc og er að reyna að ná í id :?


*edit*

það virkaði ekki að setja nafnið í svigann


"Give what you can, take what you need."

Skjámynd

Stutturdreki
Of mikill frítími
Póstar: 1702
Skráði sig: Þri 27. Apr 2004 14:03
Reputation: 38
Staða: Ótengdur

Pósturaf Stutturdreki » Mið 13. Apr 2005 11:00

Hmm.. hef aldrei notað þetta en ætti að virka. Fann þetta í MSSql:

T-Sql skrifaði:Examples
This example inserts a row into a table with an identity column and uses @@IDENTITY to display the identity value used in the new row.

INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS 'Identity'


Finn þetta hinsvegar ekki í MySql doc. Ef það kemur 'null' út úr select skipuninni ertu kominn út fyrir scope á insertinu, getur verið að þú þurfir að framkvæma þetta samtímis, þe. í sama odbc_exec.

Getur líka prófað last_insert_id(), svo framarlega sem þú lokar ekki gagnagrunnstenginunni milli þess sem þú gerir insert og þú reynir að ná í id. Þetta á líka að vera "per connection" svo truflast ekki ef það eru margir samtíma notendur.. þú færð alltaf síðasta id sem þú bjóst til..



Skjámynd

Höfundur
gnarr
Kóngur
Póstar: 6494
Skráði sig: Lau 29. Mar 2003 19:54
Reputation: 313
Staðsetning: Reykjavík
Staða: Ótengdur

Pósturaf gnarr » Mið 13. Apr 2005 11:11

Stutturdreki skrifaði:Hmm.. hef aldrei notað þetta en ætti að virka. Fann þetta í MSSql:

T-Sql skrifaði:Examples
This example inserts a row into a table with an identity column and uses @@IDENTITY to display the identity value used in the new row.

INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS 'Identity'




Skoo..

Þetta virkar fínt ef ég slæ beint inní sql-ið. en ef ég geri "odbc_exec("SELECT SCOPE_IDENTITY()");" í ph´p, þá kemur error.

SELECT @@IDENTITY AS 'Identity' er í rauninni bara "lélegri" aðferð til að gera það sama. Ég er búinn að prófa það, og ég fæ sama error.


Stutturdreki skrifaði:Finn þetta hinsvegar ekki í MySql doc. Ef það kemur 'null' út úr select skipuninni ertu kominn út fyrir scope á insertinu, getur verið að þú þurfir að framkvæma þetta samtímis, þe. í sama odbc_exec.

..


Ég þarf að setja id í $getid. hvernig geri ég það ef ég geri þetta samtímis?


Stutturdreki skrifaði:Getur líka prófað last_insert_id(), svo framarlega sem þú lokar ekki gagnagrunnstenginunni milli þess sem þú gerir insert og þú reynir að ná í id. Þetta á líka að vera "per connection" svo truflast ekki ef það eru margir samtíma notendur.. þú færð alltaf síðasta id sem þú bjóst til..


Þetta er MS-SQL, þar af leiðandi get ég ekki notað My-SQL skipanir.
ODBC er líka opið alveg þangað til að maður sendir close skipun á það. :(


"Give what you can, take what you need."

Skjámynd

Stutturdreki
Of mikill frítími
Póstar: 1702
Skráði sig: Þri 27. Apr 2004 14:03
Reputation: 38
Staða: Ótengdur

Pósturaf Stutturdreki » Mið 13. Apr 2005 11:42

Ah.. MSSQL.. áttir að segja það strax.. annarstaðar en í subjectinu á bréfinu sem þú sendir inn :oops:

Hélt þú værir enþá að vesenast í MySql :)

Anyroad, besta leiðin (og sú 'rétta') til að gera þetta er að búa til stored procedure sem skilar id gildinu.

td:
create procedure gnarrInsert
@ValueToInsert1 int
as
insert into [table]([column1]) values(@ValueToInsert1)
select @@identity


edit:
Executing-SQL-Server-Stored-Procedures-With-PHP just in case :)



Skjámynd

Höfundur
gnarr
Kóngur
Póstar: 6494
Skráði sig: Lau 29. Mar 2003 19:54
Reputation: 313
Staðsetning: Reykjavík
Staða: Ótengdur

Pósturaf gnarr » Mið 13. Apr 2005 11:51

ok.. ég skyldi þetta :shock:

:)

væriru til í að útskýra kóðann aðeins? ég veit ekkert hvað ég á að gera við þetta :lol:


*edit*

jæja.. ég les editið þitt og læt þig vita hovrt ég er einhverju nær.


"Give what you can, take what you need."

Skjámynd

Höfundur
gnarr
Kóngur
Póstar: 6494
Skráði sig: Lau 29. Mar 2003 19:54
Reputation: 313
Staðsetning: Reykjavík
Staða: Ótengdur

Pósturaf gnarr » Mið 13. Apr 2005 13:08

nope.. engu nær :oops:


"Give what you can, take what you need."

Skjámynd

Stutturdreki
Of mikill frítími
Póstar: 1702
Skráði sig: Þri 27. Apr 2004 14:03
Reputation: 38
Staða: Ótengdur

Pósturaf Stutturdreki » Mið 13. Apr 2005 13:10

Editið var bara eitthvað sem ég fann um hvernig á að kalla á MSSql stored procedures úr PHP, sýna reyndar líka hvernig á að búa procedure til.

Þegar þú ert búinn að búa til procedure er hann geymdur í gagnagrunninum og þú getur kallað í hann aftur og aftur og aftur .. etc. Þú átt að nota procedures, td. þegar þú villt ekki að notendur hafi beinan aðgang af töflunni þinni. Einnig eru þeir (yfirleitt) öflugrri og hraðvirkari. Procedures tryggja líka ákveðið öryggi því það er ekki hægt að setja inn sql skipanir sem færibreytu. Td.:

bjánaleg leið til að aðgreina eftirfarandi frá meginmáli.. skrifaði:Ert með loggin síðu sem skilar þeir tveim færibreytum, @username og @password, og sendir þær beint í gagnagrunninn:

select * from users where username = '@username' and '@password'

svo ert checkað á því hvort select skipuninn skili færslu eða ekki.

Ef það er slegið inn jón og mús í username/password verður fyrirspurnin:

select * from users where username = 'Jón' and password = 'mús'

En, ef þú hinsvegar slærð bara inn ' or 1==1 ' (ath, með ' ) verður fyrirspurnin:

select * from users where username = '' or 1==1 ' and password = ''

Sem er alltaf satt og kerfið myndi halda að fyrsti notandinn sem select * from users skilar hafi loggað sig inn í kerfið þitt. and password = hlutinn breytist í streng og er því aldrei framkvæmdur. Eina sem er gert er athugað hvort username sé tómur strengur eða 1==1, sem er náttúrulega alltaf satt.

Með því að nota procedures er komið í veg fyrir að þetta sé hægt.. en þetta er kannski aðeins út fyrir efnið.

Það sem þessi procedure (gnarrInsert) gerir er að taka eina int breytu og inserta henni í einhverja töflu, og skilar svo @@identity gildinu. Ef þú myndir búa hann til geturðu prófað hann með:

exec gnarrInsert 1

Þú getur haft eins margar færibreytur og þú villt. Procedure skila líka öllum gildum úr öllum select skipunum sem hann inniheldur, nema það sé um gildisveitingu að ræða (td.: select @breyta = dálkir from ..)

Þetta var kannski svoldið almennt með alltof löngu hliðarspori um öryggi en ef þú kemur með nákvæmari spurningar þá skal ég reyna að gefa nákvæmari svör :) .. og nenni kannski að lita sqlið.

edit:
Sko, pointið er að þú býrð til procedure í grunninum þínum og notar svo mssql_init(), mssql_bind() og mssql_execute() til að kalla í hann úr PHP. Get skrifað þetta fyrir þig ef þú lýsir betur því sem þú ert að gera og gefur mér upp td. töflu skemað sem þú ert að nota.



Skjámynd

Höfundur
gnarr
Kóngur
Póstar: 6494
Skráði sig: Lau 29. Mar 2003 19:54
Reputation: 313
Staðsetning: Reykjavík
Staða: Ótengdur

Pósturaf gnarr » Mið 13. Apr 2005 13:32

Stutturdreki skrifaði:
td:
create procedure gnarrInsert
@ValueToInsert1 int
as
insert into [table]([column1]) values(@ValueToInsert1)
select @@identity



væriru til í að útskýra þetta aðeins :) ég prófaði að setja þetta í query og þetta fór inn, en ég hef ekki hugmynd um hvert :oops:


"Give what you can, take what you need."

Skjámynd

Stutturdreki
Of mikill frítími
Póstar: 1702
Skráði sig: Þri 27. Apr 2004 14:03
Reputation: 38
Staða: Ótengdur

Pósturaf Stutturdreki » Mið 13. Apr 2005 13:39

Hmm.. ok :)

Þú bjóst til procedure sem heitir "gnarrInsert" og tekur eitt viðfang. Ef þú myndir kalla í hann með td.:

exec gnarrInsert 1

Þá myndi (líklega) koma villa því hann reynir að gera insert í töflu sem heitir "tafla" með dálk sem heitir "column1" .. sem er væntanlega ekki til :)

Ef taflan er hinsvegar til og er með auto increment dálki þá myndi procedurinn skila gildinu fyrir @@identity.

Getur eytt honum aftur með: "drop procedure gnarrInsert" :)

Ertu að nota MSDE eða 'alvöru' SQL server með Enterprice Manager?



Skjámynd

Höfundur
gnarr
Kóngur
Póstar: 6494
Skráði sig: Lau 29. Mar 2003 19:54
Reputation: 313
Staðsetning: Reykjavík
Staða: Ótengdur

Pósturaf gnarr » Mið 13. Apr 2005 14:37

alvöru server með enterprise manager :)

ég held ég sé búinn að fatta þetta.

ég samsagt bý til procedure sem heitir "trallala"

svo geri ég

$getid = odbc_exec('trallala');

og þannig fæ ég id.

en á ég að nota þennann procedure líka itl að setja gögn inní serverinn?

ertu nokkuð með msn? (mitt er á "prófill" síðunni)


"Give what you can, take what you need."

Skjámynd

Stutturdreki
Of mikill frítími
Póstar: 1702
Skráði sig: Þri 27. Apr 2004 14:03
Reputation: 38
Staða: Ótengdur

Pósturaf Stutturdreki » Mið 13. Apr 2005 15:12

gnarr skrifaði:alvöru server með enterprise manager :)
Sagði þetta bara því að þú getur næstum allt með MSDE sem er hægt í fullblown MSSql server, vantar 'bara' grafískt viðmót (og fleirra). Í Enterprise Manager geturðu td. browsað stored procedures..

gnarr skrifaði:en á ég að nota þennann procedure líka itl að setja gögn inní serverinn?
Það væri eðlilegast. Þú ert að ná í @@identity eða scope_identity í beinu framhaldi af insert skipuninni. Með því að setja þetta inn í procedure seturðu gögnin inn í grunninn og færð id til baka.. í einni skipun. Plús aðra kosti stored procedures. Það eru ekki allir sem fara eftir því en það er sagt best ef öll samskipti viðmóts og gagnagrunns fari í gegnum stored procedures.

Oh, svo er öruggar að nota scope_identity, ef það eru tvö eða fleirri insert á sama tíma þá er ekki víst að þú fáir rétt id til baka með @@identity.



Skjámynd

Höfundur
gnarr
Kóngur
Póstar: 6494
Skráði sig: Lau 29. Mar 2003 19:54
Reputation: 313
Staðsetning: Reykjavík
Staða: Ótengdur

Pósturaf gnarr » Mið 13. Apr 2005 15:22

Stutturdreki skrifaði:
gnarr skrifaði:alvöru server með enterprise manager :)
Sagði þetta bara því að þú getur næstum allt með MSDE sem er hægt í fullblown MSSql server, vantar 'bara' grafískt viðmót (og fleirra). Í Enterprise Manager geturðu td. browsað stored procedures..


Mynd
gettu ;)

Stutturdreki skrifaði:
gnarr skrifaði:en á ég að nota þennann procedure líka itl að setja gögn inní serverinn?
Það væri eðlilegast. Þú ert að ná í @@identity eða scope_identity í beinu framhaldi af insert skipuninni. Með því að setja þetta inn í procedure seturðu gögnin inn í grunninn og færð id til baka.. í einni skipun. Plús aðra kosti stored procedures. Það eru ekki allir sem fara eftir því en það er sagt best ef öll samskipti viðmóts og gagnagrunns fari í gegnum stored procedures.

ég held að ég skilji þetta núna :) þetta verður smá föndur.


Stutturdreki skrifaði:[
Oh, svo er öruggar að nota scope_identity, ef það eru tvö eða fleirri insert á sama tíma þá er ekki víst að þú fáir rétt id til baka með @@identity.


ég vissi það :) takk samt.


"Give what you can, take what you need."

Skjámynd

Stutturdreki
Of mikill frítími
Póstar: 1702
Skráði sig: Þri 27. Apr 2004 14:03
Reputation: 38
Staða: Ótengdur

Pósturaf Stutturdreki » Mið 13. Apr 2005 15:51

Well, bætti þér í Messenger.. ættir að fá popup um það.. ef þú hefur einhverjar fleirr spurningar.




gumol
Besserwisser
Póstar: 3929
Skráði sig: Sun 27. Okt 2002 00:12
Reputation: 0
Staðsetning: Kópavogur
Hafðu samband:
Staða: Ótengdur

Pósturaf gumol » Mið 13. Apr 2005 19:04

Ein spurning samt, afhverju ertu að nota MS-SQL?



Skjámynd

Höfundur
gnarr
Kóngur
Póstar: 6494
Skráði sig: Lau 29. Mar 2003 19:54
Reputation: 313
Staðsetning: Reykjavík
Staða: Ótengdur

Pósturaf gnarr » Fim 14. Apr 2005 08:20

Afhverju ekki? :)

Forrit sem ég nota þarf MS-SQL.


"Give what you can, take what you need."