|
| 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 |
| | |
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(""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(""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
| |
|
|