Heren.

Ik ben bezig met een login scriptje en nu wil ik alle gegevens in een verschillende tabel hebben.

in members moet het volgende komen -->

ID, profiel_ID, settings_id,username, naam, wachtwoord, activatiecode.

nu komt er nog tabel met profiel -->
ID, member_ID,naam etc etc.

settings -->
ID, member_ID //en dan hier wat settings.

Nu wil ik als een member zich zich registreerd en in de verschillende tabellen er nieuwe rijen worden gemaakt en dat het membertabel al geheel wordt ingevult en bij de tabellen profiel en settings het member_ID wordt ingevult. (De ID van tabel members, (die tevens automatisch wordt gegenereerd)).

Als ik dan zoek op google en phphulp(tuts) Kom ik alleen voorbeelden tegen van SELECT in meerdere tabellen. Ik kan absoluut niks vinden van een query die in meerdere tabellen INSERT.

Daarnaast dacht ik innoDB te gebruiken. omdat PostgreSQL niet op mijn server draait. (Teminsten je moest er dingen voor downloaden, en als ik op mijn phpmyadmin kijk ondersteunt hij dat niet.)

Is dit een goedde keuze? Pepijn
Robert schreef op 11.04.2007 10:59
De query werkt van boven naar beneden. Hij doet regel voor regel. Als alles goed gaat, zet die het vast, mislukt 1 van de query's dan geeft die een error en maakt die alles weer ongedaan.

De query heb je goed uitgewerkt, maar dat is ook precies als ik hem in de post erboven heb uitgewerkt.


I know, maar dat was ff met PHP tags enzo dat ik het goed begrijp zo.
Maar hoe Contoleer ik het nu met rollback;?
Als alle queries zijn gelukt (kun je controleren) voer je een COMMIT-query uit en anders een ROLLBACK-query.
Dus simpel gezegt met een ifje? Ben nu op stage ik zou er vanavond naar kijken.


<?php

$query = 

"
START TRANSACTION;
UPDATE account SET balance = balance - 1000 WHERE number = 4;
UPDATE account SET balance = balance - 1000 WHERE number = 3;
UPDATE account SET balance = balance + 1000 WHERE number = 2;
UPDATE account SET balance = balance + 1000 WHERE number = 1;

";
$controleren = mysql_query($query);

if ($controleren == TRUE) {
commit; 
} else {
rollback; }
?>


[edit]
typo
[/edit]



Wat is commit; ? Een PHP-constante? Lijkt mij niet.

Verder kun je op deze manier geen 5 queries in 1x uitvoeren, dat werkt niet met de functie mysql_query(), zie de handleidingen.
@Frank, Als ik alles in 3 Query's doe. Kan ik dan met een commando alles tegelijk checken als de waarde FALSE terug komt een rollback doen?

Het enige wat ik een beetje kan vinden is dit:
naar 1,5 uur te hebben gegoogled

Hoe pas ik nou zoiets toe als ik meerdere query's uitvoer?


<?php
//We moeten een transactie starten in het geval dat er wat fout gaat
$transaction = 'START TRANSACTION';
mysql_query($transaction);

//maak een nieuwe member aan in ons database
$query_member = "INSERT INTO 
					members 
						('id', 'username', 'password', 'emailadress' 'rank', 'active', 'activationcode')
							VALUES 
							('', '" . $username . "', '" . $password . "', '" . $emailadress . "', '1', '" . $activatienummer . "')";
$insert_member = mysql_query($query) or die(mysql_error());
$userid = mysql_insert_id();

//profiel tabel updaten
$query_profile = "INSERT INTO
					profile
					('id')
						VALUES
						('". $userid ."')";
$insert_profile = mysql_query($query_profile) or die(mysql_error());

//settings tabel updaten
$query_settings = "INSERT INTO
					settings
					('id')
						VALUES
						('". $userid ."')";
$insert_settings = mysql_query($query_settings) or die(mysql_error());

//controleren of alle query's goed zijn gegaan.
if ($insert_member == TRUE || $insert_profile == TRUE || $insert_settings == TRUE) {
	//het is goed gedaan. We vertellen dit aan het database.
	$query_good = 'COMMIT';
	mysql_query($query_good);
   } else {
   $query_wrong = 'ROLLBACK';
   mysql_query($query_wrong);
   }
?>

Is dit een beetje de bedoeling?
@Pepijn

Je start transactie door Mysql_query('START TRANSACTION'); te doen.. daarna zet je elke query ook in mysql_query, los van elkaar, dus:
mysql_query($query1);
mysql_query($query2);

enzovoorts..

als je klaar bent nog de mysql_query('COMMIT');

en je bent klaar.
??? Heb je mijn code hierboven gekeken? Nou controleerd hij toch? Kun je mij een stukje code geven. Ik wordt nu erg verward. Op internet staan overal allerlei manieren en ik snap er nou helemaal niks meer van.

Wat is mysql.com toch een *** site. Van hun uitleg snap ik al helemaaal niks.
@Pepijn

ik had inderdaaad niet naar die code gekeken, maar alleen naar je vraag die je daarboven had staan.

Op zich moet je transactie nu werken, maar je doet het niet handig. In je if voor de controle gebruik je || => oftewel OR, maar je moet daar && gebruiken, om ze wanneer ze allemaal zijn gelukt, te Committen.. Nu commit die ook als er maar 1 is gelukt. Maar verder moet het volgens mij goed zijn, uitgaande van die link die je zelf ook had gevonden.
Ik heb echter nog niet zoveel ervaring met de InnoDB engine dat ik dit met zekerheid kan zeggen, dus je kan het gewoon testen. Probeer dit door 2 van de 3 query's goed te laten gaan, en dan de boel aan te roepen. En wissel ook de "foute" query tussendoor, om er zeker van te zijn.
Geef dan een melding wat er gebeurt (echo "Rollback, er is een fout opgetreden") of iets dergelijks. En je weet of het werkt.
or die() hoort niet thuis in een goed script. Daarnaast brengt het je hier in de problemen. Mislukt er een query, laat jij op een brute wijze het script sterven. Jij komt dus nooit toe aan een ROLLBACK, tegen de tijd dat je dat nodig hebt, ligt jouw script op het kerkhof.

or die() dus voor eens en voor altijd uit je scripts verbannen en vergeet dat je dit ooit hebt gebruikt.

Gebruik bv. een counter die het aantal mislukte queries bijhoudt. Zodra deze groter is dan 0, een ROLLBACK uitvoeren.

Tip: Zet de queries in een array en voer ze in een foreach uit. Zodra de teller een error aangeeft, stop je de loop en voer je de rollback uit. Het heeft weinig zin om door te gaan, met 1 error zul je altijd alles terugdraaien. Is alles goed gegaan, doe je een COMMIT.

Tip 2: Met een stored procedure (bv. PL/pgSQL) kun je dit nog veel handiger oplossen. Je voert 1 query uit, met alle data die moet worden opgeslagen, en in de database wordt de hele zooi verwerkt. Gaat een stuk sneller en is een stuk veiliger. Intern wordt er van een transaction gebruik gemaakt, maar daar merk je in de PHP-code niets van. Maakt de PHP-code eenvoudiger.

Reageren