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.)
@Frank, ik dacht juist dat dat netjes was door alles netjes te checken e.d. Maar het is een handige tip en ik heb het gebruikt. Betreft tip 1, ik vindt de for each nog al lastig :P, ik wil het eerst zo goed hebben en daarna misschien in een for each zetten.
tip 2: Ik zit er aan te denken te verhuizen naar een andere host waar WEL PostgreSQL is en waar ik WEL in mijn php.ini kan.
@Robert volgens mij werkt mijn transactie alleen zit er toch nog ergens een foutje.
<?php
//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';
}
//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', '1', '" . $activationcode . "')";
$insert_member = mysql_query($query_member);
$userid = mysql_insert_id();
//profiel tabel updaten
$query_profile = "INSERT INTO
profile
('id')
VALUES
('". $userid ."')";
$insert_profile = mysql_query($query_profile);
//settings tabel updaten
$query_settings = "INSERT INTO
settings
('id')
VALUES
('". $userid ."')";
$insert_settings = mysql_query($query_settings);
//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);
echo 'er ging wat fout';
}
}
?>
Ik krijg 'er ging wat fout' te zien. Dit is natuurlijk goed waardoor er helemaal nergens wat in mijn DB komt te staan, maar ik kan nergens een fout vinden. Ook mijn debugger geeft niks aan.
Tja, jij voert eerst 3x een query uit zonder te controleren of deze is gelukt. Wanneer nummer 1 mislukt, heeft het geen enkele zin nummer 2 en 3 nog uit te voeren, je moet toch al een ROLLBACK uitvoeren.
Hier een simpel voorbeeldje dat je verder zelf mag uitwerken:
<?php
$aQuery = array(
"START TRANSACTION",
"SELECT * FROM tabel",
"SELECT * FROM tabel",
"SELECT * FROM tabel",
"SELECT * FROM tabel",
"COMMIT"
);
foreach ($aQuery as $query) {
if(!mysql_query($query)){
echo 'Query mislukt: '.mysql_error();
mysql_query('ROLLBACK');
break; // stop de lus!
}
}
?>
@Frank. Ik had er ifjes tussen geplaatst. hij geeft aan dat ze alle 3 mislukken.
[edit]
En nu kan ik de mysql_insert_id(); er toch ook niet meer tussen plaatsen?
[/edit]
[edit 2]
Query mislukt: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''id', 'username', 'password', 'emailadress', 'rank', 'active', '
[/edit]
En nu kan ik de mysql_insert_id(); er toch ook niet meer tussen plaatsen?
Waarom niet? Je moet even zorgen dat binnen de lus de waarde wordt opgevraagd en in de query wordt gezet. En dat is allemaal mogelijk. Ik gaf je slechts een voorzetje, geen kant-en-klare code.
Een kolomnaam zet je nooit tussen quotes, backtics of andere zooi.
Hier een voorbeeldje hoe je eenvoudig een variabele in de query kunt zetten en binnen de lus kunt vervangen door een andere waarde:
<?php
$i = 0;
$aQuery = array(
"SELECT * FROM tabel WHERE id = %i",
"SELECT * FROM tabel WHERE id = %i",
"SELECT * FROM tabel WHERE id = %i",
"SELECT * FROM tabel WHERE id = %i",
"COMMIT"
);
$i = 0;
foreach ($aQuery as $query) {
$query = str_replace('%i', $i, $query);
Waarom zouden de kolomnamen in een array moeten? Je zet de queries in een array omdat je zeker weet dat je X queries 1-voor-1 moet uitvoeren. Dan is een array wel zo eenvoudig. Dit heeft echt niks met kolomnamen te maken.
Maar je vervangt nu de %i door 0 --> 1 --> 2 --> 3. Als ik nou de variabelen in een array zet en dan VALUE ('%i') --> en dan $waarden[$i] --> %i++ gebruikt? En hoe krijg ik nou de mysql_insert_id van de eerste INSERT in een variable. want het ID wordt pas duidelijk als hij in een loop zit. En als ik dan een variable in de loop zet veranderd hij dan toch elke keer?
Pepijn, nogmaals ik geef je slechts een voorbeeldje en niet meer dan dat. Ik laat in dit voorbeeld een tellertje lopen om er voor te zorgen dat alle queries toch verschillend zijn. Niet meer en niet minder.
Jij stelt een query op met een aantal variabelen en die noteer jij bv. als %id in de query. Vervolgens ga je de loop in. Query 1 voer je uit, met mysql_insert_id haal je het id op. Met str_replace() kun je vervolgens %id gaan vervangen voor de waarde die je met mysql_insert_id hebt opgehaald. (let er op dat je van de juiste query het id gebruikt!).
Het is al laat voor jou, 5 uur later dan hier, maar wordt toch even wakker. Werk eerst voor jezelf de theorie uit en ga eens wat klooien met lussen, transactions, etc. Het doel wat je voor ogen hebt, moet je even aan de kant zetten, je moet eerst de theorie en techniek onder de knie krijgen. Wanneer je dat voor elkaar hebt, is het oorspronkelijk doel ook binnen handbereik.
Offtopic: Mijn voorbeeld met een transactie en dan 4 SELECT-queries slaat natuurlijk nergens op, er is geen enkel verband tussen de gegevens en er kan ook zonder transactie onmogelijk datacorruptie optreden. En dat is de reden om een transactie te gebruiken. Het ging puur om de lus en het dynamisch aanmaken van de queries, het invullen van de id's.
Dit lijkt me foutloos. Maar toch krijg ik de volgende foutmelding die ik ook in mijn andere script heb.
Query mislukt: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''id') VALUES ('test')' at line 1
Wat kan hier nou fout aan zijn?
[edit]
Kan het wat met mijn host te maken hebben? ik heb mysql 5 -- > daarnaast heb ik de volgende mysql indeling
CREATE TABLE `members` (
`id` int(255) unsigned NOT NULL auto_increment,
`username` varchar(80) NOT NULL,
`password` varchar(32) NOT NULL,
`emailadress` varchar(80) NOT NULL,
`rank` varchar(1) NOT NULL,
`active` varchar(1) NULL,
`activationcode` varchar(30) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;
CREATE TABLE `profile` (
`id` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `settings` (
`id` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;