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.)
mysql_insert_id() gebruik je om het laatst aangemaakt id op te halen, dit kun je vervolgens gebruiken in de INSERT voor een andere tabel.
innoSQL ken ik niet, ik denk dat je innoDB bedoelt. Dat is in MySQL de enige manier om data veilig en relationeel op te slaan. Het is ook aan te raden om een TRANSACTION te gebruiken, wanneer query 2 mislukt, wil je query 1 ook ongedaan maken. Deze gegevens zijn tenslotte van elkaar afhankelijk.
Maar vraag ook eens of jouw provider PostgreSQL wil gaan aanbieden of overweeg zelfs om te verhuizen.
Dit kan inderdaad niet in 1 query, een JOIN werkt niet in een insert/ update query volgens een paar dingen die ik daarmee heb getest.
Hiervoor is het werken met de Transactions zoals Frank al aangaf gewoon de beste oplossing, en die komt het dichtst bij wat je wil:
- Ondanks dat het meerdere query's zijn, krijg je maar 1 keer terug of het goed ging en werkt het ook alleen als de volledige INSERT of UPDATE goed is gegaan.
Dit is niet helemaal slim, en je opzet is niet helemaal goed:
-> Settings en Profile zijn member afhankelijke gegevens, waarom zet je er een aparte id in, in plaats van de member_id als je id te gebruiken. Die zou Uniek moeten zijn, omdat die in de member tabel ook uniek is.
Als je dat op zo'n manier doet, hoef je ook maar 1 keer je mysql_insert_id() op te halen, omdat je voor de rest van je query's alleen maar het id van de nieuwe user nodig hebt.
[edit]
Voor transacties kan je dekn ik beter op een reactie van Frank wachten, ik begin net een beetje met InnoDB te werken, en moet het nog leren.
Er staat wel iets over in de postgreSQL tutorial die je hier op PHPhulp kan vinden.
[/edit]
[edit]
Waarom zet je eigenlijk je settings/ en profile id ook in je members tabel? In beide tabellen staat je member_id (wat eigenlijk de main key van je tabel zou moeten zijn) Dus je maakt een dubbele koppeling aan.
[/edit]
@Robert, daar heb je helemaal gelijk in. Ik zal het aanpassen. Dit is trouwens ook makkelijker als er een account wordt verwijderd oid.
Ik heb wel iets interresants gevonden: Transactions
[edit]
Ik heb het nu aangepast. Hierdoor heb ik de laastse update query ook niet meer nodig.
@frank, is het de bedoeling dat je boven de query's start transaction; zet. Per Query commit; zet. En op het eind de boel controleerd?
En op de manier hoe Robert het zegt heb je toch geen Foreign-key nodig?
@Robert, daar zat ik ook al naar te kijken. Ik had het gewoon verkeerd aangepakt en niet slim nagedacht. Ik heb dat er al uitgehaald. Wordt jij wat wijzer van die informatie die ik je gaf?
[/edit]
Voor de duidelijkheid, ik heb nu dit:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
//bestanden includen.
require('include/functions.inc.php');
require('include/mkcon.inc.php');
//Controleren of alle velden zijn ingevuld d.m.v een functie
$formCheck = checkInput("username;Username", "password_1;Password #1", "password_2;Password #2", "emailadress;Email adress","subject;Onderwerp", "bericht;Bericht");
if($formCheck != 1) {
echo "The following fields have not been filled in:";
foreach($formCheck as $value) {
echo "-".$value."<br />";
die
} else {
//variabelen aanmaken tegen injections
$activationcode = CreateString(30);
$username = StripVar(". $_POST['username'] .");
$emailadress = IsEmail(". $_POST['emailadress'] .");
//controleren of de wachtwoorden hetzelfde zijn
if ($_POST['password_1'] == $_POST['password_2']) {
$password = md5(StripVar($_POST['password_1']));
} else {
echo 'Your passwords does not match, please try again';
die
}
start 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();
commit;
//profiel tabel updaten
$query_profile = "INSERT INTO
profile
('id')
VALUES
('". $userid ."')";
$insert_profile = mysql_query($query_profile) or die(mysql_error());
commit;
//settings tabel updaten
$query_settings = "INSERT INTO
settings
('id')
VALUES
('". $userid ."')";
$insert_settings = mysql_query($query_settings) or die(mysql_error());
commit;
}
?>
Op de manier waarop ik het zeg heb je wel een foreign key:
Members:id
Profile:member_id -> deze is gekoppeld aan id in tabel members
Settings:member_id -> deze is gekoppeld aan id in tabel members
Verder maak ik op uit de info over transacties dat jij deze vorm moet gebruiken:
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;
commit;
Als 1 van de 2 query's mislukt, dan wordt alles "ongedaan gemaakt" en wordt er niets geüpdate/ of geïnsert. (in het voorbeeld staat nu een update query, maar dat kan dus net zo goed een insert query zijn, geloof ik. Maar dat weet ik dan weer niet zeker en zou je ff moeten proberen)
"
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;
commit;
";
mysql_query($query);
?>
of heb ik het mis?
Werkt de query trouwens ook gerwoon op volgorde van boven naar beneden?
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.