Maximum aan invoegingen aan de database instellen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

06/10/2013 18:09:17
Quote Anchor link
Voor mijn site komt er elk uur wat steen, staal, ijzer en geld bij, afhankelijk van het level van het gebouw.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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();}
?>


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?
 
PHP hulp

PHP hulp

05/01/2025 00:11:23
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

06/10/2013 18:38:27
Quote Anchor link
Jawel, even de trekker voorijden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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 ;

Let op dat dit een DDL statement is dus maar één keer hoeft uitgevoerd worden (net zoals CREATE TABLE)
 

06/10/2013 18:58:07
Quote Anchor link
Moet ik dit gewoon doe met:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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();}
?>


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.?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

06/10/2013 19:22:06
Quote Anchor link
Een trigger is onderdeel van de database structuur, daarom is de query eenmalig en kan je beter in je database tool (PMA wss) uitvoeren. Het gevolg is dat elke keer als je een update uitvoert, controles worden uitgevoerd op hetgeen geupdate wordt.

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
 

06/10/2013 19:58:38
Quote Anchor link
Momenteel krijg ik een error:

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)
 

08/10/2013 21:28:49
Quote Anchor link
Een Bump ^^
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

09/10/2013 11:51:05
Quote Anchor link
Het enige wat ik bedenken waarom je een foutmelding krijgt is dat je dit via php met mysql_query() probeert, en dan gaat het niet in één keer.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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))
Gewijzigd op 09/10/2013 12:02:29 door Ger van Steenderen
 

09/10/2013 15:23:03
Quote Anchor link
Bedankt, Ger! Met de 2e query, van vanmorgen werkt het. (Alleen >= moest <= worden :)) Heel erg bedankt!
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

09/10/2013 17:35:59
Quote Anchor link
Weet je dat zeker? (Alleen >= moest <= worden).
Want als je alleen dat omgedraaid heb krijg je:
Als steen kleiner of gelijk aan 2500 dan steen, anders ....
 

09/10/2013 19:53:57
Quote Anchor link
Je hebt helemaal gelijk inderdaad! Nogmaals Bedankt!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.