/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
MySQL - INSERT + UPDATE?
Fra : Jimmy


Dato : 07-05-03 13:50

Hej

Forestil Jer, at man laver en hjemmeside, hvor brugere skal oprettes og at
de skal kunne redigere i deres data.

Dette vil kræve en INSERT og senere en UPDATE.
Skal jeg tilføje/fjerne et felt skal jeg altså vedligeholde to SQL-strenge.

Hvad synes I om denne tilgang til problemet:

En nyoprettelse klares vha. følgende:

INSERT INTO bruger () VALUES ()
SELECT LAST_INSERT_ID() AS Ref_Bruger_ID
UPDATE bruger SET felt1=vaerdi1...WHERE ID = Ref_Bruger_ID


En redigering af data klares med samme SQL-streng:

UPDATE bruger SET felt1=vaerdi1...WHERE ID = Ref_Bruger_ID


Jeg synes selv metoden er smart, da jeg nu kan oprette og redigere data vha.
samme funktion og fordi jeg kun skal vedligeholde een SQL-streng.

Hvad synes I?
Og er der bedre metoder?

Mvh
Jimmy

PS. Har spurgt i dk.edb.database, men der var ingen respons.



 
 
Jonas Koch Bentzen (07-05-2003)
Kommentar
Fra : Jonas Koch Bentzen


Dato : 07-05-03 15:34

Jimmy wrote:
>
> En nyoprettelse klares vha. følgende:
>
> INSERT INTO bruger () VALUES ()
> SELECT LAST_INSERT_ID() AS Ref_Bruger_ID
> UPDATE bruger SET felt1=vaerdi1...WHERE ID = Ref_Bruger_ID
>
>
> En redigering af data klares med samme SQL-streng:
>
> UPDATE bruger SET felt1=vaerdi1...WHERE ID = Ref_Bruger_ID
>
>
> Jeg synes selv metoden er smart, da jeg nu kan oprette og redigere data vha.
> samme funktion og fordi jeg kun skal vedligeholde een SQL-streng.
>
> Hvad synes I?

Grundideen er god.

> Og er der bedre metoder?

Jeg ville foretrække at lave alt databasearbejde vha. PEAR DB
(http://pear.php.net/manual/en/package.database.php#package.database.db).
Med den bruger man sekvenser (svarer lidt til auto_increment'ede
kolonner i MySQL). I ens tabel (f.eks. "brugere" har man så en
id-kolonne, hvis værdi hentes fra sekvensen ("brugere_id_seq"). Koden
ser så sådan her ud:

if (empty($id)) {
   # Der er ikke noget ID, hvilket betyder,
   # at det er en nyoprettelse. Vi giver så
   # brugeren et ID - det henter vi fra
   # sekvensen brugere_id_seq:

   $id = $db->nextId('brugere_id');
}

$db->query('UPDATE brugere SET
   navn = '.$db->quote($_POST['navn']).'
WHERE
   id = '.$db->quote($id).'
');

Princippet i ovenstående er præcis det samme som det, du vil have.
Forskellen er, at metoden med PEAR DB virker med alle databaser, som PHP
understøtter, hvor din kun virker med MySQL (fordi LAST_INSERT_ID() ikke
er en standard-SQL-metode).

Mht. sekvenser er der en beskrivelse af fænomenet på
http://pear.php.net/manual/en/package.database.db.intro-sequences.php.


Jimmy (07-05-2003)
Kommentar
Fra : Jimmy


Dato : 07-05-03 22:35


"Jonas Koch Bentzen" <ingen.email@eksempel.dk> wrote in message
news:b9b5h9$d1d$1@sunsite.dk...
>
> Jeg ville foretrække at lave alt databasearbejde vha. PEAR DB
> (http://pear.php.net/manual/en/package.database.php#package.database.db).
> Med den bruger man sekvenser (svarer lidt til auto_increment'ede
> kolonner i MySQL). I ens tabel (f.eks. "brugere" har man så en
> id-kolonne, hvis værdi hentes fra sekvensen ("brugere_id_seq"). Koden
> ser så sådan her ud:
>
> if (empty($id)) {
> # Der er ikke noget ID, hvilket betyder,
> # at det er en nyoprettelse. Vi giver så
> # brugeren et ID - det henter vi fra
> # sekvensen brugere_id_seq:
>
> $id = $db->nextId('brugere_id');
> }

Stort set samme funktion som jeg har skrevet mig.


> $db->query('UPDATE brugere SET
> navn = '.$db->quote($_POST['navn']).'
> WHERE
> id = '.$db->quote($id).'
> ');

Jep - Også her.


> Princippet i ovenstående er præcis det samme som det, du vil have.

Herligt.
Så må jeg jo have udtænkt noget rigtigt.
Jeg blev blot i tvivl om, hvorvidt det blev anset for at være et hack.


> Forskellen er, at metoden med PEAR DB virker med alle databaser, som PHP
> understøtter, hvor din kun virker med MySQL (fordi LAST_INSERT_ID() ikke
> er en standard-SQL-metode).

Ja det er jo en god ting.
Det vil gøre koden mere portabel.



> Mht. sekvenser er der en beskrivelse af fænomenet på
> http://pear.php.net/manual/en/package.database.db.intro-sequences.php.


Den vil jeg læse ved lejlighed.
Jeg vil f.eks. gerne vide hvordan de kan finde det netop indsatte ID i
samtlige databaser som måske har tusinde samtidige brugere.

Tak for svaret.

Mvh
Jimmy




Jonas Koch Bentzen (07-05-2003)
Kommentar
Fra : Jonas Koch Bentzen


Dato : 07-05-03 22:43

Jimmy wrote:
>
> Jeg vil f.eks. gerne vide hvordan de kan finde det netop indsatte ID i
> samtlige databaser som måske har tusinde samtidige brugere.

Sådan fungerer sekvenser ikke.

Med MySQL indsætter man en række og henter det ID, som rækken er blevet
tildelt.

Med sekvenser reserverer man et ID fra sekvensen og indsætter ID'et i
databasen. Det sidste glemte jeg at gøre i mit eksempel, så nu får du
lige version 1.1 af if-betingelsen:

if (empty($id)) {
   # Der er ikke noget ID, hvilket betyder,
   # at det er en nyoprettelse. Vi giver så
   # brugeren et ID - det henter vi fra
   # sekvensen brugere_id_seq:

   $id = $db->nextId('brugere_id');

   # Indsætter ID'et:

   $db->query('INSERT INTO brugere (
      id
   )
   VALUES (
   '.$db->quote($id).'
   ');
}


Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste