Update niet toelaten voor een tweede keer
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
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!";}
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!";}
Code (php)
1
2
3
4
5
6
7
8
9
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)."'"
?>
$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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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!';
}
}
?>
$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
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)
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
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?';
}
}
?>
// 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
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
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
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)
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
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;
}
}
?>
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
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)
korting_invoeren.php
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
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!';
}
}
?>
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