[PHP/mySQL] koppeltabel probleem

Pagina: 1
Acties:
  • 134 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb 3 tabellen, ik heb ze erg versimpeld zodat je alleen nuttige info heb:

tbl_Project
idProject (primary key) (not null) (auto incr)
idprojecttype (foreign key)(not null)
projectnaam

tbl_ProjectUser
idProjectUser (primary key) (not null) (auto incr)
idUser (foreign key) (not null)
idProject (foreign key) (not null)

tbl_User
idUser (primary key) (not null) (auto incr)
user_id (foreign key) (not null)
voornaam

nu wordt de volgende informatie naar het php script gestuurd:
projectnaam: "mijn Project"
voornaam: "Jan"
user_id = 123
idProjecttype= 555

Het php script maakt een nieuwe user aan (checked eerst of hij al bestaat, maar dat maakt voor nu even niet uit) en hij maakt een nieuw project aan.

Nu moet het script in dezelfde handeling de koppeltabel vullen. Hoe doe ik dat? Ik bedoel, hoe weet ik wat het idProject en idUser is van wat ik net heb aangemaakt? Alleen de keys zijn uniek, dus ik kan niet zoeken op projectnaam of voornaam om de key te vinden (omdat ik dan misschien meerdere records terug krijg).

[ Voor 5% gewijzigd door Verwijderd op 05-07-2004 18:45 ]


Acties:
  • 0 Henk 'm!

Verwijderd

http://www.php.net/mysql_insert_id

Staat gewoon tussen de mysql functies hoor...

[ Voor 42% gewijzigd door Verwijderd op 05-07-2004 18:47 ]


Acties:
  • 0 Henk 'm!

  • DukeMan
  • Registratie: Mei 2000
  • Niet online
geen idee met welke dbms je werkt, maar in MSACCESS en MSSQL heb je hier een functie voor. @@Identity als ik me niet vergis... je krijgt dan het auto increment id terug van de tabel in je sessie (of zo iets, nooit mee gewerkt...) ... geen idee of dit ook in mysql bestaat

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
bedankt, ik wist niet dat die functie bestond :)

Acties:
  • 0 Henk 'm!

Verwijderd

Die functie is geen goed idee. Lees de PHP site er maar op na
mysql_insert_id() converts the return type of the native MySQL C API function mysql_insert_id() to a type of long (named int in PHP). If your AUTO_INCREMENT column has a column type of BIGINT, the value returned by mysql_insert_id() will be incorrect. Instead, use the internal MySQL SQL function LAST_INSERT_ID() in an SQL query.
Je kan, zoals de site al zegt, beter LAST_INSERT_ID() gebruiken in je tweede SQL query.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ja bedankt, maar ik heb dus soms 2 id's die ik terug moet hebben: idProject en idUser. Ik moet dus echt een php functie hebben denk ik :|

En die mysql_insert_id() doet het inderdaad niet goed.

[ Voor 3% gewijzigd door Verwijderd op 06-07-2004 17:40 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
\o/ hij werkt, dit is de oplossing:

$idUser_sql = mysql_query("SELECT LAST_INSERT_ID() as idUser");
$idUser_arr = mysql_fetch_array($idUser_sql);
$idUser = $idUser_arr[idUser];

bedankt :)

programmeren is alleen leuk als het lukt :P

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Verwijderd schreef op 06 juli 2004 @ 17:58:
\o/ hij werkt, dit is de oplossing:
$idUser_sql = mysql_query("SELECT LAST_INSERT_ID() as idUser");
$idUser_arr = mysql_fetch_array($idUser_sql);
$idUser = $idUser_arr[idUser];
bedankt :)
programmeren is alleen leuk als het lukt :P
Beetje overdreven om daar weer een query voor te doen? Ik gebruik heel vaak insert_id en die werkt gewoon ok.

Wat je natuurlijk wel moet doen:
code:
1
2
3
4
5
query1
var id1=mysql_insert_id

query2
var id2=mysql_insertid

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
nou snap ik het niet meer. Ik heb die manier nog eens geprobeerd en zo doet hij het nu ook :)

Dan kan ik inderdaad beter de php functie gebruiken

Acties:
  • 0 Henk 'm!

  • Skef
  • Registratie: April 2001
  • Laatst online: 17-09 09:49

Skef

Ik scheer.me

Even over de tabellen:

tbl_ProjectUser
idProjectUser (primary key) (not null) (auto incr)
idUser (foreign key) (not null)
idProject (foreign key) (not null)

Als je bij deze tabel de kolom idProjectUser nou eens weghaalt, en de idUser en idProject gezamenlijk de primary key maakt. Scheelt je weer een veld, toch? Of is het ook nog zo dat een user voor een bepaalde periode aan een project werkt? En dat ie later ook weer aan dat project gezet kan worden? Dan zou je wellicht ook een startdatum en einddatum aan deze tabel toe kunnen voegen, maar dit is vervolgens ook weer onderdeel van de primary key, aangezien een user m.i. nooit 2x tegelijk aan hetzelfde project werkt ;)

"Computer games don’t affect kids: I mean if Pac-Man affected us as kids, we’d all be running around in darkened rooms, munching magic pills and listening to repetitive electronic music."


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
djluc schreef op 06 juli 2004 @ 18:08:
[...]
Beetje overdreven om daar weer een query voor te doen? Ik gebruik heel vaak insert_id en die werkt gewoon ok.
Hoe dacht je dat mysql_insert_id aan z'n waarde kwam, die voert ook een query uit lijkt mij..

Acties:
  • 0 Henk 'm!

Verwijderd

PrisonerOfPain schreef op 06 juli 2004 @ 21:33:
[...]
Hoe dacht je dat mysql_insert_id aan z'n waarde kwam, die voert ook een query uit lijkt mij..
Nope, uit de docs:
mysql_insert_id() converts the return type of the native MySQL C API function mysql_insert_id() to a type of long (named int in PHP). If your AUTO_INCREMENT column has a column type of BIGINT, the value returned by mysql_insert_id() will be incorrect. Instead, use the internal MySQL SQL function LAST_INSERT_ID() in an SQL query.
mysql_insert_id gebruikt dus de C API functie.

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Voor mijn idee is het gewoon sneller om het met een ingebouwde functie te doen. Al is het alleen maar omdat het C code is. Maar ook de eenvoud er van is gewoon interessant, een query uitvoeren, controleren op errors enzovoorts kost ook allemaal tijd als je het goed wilt doen.

Acties:
  • 0 Henk 'm!

Verwijderd

djluc schreef op 07 juli 2004 @ 00:32:
Voor mijn idee is het gewoon sneller om het met een ingebouwde functie te doen. Al is het alleen maar omdat het C code is. Maar ook de eenvoud er van is gewoon interessant, een query uitvoeren, controleren op errors enzovoorts kost ook allemaal tijd als je het goed wilt doen.
Ik vermoed dat de PHP library code die met de server communiceert met het resultaat van iedere insert query automatisch het laatst toegevoegde insert id terugkrijgt. De php functie hoeft dan alleen maar een getalletje terug te geven. Dus inderdaad lekker efficient.

Nadeel is dat dit geen standaardmanier is, d.w.z. als je naar een andere programmeertaal (ik gebruik naast PHP mestal Perl) overstapt moet je weer een andere methode gaan gebruiken. Die SELECT werkt mooi overal (totdat je naar een ander DBMS overstapt, dan...).

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Naar een andere programmeertaal overstappen is imo niet echt relevant in deze context. Een andere database wel maar daar hebben we database abstraction layers voor ;)

Acties:
  • 0 Henk 'm!

Verwijderd

djluc schreef op 07 juli 2004 @ 10:04:
Naar een andere programmeertaal overstappen is imo niet echt relevant in deze context. Een andere database wel maar daar hebben we database abstraction layers voor ;)
Ik post nou eenmaal meestal vanuit mijn eigen context.

En database abstraction layers kun je meestal herkennen aan het feit dat de functienamen *niet* met mysql_ beginnen ;)
Pagina: 1