Ongevraagd records aanmaken
Ik had een vraag:
Ik ben een form aan het maken waarmee je wedstrijden kan voorspellen. Dit is ongeveer zoiets als:
<form>
<input name='thuis1' value='echo $huidigeinput'>
<input name='uit1' value='echo $huidigeinput'>
<input name='thuis2' value='echo $huidigeinput'>
<input name='uit2' value='echo $huidigeinput'>
</form>
en zo heb ik dan thuis1, thuis2, thuis3 enzovoorts, afhankelijk van hoeveel wedstrijden er in de database staan, waar ik dit aan heb gekoppeld.
nu heb ik voor het uitvoerscript het volgende:
Quote:
$result = mysql_query("UPDATE voorspellingen
SET thuis='$thuis', uit='$uit' WHERE wedstrijd_id='$wedstrid' AND gebruiker_id='$user'")
or die(mysql_error());
if (mysql_affected_rows()==0) {
$result = mysql_query("INSERT INTO voorspellingen
SET thuis='$thuis', uit='$uit',
wedstrijd_id='$wedstrid', gebruiker_id='$user'")
or die(mysql_error());
}
SET thuis='$thuis', uit='$uit' WHERE wedstrijd_id='$wedstrid' AND gebruiker_id='$user'")
or die(mysql_error());
if (mysql_affected_rows()==0) {
$result = mysql_query("INSERT INTO voorspellingen
SET thuis='$thuis', uit='$uit',
wedstrijd_id='$wedstrid', gebruiker_id='$user'")
or die(mysql_error());
}
En dit werkt aardig. als ik bij thuis1 en uit1 2 en 0 invoer, en ik verander dit naar bijvoorbeeld 3 en 0, dan UPDATE de record, en maakt ie geen nieuwe aan. Dit is de bedoeling ook.
Echter, als ik thuis1 en uit1 met rust laat; en hun waarde van 2 en 0 gewoon behoud, en ik probeer thuis2 en uit2 aan te passen, dan wordt er een nieuwe record aangemaakt, en zie ik bij thuis1 en uit1 in plaats van 2 en 0, 22 en 00. Omdat er dus 2 records zijn van die wedstrijd, met die gebruiker. Wat, volgens het bovenstaande script, niet zou mogen.
Ik hoop dat het een beetje duidelijk is wat ik bedoel.
Is iemand bekend met dit probleem?
Gewijzigd op 23/12/2010 15:48:50 door Mart Oosterveld
Laat ook de beslislogica van je script eens zien... tussen code-tags deze keer graag
Bas Cost Budde op 23/12/2010 17:10:05:
Laat ook de beslislogica van je script eens zien... tussen code-tags deze keer graag
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
<?php
include 'includes/header.php';
?>
<?php if (isset($_SESSION['username'])) {
$user = $_SESSION['username'];
?>
<div id="kolomrechts" style="float: right;">
<h1 style="margin-top: 4px;">Voorspel Statistieken</h1><br />
<p>Je hebt <strong>382</strong> punten.<br/><br/>Daarmee sta je <strong>12e</strong> in het klassement</p>
</div>
<div id="restnieuws">
<?php $curdat = date("YmdGi"); ?>
<?php
if(isset($_POST['voorspel_save'])) {
$query9 = mysql_query("SELECT * FROM wedstrijden ORDER BY datum2 ASC");
while($row = mysql_fetch_array($query9)) {
$datum1 = $row['datum2'] . $row['tijdstip'];
$datum2 = str_replace("-", "", $datum1);
$datum3 = str_replace(":", "", $datum2);
if ($datum3 > $curdat) {
$thuisval = "thuis" . $row['id'];
$thuis = $_POST[$thuisval];
$uitval = "uit" . $row['id'];
$uit = $_POST[$uitval];
if(empty($uit) && empty($thuis)) {
echo "";
}
else {
$wedstrid = $row['id'];
$result = mysql_query("UPDATE voorspellingen
SET thuis='$thuis', uit='$uit' WHERE wedstrijd_id='$wedstrid' AND gebruiker_id='$user'");
if (mysql_affected_rows()==0) {
$result = mysql_query("INSERT INTO voorspellingen
SET thuis='$thuis', uit='$uit',
wedstrijd_id='$wedstrid', gebruiker_id='$user'");
}
}
}
}
}
?>
<form method="POST">
<h1>Ajax Wedstrijden voorspellen</h1><br />
<?php
$query = mysql_query("SELECT * FROM wedstrijden ORDER BY datum2 ASC");
while($row = mysql_fetch_array($query)) {
$datum1 = $row['datum2'] . $row['tijdstip'];
$datum2 = str_replace("-", "", $datum1);
$datum3 = str_replace(":", "", $datum2);
$id = $row['id'];
?>
<div class="meernieuws_item" style="width: 300px; border-bottom: solid 1px #e9e8e8; padding: 5px;">
<?php
if ($datum3 < $curdat) {
?>
<div style="float: left; width: 73px; height: 23px; line-height: 20px;"><?php
$query4 = mysql_query("SELECT * FROM voorspellingen WHERE wedstrijd_id='$id' AND gebruiker_id='$user'");
while($row4 = mysql_fetch_array($query4)) {
$pred = $row4['thuis'] . " - " . $row4['uit'];
}
if(empty($pred)) {
echo "<em>nvt</em>";
}
else {
echo $pred;
}
?></div>
<?php
}
else {
?>
<input value="<?php
$query2 = mysql_query("SELECT * FROM voorspellingen WHERE wedstrijd_id='$id' AND gebruiker_id='$user'");
while($row2 = mysql_fetch_array($query2)) {
echo $row2['thuis'];
}
?>" name="thuis<?php echo $row['id']; ?>" id="thuis" maxlength="2" type="text" style="float: left; width: 20px; margin-right: 10px;" />
<input value="<?php
$query2 = mysql_query("SELECT * FROM voorspellingen WHERE wedstrijd_id='$id'");
while($row2 = mysql_fetch_array($query2)) {
echo $row2['uit'];
}
?>" name="uit<?php echo $row['id']; ?>" id="uit" maxlength="2" type="text" style="float: left; width: 20px; margin-right: 10px;" /> <?php } ?>
<div class="meernieuwstitel" style="float: left;"><?php echo $row['thuis']; ?> - <?php echo $row['uit']; ?></div>
<div class="clear"></div>
</div>
<?php
}
?><br />
<input style="padding: 4px; margin: 10px 0px 0px 10px; background-color: white;
border: solid 1px #d4d4d4; font-size: 11px; color: #8e0000;
background-color: #8e0000; color: white; float: left; height: 26px; margin-top: 3px;"
type="submit" value="opslaan" name="voorspel_save" />
</form>
</div>
<?php
}
else {
header("location: index.php");
}
include 'includes/footer.php';
?>
include 'includes/header.php';
?>
<?php if (isset($_SESSION['username'])) {
$user = $_SESSION['username'];
?>
<div id="kolomrechts" style="float: right;">
<h1 style="margin-top: 4px;">Voorspel Statistieken</h1><br />
<p>Je hebt <strong>382</strong> punten.<br/><br/>Daarmee sta je <strong>12e</strong> in het klassement</p>
</div>
<div id="restnieuws">
<?php $curdat = date("YmdGi"); ?>
<?php
if(isset($_POST['voorspel_save'])) {
$query9 = mysql_query("SELECT * FROM wedstrijden ORDER BY datum2 ASC");
while($row = mysql_fetch_array($query9)) {
$datum1 = $row['datum2'] . $row['tijdstip'];
$datum2 = str_replace("-", "", $datum1);
$datum3 = str_replace(":", "", $datum2);
if ($datum3 > $curdat) {
$thuisval = "thuis" . $row['id'];
$thuis = $_POST[$thuisval];
$uitval = "uit" . $row['id'];
$uit = $_POST[$uitval];
if(empty($uit) && empty($thuis)) {
echo "";
}
else {
$wedstrid = $row['id'];
$result = mysql_query("UPDATE voorspellingen
SET thuis='$thuis', uit='$uit' WHERE wedstrijd_id='$wedstrid' AND gebruiker_id='$user'");
if (mysql_affected_rows()==0) {
$result = mysql_query("INSERT INTO voorspellingen
SET thuis='$thuis', uit='$uit',
wedstrijd_id='$wedstrid', gebruiker_id='$user'");
}
}
}
}
}
?>
<form method="POST">
<h1>Ajax Wedstrijden voorspellen</h1><br />
<?php
$query = mysql_query("SELECT * FROM wedstrijden ORDER BY datum2 ASC");
while($row = mysql_fetch_array($query)) {
$datum1 = $row['datum2'] . $row['tijdstip'];
$datum2 = str_replace("-", "", $datum1);
$datum3 = str_replace(":", "", $datum2);
$id = $row['id'];
?>
<div class="meernieuws_item" style="width: 300px; border-bottom: solid 1px #e9e8e8; padding: 5px;">
<?php
if ($datum3 < $curdat) {
?>
<div style="float: left; width: 73px; height: 23px; line-height: 20px;"><?php
$query4 = mysql_query("SELECT * FROM voorspellingen WHERE wedstrijd_id='$id' AND gebruiker_id='$user'");
while($row4 = mysql_fetch_array($query4)) {
$pred = $row4['thuis'] . " - " . $row4['uit'];
}
if(empty($pred)) {
echo "<em>nvt</em>";
}
else {
echo $pred;
}
?></div>
<?php
}
else {
?>
<input value="<?php
$query2 = mysql_query("SELECT * FROM voorspellingen WHERE wedstrijd_id='$id' AND gebruiker_id='$user'");
while($row2 = mysql_fetch_array($query2)) {
echo $row2['thuis'];
}
?>" name="thuis<?php echo $row['id']; ?>" id="thuis" maxlength="2" type="text" style="float: left; width: 20px; margin-right: 10px;" />
<input value="<?php
$query2 = mysql_query("SELECT * FROM voorspellingen WHERE wedstrijd_id='$id'");
while($row2 = mysql_fetch_array($query2)) {
echo $row2['uit'];
}
?>" name="uit<?php echo $row['id']; ?>" id="uit" maxlength="2" type="text" style="float: left; width: 20px; margin-right: 10px;" /> <?php } ?>
<div class="meernieuwstitel" style="float: left;"><?php echo $row['thuis']; ?> - <?php echo $row['uit']; ?></div>
<div class="clear"></div>
</div>
<?php
}
?><br />
<input style="padding: 4px; margin: 10px 0px 0px 10px; background-color: white;
border: solid 1px #d4d4d4; font-size: 11px; color: #8e0000;
background-color: #8e0000; color: white; float: left; height: 26px; margin-top: 3px;"
type="submit" value="opslaan" name="voorspel_save" />
</form>
</div>
<?php
}
else {
header("location: index.php");
}
include 'includes/footer.php';
?>
Edit: er is nog wel van alles aan te merken op je script.
- je zet onderin header() [wanneer er geen gebruiker in de sessie zit], maar bovenin heb je al uitvoer gemaakt. Redirecten en zo doe je voordat je aan uitvoer begint;
- POST-waarden die je in een query gebruikt, moet je escapen met mysql_real_escape_string();
- voor een datumvergelijking kun je het beste werken met echte datums, maar bij gebrek daaraan mag je best de string in 1x converteren ipv twee extra variabelen aan te maken;
- in query9 (intrigerende naamkeuze) schrijf je beter SELECT id, datum2, tijdstip dan SELECT *;
- een datamodel met kolomnamen als thuis1, thuis2 enz wijst op een ontwerp-in-wording; je moet dit nog normaliseren
Wie volgt?
Gewijzigd op 23/12/2010 17:29:47 door Bas Cost Budde
Ik snap het. Ook al voer ik geen nieuwe waarde in, de form verstuurt de waarde alsnog. Dus, hoe zou ik dit op kunnen lossen? Is er een betere manier om deze code te schrijven?
Zie ook mijn edit hierboven :)