Update niet toelaten voor een tweede keer

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Johan Vels

Johan Vels

29/05/2013 15:48:19
Quote Anchor link
Ik heb de volgende code, nou moet die alleen UPDATE uitvoeren als de value 'Nee' is in korting_web.
Dus als de value 'ja' is in korting_web moet die een melding laten zien in de trant van "Bestaat al"
Hoe doe ik dit? Alvast bedankt!

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
mysql_connect("localhost", "root", "") or die("Connection Failed");
mysql_select_db("db")or die("Connection Failed");
$code = $_POST['code'];
$query = "UPDATE employees SET bedrag = bedrag + 5 WHERE code = '$code'";
$query2 = "UPDATE employees SET korting_web = 'Ja' WHERE code = '$code'";
$query3 = "UPDATE employees SET korting = korting + 5 WHERE code = '$code'";
$query4 = "UPDATE employees SET kortingsbonnen = kortingsbonnen + 5 / 500 WHERE code = '$code'";
$query5 = "UPDATE employees SET datum = NOW() WHERE code = '$code'";
if(mysql_query($query)){
echo "De Korting is toegevoegd.";}
else{
echo "Bestaat al!";}
 
PHP hulp

PHP hulp

28/04/2024 21:23:53
 
Donny Wie weet

Donny Wie weet

29/05/2013 17:00:13
Quote Anchor link
Sowieso kan je query veel makkelijker:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$sql
= "UPDATE employees SET
bedrag = '"
.mysql_real_escape_string(bedrag + 5)."',
korting_web = '"
.mysql_real_escape_string('ja')."',
korting = '"
.mysql_real_escape_string(korting + 5)."',
kortingsbonnen = '"
.mysql_real_escape_string(kortingsbonnen + 5/ 500)."',
datum = NOW()
WHERE code='"
.mysql_real_escape_string($code)."'"
?>


Voer eerst een count uit om te kijken of de record wel bestaat, SELECT COUNT(*) WHERE code = $code


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
<?php

$controle
= mysql_query($sql);
if ($controle<= 1){
        $rij = mysql_fetch_assoc($controle);
        //Er is resultaat
        if ($rij['korting_web'] == 'ja'){
        echo 'Deze korting bestaat al!';
        }
else {
        echo 'Korting toevoegen!';
        }
}


?>


Had een foutje

Toevoeging op 29/05/2013 17:04:03:

Probeer een Query altijd snel te houden. Waarom 5 losse query's voor SQL als er maar 1 nodig is :)
Gewijzigd op 29/05/2013 17:03:09 door Donny Wie weet
 
Eddy E

Eddy E

29/05/2013 18:37:52
Quote Anchor link
Inderdaad, die query kan in 1.
Maar vaste data die NIET van de gebruiker komt, hoef je ook niet te escapen.

Dus het kan gewoon direct zo.
Daarnaast heb ik ook wat controles ingebouwd (zoals Donny ook zegt), maar zonder extra query.

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
    // verbinding include je maar

    // maak query makkelijk, zoals Donny doet, maar dan zonder raar gedoe

    $sql = "    UPDATE
                    employees
                SET
                    bedrag = bedrag + 5',
                    korting_web = 'ja',
                    korting = korting + 5,
                    kortingsbonnen = kortingsbonnen + 5 / 500,
                    datum = NOW()
                WHERE
                    code='"
. mysql_real_escape_string($_POST['code']) . "'
                    AND korting_web = 'nee'
                LIMIT 1"
;

    // uitvoeren van de query
    $res = mysql_query($sql);

    // is de query mislukt?
    if($query === false)
    {

        echo 'Query ging fout op regel '. __LINE__ . ': <hr>'.$sql.'<hr>';
    }

    // de query is gelukt
    else
    {
        // zijn er rijen bijgewerkt?
        if(mysql_affected_rows() == 1)
        {

            echo 'Er is 1 rij bijgewerkt, dus perfect gelukt!';
        }

        // geen rijen bijgewerkt
        else
        {
            echo 'Query gelukt, maar niets bijgewerkt (code correct of al korting_web != ja)
                    Dus... BESTAAT AL?'
;
        }
    }

?>


Toevoeging op 29/05/2013 18:42:11:

Even wat andere punten.

Als je een ja/nee-kolom hebt als 'korting_web'... ga dan voor een BOOLEAN die 0/1 heeft. Dat is taalonafhankelijk en neemt minder ruimte in. Daarnaast zal een 0/1 altijd sneller zijn dan een 'ja'/'nee'.
Ik neem aan dat kolom 'datum' een DATE-kolom is?
En dat de kolom 'code' een UNIQUE-index heeft?

Ik weet niet of je bewust bent wat kortingsbonnen = kortingsbonnen + 5 / 500 doet... is het eerst 5 erbij en dan delen door 500? Of gewoon 0,00025 erbij (5/500)? Probeer dat volledig fool-proof te maken.
Meneer Van Dalen Wacht Op Antwoord werkt nog steeds, maar probeer dat niet nodig te maken.

De foutmelding in mijn code op regel 24 moet je alleen krijgen als je aan het testen bent. De 'gasten' geef je die informatie uiteraard niet!
Gewijzigd op 29/05/2013 18:40:33 door Eddy E
 
Donny Wie weet

Donny Wie weet

29/05/2013 20:33:16
Quote Anchor link
Eddy: met die __line__ krijg je dan precies de line te zien waar het fout gaat in het script? Die code ken ik namelijk zelf niet.

