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

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Postgres transakrion
Fra : gunner carstens


Dato : 29-07-02 08:01

Jeg har 4 insert sætninger fra en php side som kører sammen (insertelev,
insertforælder, insert_telefonnr insert_mail)
Nu vil jeg gerne have at hvis én af dem fejler, at de så alle sammen fejler
- altså at det kører som én transaktion.
Hvordan gør man det i dette php/postgresql-miljø?
mvh Gunner

 
 
Jakob Andersen (29-07-2002)
Kommentar
Fra : Jakob Andersen


Dato : 29-07-02 08:12

gunner carstens wrote:
> Jeg har 4 insert sætninger fra en php side som kører sammen
> (insertelev, insertforælder, insert_telefonnr insert_mail)
> Nu vil jeg gerne have at hvis én af dem fejler, at de så alle sammen
> fejler - altså at det kører som én transaktion.

<http://www.postgresql.org/idocs/index.php?tutorial-transactions.html>

--
Jakob Andersen
http://www.stresscd.dk - Udnyt stress positivt



Jonas Koch Bentzen (29-07-2002)
Kommentar
Fra : Jonas Koch Bentzen


Dato : 29-07-02 10:38

gunner carstens skrev:
> Jeg har 4 insert sætninger fra en php side som kører sammen (insertelev,
> insertforælder, insert_telefonnr insert_mail)
> Nu vil jeg gerne have at hvis én af dem fejler, at de så alle sammen fejler
> - altså at det kører som én transaktion.
> Hvordan gør man det i dette php/postgresql-miljø?

<?php
require_once("DB.php");

# Forbinder til databasen:
$db = DB::connect("pgsql://brugernavn:adgangskode@vaert/databasenavn");

# Starter en transaktion (svarer til BEGIN i PostgreSQL):
$db->autoCommit(FALSE);

$indsaettelser = array(
   "INSERT INTO tabel VALUES ( 1 )",
   "INSERT INTO tabel VALUES ( 7 )",
   "INSERT INTO tabel VALUES ( 8 )",
   "INSERT INTO tabel VALUES ( 5 )"
);

foreach ($indsaettelser as $indsaettelse) {
   $kommando = $db->query($indsaettelse);

   if (DB::isError($kommando)) $db->rollback();
}

# Alle indsættelser er nået igennem. Nu committer vi:
$db->commit();
?>


gunner carstens (29-07-2002)
Kommentar
Fra : gunner carstens


Dato : 29-07-02 13:13


> <?php
> require_once("DB.php");
>
> # Forbinder til databasen:
> $db = DB::connect("pgsql://brugernavn:adgangskode@vaert/databasenavn");
>
> # Starter en transaktion (svarer til BEGIN i PostgreSQL):
> $db->autoCommit(FALSE);
>
> $indsaettelser = array(
> "INSERT INTO tabel VALUES ( 1 )",
> "INSERT INTO tabel VALUES ( 7 )",
> "INSERT INTO tabel VALUES ( 8 )",
> "INSERT INTO tabel VALUES ( 5 )"
> );
>
> foreach ($indsaettelser as $indsaettelse) {
> $kommando = $db->query($indsaettelse);
>
> if (DB::isError($kommando)) $db->rollback();
> }
>
> # Alle indsættelser er nået igennem. Nu committer vi:
> $db->commit();
> ?>
Takker for alle svar
/gunner


gunner carstens (01-08-2002)
Kommentar
Fra : gunner carstens


Dato : 01-08-02 20:36


> <?php
> require_once("DB.php");
>
> # Forbinder til databasen:
> $db = DB::connect("pgsql://brugernavn:adgangskode@vaert/databasenavn");
>
> # Starter en transaktion (svarer til BEGIN i PostgreSQL):
> $db->autoCommit(FALSE);
Har nu studeret dette svar og fundet ud af hvordan man bruger objects i php


Mangler nu at finde ud af hvordan jeg finder 'DB.php' og hvor jeg finder ud
af hvad 'DB::connect' betyder?

Kan nogen hjælpe med henvisninger (eller forklaringer) på det?

