Maximum aan invoegingen aan de database instellen
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php // Voor de kleurtjes
$setsteen = "UPDATE WD_USER_LOGIN SET Steen = Steen + TIMESTAMPDIFF(HOUR, lastactivity, NOW()) * Steen_level * 50, Staal = Staal + TIMESTAMPDIFF(HOUR, lastactivity, NOW()) * Staal_level * 50, Ijzer = Ijzer + TIMESTAMPDIFF(HOUR, lastactivity, NOW()) * Ijzer_level * 50, Geld = Geld + TIMESTAMPDIFF(HOUR, lastactivity, NOW()) * Geld_level * 70 WHERE user='$uname'";
if(mysql_query($setsteen)){
echo "";}
else{
echo mysql_error();}
?>
$setsteen = "UPDATE WD_USER_LOGIN SET Steen = Steen + TIMESTAMPDIFF(HOUR, lastactivity, NOW()) * Steen_level * 50, Staal = Staal + TIMESTAMPDIFF(HOUR, lastactivity, NOW()) * Staal_level * 50, Ijzer = Ijzer + TIMESTAMPDIFF(HOUR, lastactivity, NOW()) * Ijzer_level * 50, Geld = Geld + TIMESTAMPDIFF(HOUR, lastactivity, NOW()) * Geld_level * 70 WHERE user='$uname'";
if(mysql_query($setsteen)){
echo "";}
else{
echo mysql_error();}
?>
Nu heb ik sinds vandaag een 'Opslag' toegevoegd. Het komt er op neer dat er maximaal 2500 grondstoffen van elk (dus 4x 2500 Grondstoffen) op het account mogen staan. Bij level 2 wordt dit hoger.
De Opslag wordt opgeslagen in de tabel WD_USER_LOGIN met als field naam 'Opslag' en als standaard waarde 2500.
Weet iemand hoe ik een maximum kan hanteren op mijn spel?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DELIMITER $$
CREATE TRIGGER check_materials BEFORE UPDATE ON wd_user_login
FOR EACH ROW
BEGIN
IF
NEW.steen > 2500 THEN SET NEW.steen = 2500;
END IF;
IF
NEW.staal > 2500 THEN SET NEW.staal = 2500;
END IF;
IF
NEW.ijzer > 2500 THEN SET NEW.ijzer = 2500;
END IF;
IF
NEW.geld > 2500 THEN SET NEW.geld = 2500;
END IF;
END;$$
DELIMITER ;
CREATE TRIGGER check_materials BEFORE UPDATE ON wd_user_login
FOR EACH ROW
BEGIN
IF
NEW.steen > 2500 THEN SET NEW.steen = 2500;
END IF;
IF
NEW.staal > 2500 THEN SET NEW.staal = 2500;
END IF;
IF
NEW.ijzer > 2500 THEN SET NEW.ijzer = 2500;
END IF;
IF
NEW.geld > 2500 THEN SET NEW.geld = 2500;
END IF;
END;$$
DELIMITER ;
Let op dat dit een DDL statement is dus maar één keer hoeft uitgevoerd worden (net zoals CREATE TABLE)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
$controleopslag = "DELIMITER $$
CREATE TRIGGER check_materials BEFORE UPDATE ON wd_user_login
FOR EACH ROW
BEGIN
IF
NEW.steen > 2500 THEN SET NEW.steen = 2500;
END IF;
IF
NEW.staal > 2500 THEN SET NEW.staal = 2500;
END IF;
IF
NEW.ijzer > 2500 THEN SET NEW.ijzer = 2500;
END IF;
IF
NEW.geld > 2500 THEN SET NEW.geld = 2500;
END IF;
END;$$
DELIMITER";
if(mysql_query($controleopslag)){
echo "";}
else{
echo mysql_error();}
?>
$controleopslag = "DELIMITER $$
CREATE TRIGGER check_materials BEFORE UPDATE ON wd_user_login
FOR EACH ROW
BEGIN
IF
NEW.steen > 2500 THEN SET NEW.steen = 2500;
END IF;
IF
NEW.staal > 2500 THEN SET NEW.staal = 2500;
END IF;
IF
NEW.ijzer > 2500 THEN SET NEW.ijzer = 2500;
END IF;
IF
NEW.geld > 2500 THEN SET NEW.geld = 2500;
END IF;
END;$$
DELIMITER";
if(mysql_query($controleopslag)){
echo "";}
else{
echo mysql_error();}
?>
Of moet ik hier nog dingen aan veranderen?
Ik heb ook nog een paar vragen over de code.
Wat betekend en doet DELIMITER $$?
Wat doet FOR EACH ROW?
Waarom zit voor de grondstoffen NEW.?
De delimiter is omdat je een stukje SQL script gaat uitvoeren, anders denkt mysql dat het afzonderlijke statements zijn. Binnen een trigger voer je een aantal opdrachten uit die beëindigd moeten worden met een puntcomma (;)
Met een trigger heb je twee mogelijkheden.
De waarde die een kolom gaat krijgen na de update/insert is: NEW.kolomnaam
De waarde die een kolom had voor de update/insert: OLD.kolomnaam
Gewijzigd op 06/10/2013 19:28:27 door Ger van Steenderen
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 'DELIMITER $$ CREATE TRIGGER check_materials BEFORE UPDATE ON WD_USER_LOGIN FOR E' at line 1
Ik wil hier ook een 'WHERE' aan toevoegen (Zie bovenstaande code, 3e bericht).
Hoe ga ik hierin te werk? En waarom krijg ik een foutmelding?
Betreft de bovenstaande uitleg:
Ik heb op mijn spel 'Verassings kisten', waarin tot 10.000 Steen en andere grondstoffen inzitten. Gaat de code nu problemen opleveren als het maximum is bereikt?
Waarom staat achter BEGIN geen ;, maar achter END wel?
(Verder bedankt, de uitleg is helder)
Een Bump ^^
De trigger zoals ik hem heb staan heeft als gevolg dat die vier kolommen nooit een waarde kunnen gaan bevatten die groter is dan 2500. Dit geldt over de gehele tabel, welke rij ook geupdate wordt.
Met andere woorden, als je via een andere weg die waarde wilt overschrijden dan gaat dit niet met een trigger, en zal je het in de query zelf moeten gaan doen.
Bijvoorbeeld:
Code (php)
1
2
3
4
2
3
4
UPDATE WD_USER_LOGIN
SET steen = IF(steen >= 2500, steen,
IF((Steen + TIMESTAMPDIFF(HOUR, lastactivity, NOW()) * Steen_level * 50) < 2500,
Steen + TIMESTAMPDIFF(HOUR, lastactivity, NOW()) * Steen_level * 50, 2500))
SET steen = IF(steen >= 2500, steen,
IF((Steen + TIMESTAMPDIFF(HOUR, lastactivity, NOW()) * Steen_level * 50) < 2500,
Steen + TIMESTAMPDIFF(HOUR, lastactivity, NOW()) * Steen_level * 50, 2500))
Gewijzigd op 09/10/2013 12:02:29 door Ger van Steenderen
Bedankt, Ger! Met de 2e query, van vanmorgen werkt het. (Alleen >= moest <= worden :)) Heel erg bedankt!
Want als je alleen dat omgedraaid heb krijg je:
Als steen kleiner of gelijk aan 2500 dan steen, anders ....
Je hebt helemaal gelijk inderdaad! Nogmaals Bedankt!