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.)
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.
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);
}
?>
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);
??? 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.
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.