Nog even een aanvulling op eddy: Als alternatief voor de error op lijn 24, wat ik altijd doe is een verzonnen error code te maken. Dus die lijn zou ik nummer 1234 geven. Een mail formulier eraan vast maken om zo de mail direct naar je zelf te laten sturen indien het fout is. Dan weet je zelf wat de fout is en de gast krijgt niets te zien. Als je de mysql_error() gebruikt, krijg je te zien in welke tabel de fout zit en zo kan iemand achter je database structuur komen. Dit wil je uiteraard niet zoals eddy zei
 
Eddy E

Eddy E

29/05/2013 20:56:37
Quote Anchor link
Donny Wie weet op 29/05/2013 20:33:16:
Eddy: met die __line__ krijg je dan precies de line te zien waar het fout gaat in het script? Die code ken ik namelijk zelf niet.

Nog even een aanvulling op eddy: Als alternatief voor de error op lijn 24, wat ik altijd doe is een verzonnen error code te maken. Dus die lijn zou ik nummer 1234 geven. Een mail formulier eraan vast maken om zo de mail direct naar je zelf te laten sturen indien het fout is. Dan weet je zelf wat de fout is en de gast krijgt niets te zien. Als je de mysql_error() gebruikt, krijg je te zien in welke tabel de fout zit en zo kan iemand achter je database structuur komen. Dit wil je uiteraard niet zoals eddy zei


Ja, __LINE__ geeft de lijn aan zoals __FILE__ het bestand aangeeft. Kan heel handig zijn om de fout te localiseren.


Zelf gebruik een zelfgemaakte functie sql().
Daarin voer ik alle queries uit, mail ik mezelf (of log ik) alle fouten en ben ik heel wat flexibeler. Resultaat is false of gelijk een fetched array etc.
Ook is het echoën van de query in test-situaties makkelijker:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php

    function sql($query, $echo = false)
    {

        global $mysqli;

        $query = trim(str_replace("\n", '', $query));
        $query = trim(str_replace("\t", '', $query));
        $result = mysqli_query($mysqli, $query);
        $return = array();

        if($echo !== false)
        {

            echo '<pre>QUERY: ' . $query . '</pre>';
        }


        if($result === false AND $echo !== false)
        {

            // mysqli_error($mysqli);
            echo '<p class="error">Er ging iets mis met een query.
                <pre>
                    <--
                    FOUT: '
. mysqli_error($mysqli) . '
                    QUERY: '
. $query . '
                    -->
                </pre>
            </p>'
;
            return false;
        }


        if(substr($query, 0, 6) == 'SELECT')
        {

            while($row = mysqli_fetch_assoc($result))
            {

                if(is_array($row))
                {

                    $temp = array();

                    foreach($row as $key => $val)
                    {

                        $temp[$key] = $val;
                    }
                }


                $return[] = $row;
            }


            return $return;
        }

        else
        {
            return $result;
        }
    }

?>


(licht gewijzigd)
Gewijzigd op 29/05/2013 21:00:19 door Eddy E
 
Johan Vels

Johan Vels

29/05/2013 21:33:34
Quote Anchor link
Bedankt voor de snelle reacties! Heb de code van donny geprobeerd.

Hij UPDATE wel maar de controle korting_web == 'ja' krijg ik niet aan de praat?
Hij output dus altijd de echo 'Korting toevoegen!'

Heb nu het volgende:

korting.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
<form class="form" action="korting_invoeren.php" method="post" name="form">
    <
ul>
        <
li>
            <
label for="code">Unieke Code</label>
            <
input type="text" id="code" name="code"/>
        <
/li>
        <
li>
        <
button class="submit" type="submit">Innen</button>
        <
/li>
    <
/ul>
<
/form>
?>


korting_invoeren.php
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
<?php
mysql_connect("localhost", "root", "") or die("Connection Failed");
mysql_select_db("db")or die("Connection Failed");
$code = $_POST['code'];
$query = "UPDATE employees SET
bedrag = '"
.mysql_real_escape_string(bedrag + 5)."',
korting = '"
.mysql_real_escape_string(korting + 5)."',
korting_web = '"
.mysql_real_escape_string('ja')."',
kortingsbonnen = '"
.mysql_real_escape_string(kortingsbonnen + 5/ 500)."',
datum = NOW()
WHERE code='"
.mysql_real_escape_string($code)."'";


$controle = mysql_query($query);
if ($controle<= 1){
        $rij = mysql_fetch_assoc($controle);
        //Er is resultaat
        if ($rij['korting_web'] == 'ja'){
        echo 'Deze korting bestaat al!';
        }
else {
        echo 'Korting toevoegen!';
        }
}

?>


En de output:

Notice: Use of undefined constant bedrag - assumed 'bedrag' in C:\xampp\htdocs\korting\korting_invoeren.php on line 6

Notice: Use of undefined constant korting - assumed 'korting' in C:\xampp\htdocs\korting\korting_invoeren.php on line 7

Notice: Use of undefined constant kortingsbonnen - assumed 'kortingsbonnen' in C:\xampp\htdocsC:\xampp\htdocs\korting\korting_invoeren.php on line 9

Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\korting\korting_invoeren.php on line 16
Korting toevoegen!

@eddy

Denk dat een BOOLEAN niet gaat werken de korting_web moet op een overzichtpagina zichtbaar zijn als een 'ja/nee'

datum is een DATE-kolom en code heeft een UNIQUE-index. Zou inderdaad bij kortingsbonnen = kortingsbonnen + 0,00025 kunnen doen.

Bedankt voor het meedenken! Ga jou code nu proberen..
Gewijzigd op 29/05/2013 22:33:19 door Johan Vels
 



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.