På forhånd tak.
mvh Gunner

Jonas Koch Bentzen (01-08-2002)
Kommentar
Fra : Jonas Koch Bentzen


Dato : 01-08-02 21:41

gunner carstens skrev:
>><?php
>>require_once("DB.php");
>>
>># Forbinder til databasen:
>>$db = DB::connect("pgsql://brugernavn:adgangskode@vaert/databasenavn");
>>
>># Starter en transaktion (svarer til BEGIN i PostgreSQL):
>>$db->autoCommit(FALSE);
>
> Har nu studeret dette svar og fundet ud af hvordan man bruger objects i php
>
>
> Mangler nu at finde ud af hvordan jeg finder 'DB.php'

Hvis du har en forholdsvist ny version af PHP, er den allerede
installeret på din computer. Bruger du Linux, vil den sandsynligvis
befinde sig i /usr/local/lib/php. Bruger du Windows, er den muligvis i
pear-mappen inde i php-mappen.

Men du skal ikke skrive hele stien til den. Du skal tilføje den mappe,
som DB.php ligger i, til PHP's include_path. Den kan rettes i php.ini.

> og hvor jeg finder ud
> af hvad 'DB::connect' betyder?

DB er navnet på klassen. connect() er en metode (funktion) i klassen. De
to koloner betyder, at metoden bliver kaldt direkte (i stedet for, at
man først laver en såkaldt instance af klassen ($db = new DB()) og
derefter kalder metoden ($db->connect()).

Det er sikkert forklaret på http://dk.php.net/manual/en/language.oop.php.

PEAR DB-manualen kan findes på http://pear.php.net/manual/en/core.db.php.

XFUT: dk.edb.internet.webdesign.serverside.php


gunner carstens (01-08-2002)
Kommentar
Fra : gunner carstens


Dato : 01-08-02 22:39


>> Mangler nu at finde ud af hvordan jeg finder 'DB.php'
>
> Hvis du har en forholdsvist ny version af PHP, er den allerede
> installeret på din computer. Bruger du Linux, vil den sandsynligvis
> befinde sig i /usr/local/lib/php.
Ja - Mandrake 8.1. Men der er ikke noget /usr/local/lib/php
og en simpel "locate 'DB.php'" giver ikke noget. SÅ det er vel ikke
installeret. Jeg mener det er php 4.04 der er installeret men er ikke
sikker.

> Men du skal ikke skrive hele stien til den. Du skal tilføje den mappe,
> som DB.php ligger i, til PHP's include_path. Den kan rettes i php.ini.
Min 'include_path' siger bare 'include_path = ' så det er vel bare at putte
den sti ind hvor jeg engang får installeret det rigtige bibliotek.

> DB er navnet på klassen. connect() er en metode (funktion) i klassen. De
> to koloner betyder, at metoden bliver kaldt direkte (i stedet for, at
> man først laver en såkaldt instance af klassen ($db = new DB()) og
> derefter kalder metoden ($db->connect()).
Det giver fint mening. Tak for det.
/gunner

Jonas Koch Bentzen (01-08-2002)
Kommentar
Fra : Jonas Koch Bentzen


Dato : 01-08-02 23:33

gunner carstens skrev:
>>>Mangler nu at finde ud af hvordan jeg finder 'DB.php'
>>
>>Hvis du har en forholdsvist ny version af PHP, er den allerede
>>installeret på din computer. Bruger du Linux, vil den sandsynligvis
>>befinde sig i /usr/local/lib/php.
>
> Ja - Mandrake 8.1. Men der er ikke noget /usr/local/lib/php
> og en simpel "locate 'DB.php'" giver ikke noget. SÅ det er vel ikke
> installeret. Jeg mener det er php 4.04 der er installeret men er ikke
> sikker.

Jeg vil anbefale dig at opgradere til en nyere version af PHP (ikke bare
pga. PEAR - der er også kommet mange andre gode funktioner til).

Hvis du ikke vil det, kan du hente http://pear.php.net/get/DB-1.3.tgz,
oprette mappen /usr/local/lib/php, smide filerne i mappen DB-1.3 derind
og så sætte include_path til /usr/local/lib/php i php.ini.


gunner carstens (05-08-2002)
Kommentar
Fra : gunner carstens


Dato : 05-08-02 18:46

Jonas Koch Bentzen wrote:

> Hvis du ikke vil det, kan du hente http://pear.php.net/get/DB-1.3.tgz,
> oprette mappen /usr/local/lib/php, smide filerne i mappen DB-1.3 derind
> og så sætte include_path til /usr/local/lib/php i php.ini.
>
Har nu prøvet dette og får så:
Failed opening required 'PEAR.php' .
Den kan jeg ikke finde det udpakkede DB-1.3.tgz. Skal jeg så finde endnu en
pakke som jeg kan installere?
mvh Gunner

Jonas Koch Bentzen (05-08-2002)
Kommentar
Fra : Jonas Koch Bentzen


Dato : 05-08-02 19:19

gunner carstens skrev:
> Jonas Koch Bentzen wrote:
>
>
>>Hvis du ikke vil det, kan du hente http://pear.php.net/get/DB-1.3.tgz,
>>oprette mappen /usr/local/lib/php, smide filerne i mappen DB-1.3 derind
>>og så sætte include_path til /usr/local/lib/php i php.ini.
>>
>
> Har nu prøvet dette og får så:
> Failed opening required 'PEAR.php' .

Nå ja, selvfølgelig... Alle PEAR-pakkerne bruger nogle få fælles ting.

> Den kan jeg ikke finde det udpakkede DB-1.3.tgz. Skal jeg så finde endnu en
> pakke som jeg kan installere?

Nej, du skal opgradere din PHP, så bliver PEAR automatisk installeret.


gunner carstens (06-08-2002)
Kommentar
Fra : gunner carstens


Dato : 06-08-02 11:26

Jonas Koch Bentzen wrote:

>
>>># Forbinder til databasen:
>>>$db =
>>>DB::connect(&quot"pgsql://brugernavn:adgangskode@vaert/databasenavn");
>
>>>
>>># Starter en transaktion (svarer til BEGIN i PostgreSQL):
>>>$db->autoCommit(FALSE);
Har nu fået installeret en nyere version af php på en anden maskine og sat
pear.php og DB.php ind i /usr/local/lib/php.

>>>DB::connect(&quot"pgsql://brugernavn:adgangskode@vaert/databasenavn");
Denne linie virker nu og apache (eller hvem det nu er) brokker sig ikke.

Men den anden linie:
>>$db->autoCommit(FALSE);
siger den: call to undefined function autocommit.
Hvad gør jeg nu galt?

mvh Gunner

Jonas Koch Bentzen (06-08-2002)
Kommentar
Fra : Jonas Koch Bentzen


Dato : 06-08-02 19:19

gunner carstens skrev:
>
> siger den: call to undefined function autocommit.
> Hvad gør jeg nu galt?

Godt spørgsmål. Du bruger den nyeste version af PHP, ikke? Og du har
skrevet autoCommit() med stort C, ikke?

Eftersom spørgsmålene handler om PEAR DB, så synes jeg egentlig, du
skulle spørge i gruppen php.pear.general på nyhedsserveren news.php.net.
Dér sidder der mange kompetente folk (blandt andre PEAR-udviklerne).


gunner carstens (06-08-2002)
Kommentar
Fra : gunner carstens


Dato : 06-08-02 22:46

Jonas Koch Bentzen wrote:

> Godt spørgsmål. Du bruger den nyeste version af PHP, ikke?
Øh ... ikke helt klar over det. Hvordan finder jeg ud af dét. Jeg har
installeret Mandrake 8.2 på en iMac og bare bruge alle
standartudviklingsbibliotekerne og så så jeg at der stod 4.1 eller 4.16
eller sådan noget ved php. Men jeg er ikke sikker på at det er den absolut
nyeste version?

>Og du har skrevet autoCommit() med stort C, ikke?
Jo, men fejlmeddelelsen kommer med lille!??

>
> Eftersom spørgsmålene handler om PEAR DB, så synes jeg egentlig, du
> skulle spørge i gruppen php.pear.general på nyhedsserveren news.php.net.
> Dér sidder der mange kompetente folk (blandt andre PEAR-udviklerne).
Det lyder ikke kedeligt. Det tror jeg jeg vil prøve.

Jeg har ledt lidt efter en 'gammel' måde - med pg-exec - at lave
transktioner. Det må da også kunne laves med den ik'?
Tak!
/gunner


Jonas Koch Bentzen (06-08-2002)
Kommentar
Fra : Jonas Koch Bentzen


Dato : 06-08-02 23:52

gunner carstens skrev:
> Jonas Koch Bentzen wrote:
>
>
>>Godt spørgsmål. Du bruger den nyeste version af PHP, ikke?
>
> Øh ... ikke helt klar over det. Hvordan finder jeg ud af dét.

Ser på http://php.net/.



gunner carstens (07-08-2002)
Kommentar
Fra : gunner carstens


Dato : 07-08-02 20:24

Jonas Koch Bentzen wrote:

>
> Ser på http://php.net/.
Takker for hjælpen.
mvh Gunner


Jakob Møbjerg Nielse~ (07-08-2002)
Kommentar
Fra : Jakob Møbjerg Nielse~


Dato : 07-08-02 00:47

gunner carstens wrote:
> Hvordan finder jeg ud af dét.

Kør følgende kode:
<?php phpinfo(); ?>

--
Jakob Møbjerg Nielsen | "Five exclamation marks, the
jakob@dataloger.dk | sure sign of an insane mind."
http://www.jakobnielsen.dk/ | -- Terry Pratchett, Reaper Man
Jeg søger et fuldtidsjob som programmør. Tag et kig på hjemmesiden.



gunner carstens (08-08-2002)
Kommentar
Fra : gunner carstens


Dato : 08-08-02 07:06

Jakob Møbjerg Nielsen wrote:

>
> Kør følgende kode:
> <?php phpinfo(); ?>
>
Wau - dét er fedt. Hele view'et over php indstillingerne.
TAK!
/gunner

Jakob Møbjerg Nielse~ (08-08-2002)
Kommentar
Fra : Jakob Møbjerg Nielse~


Dato : 08-08-02 10:08

gunner carstens wrote:
> Wau - dét er fedt. Hele view'et over php indstillingerne.

Jeg synes det er underligt at der alligevel er så mange der ikke kender
den funktion. IMO bør det være en af de allerførste ting man lærer i
ethvert beginners tutorial om PHP, især fordi det kan vise brugbart info
om serveren, hvis man ikke har adgang til .ini filen.

> TAK!

Jamen, det var så lidt (jeg skrev jo kun 2 linjer .

--
Jakob Møbjerg Nielsen | "Five exclamation marks, the
jakob@dataloger.dk | sure sign of an insane mind."
http://www.jakobnielsen.dk/ | -- Terry Pratchett, Reaper Man
Jeg søger et fuldtidsjob som programmør. Tag et kig på hjemmesiden.



Claus Rasmussen (02-08-2002)
Kommentar
Fra : Claus Rasmussen


Dato : 02-08-02 15:06

Jonas Koch Bentzen wrote:

> # Starter en transaktion (svarer til BEGIN i PostgreSQL):
> $db->autoCommit(FALSE);

Uhm, nej. Det er måske godt nok til Gunners behov, men det er ikke
en "rigtig" transaktion. En "rigtig" transaktion kræver atomicity
/og/ isolation, og ved at sætte auto-commit til false får du kun
atomicity.

Forskellen på atomicity og isolation er, at atomicity kun garanterer
at enten alle eller ingen af dine opdateringer til databasen går
igennem (og implicit: At andre ikke kan se dine transaktioner, før
du committer dem). Isolation er noget helt andet. Det sikrer, at
mens du er i gang med dine opdatering, kan du ikke se _andres_
opdateringer.

For at få isolation, skal du i postgres du bruge

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

(jeg ved ikke hvordan man gør det i PHP).

-Claus


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste