waarde optellen in mysql
nu probeer ik met deze code
mysql_query("UPDATE klaverjassen SET totpunten = '".$row['totpunten']." + $punten WHERE speler = $speler");
met een query haal ik de laatst bekende totpunten op en wil daar de in een formulier op gegeven punten bij optellen. Maar de waarde blijft in het nieuwe record op 0 nul staan
Alvast bedankt voor de hulp.
Luc Gomes
$row['totpunten'], $punten en $speler.
Echo eventueel eens de volledige query.
Heb je foutafhandeling ingebouwd?
1) Geen foutenafhandeling zover ik zie
2) Tenzij $punten een escape heeft is er geen beveiliging en is je script gevoelig voor SQL-Injection
3) Mysql is verouderd, gebruik liever mysqli, of indien je wenst PDO
4) Waarom heb je wel quotes om $row['totpunten'] maar niet om $punten?
5) Wat ik denk is dat je dit zoekt:
Code (php)
1
mysql_query("UPDATE klaverjassen SET totpunten = 'totpunten + $punten' WHERE speler = '".$speler."'");
Beter in mysqli:
En in elk geval, als je wilt optellen betekent het dat het getallen moeten zijn (integers of floats) en dus moet je gewoon helemaal geen quotes gebruiken.
overigens werkt de code van Peter Flos niet helaas
Luc
mysqli is geen andere database, het is alleen een andere functie bibliotheek. Standaard is die tegenwoordig wel geinstalleerd, dus die kan je zonder problemen gebruiken.
Dat de code van Peter niet zou werken was al duidelijk overigens. Maar wat nog steeds wel de vraag is, is wat er in je variabelen zit, zoals Obelix al vroeg. En ook hoe het zit met de foutafhandeling.
$row['totpunten'] geeft het aantal punten van het vorige record van de betreffende speler en $punten zou in de afhandeling van het formulier daarbij moeten worden opgeteld zodat er volgende week een andere waarde hangt aan $row['totpunten']
Luc Gomes op 15/08/2014 16:29:26:
Nog geen fout afhandeling
Je begrijpt natuurlijk dat dat geen handige actie is dan. Hoe wil je nu gaan ontdekken wat er fout gaat als je fouten gewoon laat lopen?
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$sql = "UPDATE klaverjassen
SET totpunten = totpunten + " . (int)$punten ."
WHERE speler = '". $speler ."'" ;
?>
$sql = "UPDATE klaverjassen
SET totpunten = totpunten + " . (int)$punten ."
WHERE speler = '". $speler ."'" ;
?>
waarbij je dan alleen nog moet zorgen dat $speler geen gekkigheid bevat (mysqli_real_escape_string op loslaten, of zeker weten dat het een getal is.)
Aansluitend voor de zekerheid wel een paar keer op F5 drukken om ervan verzekerd te zijn dat het totaal echt klopt.
Laat eens de link zien als je wilt.
Ik ben wel geïnteresseerd. Vooral in de reglementen :)
Jan
Luc Gomes op 15/08/2014 16:29:26:
$row['totpunten'] geeft het aantal punten van het vorige record van de betreffende speler en $punten zou in de afhandeling van het formulier daarbij moeten worden opgeteld zodat er volgende week een andere waarde hangt aan $row['totpunten']
Is dit wat er met echo ook daadwerkelijk getoond wordt of is dit wat er volgens jou in zou moeten zitten?
Code (php)
geen verbinding.
het optellen van de waarden gaat nog steeds niet de echo geeft wel de goede waarde.
hier onder mijn script
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?
$result = mysql_query("SELECT totpunten,totmarsen FROM klaverjassen WHERE speler=speler");
if (!$result) {
echo 'Could not run query: ' . mysql_error();
exit;
}
$row = mysql_fetch_row($result);
$speler = $_GET['speler'];
$punten = $_GET['punten'];
$sql = 'UPDATE klaverjassen
SET totpunten=$row[0]+$punten
WHERE speler=".$speler."';
$retval = mysql_query( $sql );
if(! $retval )
{
die('Could not update data: ' . mysql_error());
}
echo "Updated data successfully\n";
?>
$result = mysql_query("SELECT totpunten,totmarsen FROM klaverjassen WHERE speler=speler");
if (!$result) {
echo 'Could not run query: ' . mysql_error();
exit;
}
$row = mysql_fetch_row($result);
$speler = $_GET['speler'];
$punten = $_GET['punten'];
$sql = 'UPDATE klaverjassen
SET totpunten=$row[0]+$punten
WHERE speler=".$speler."';
$retval = mysql_query( $sql );
if(! $retval )
{
die('Could not update data: ' . mysql_error());
}
echo "Updated data successfully\n";
?>
wat doe ik fout
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$sql = 'UPDATE klaverjassen
SET totpunten=$row[0]+$punten
WHERE speler=".$speler."';
?>
$sql = 'UPDATE klaverjassen
SET totpunten=$row[0]+$punten
WHERE speler=".$speler."';
?>
zie de kleurtjes en besef dat die puntjes concatenate operators van php zijn, maar omdat je de string in php niet afsluit (geen enkele quote achter de dubbele) komen ze nu terecht in je query string. En dat betekent dat je zoekt op een speler wiens naam begint en eindigt met een punt. Ik durf te stellen dat die niet gevonden wordt (maar de query klopt verder dus je krijgt geen foutmelding).
Hoe het wel moet weet je zelf ook wel, dus dat hoef ik niet voor te doen.
Waarom gebruik je bij de databaseverbinding myqli en in de andere code mysql?
Debuggen: echo de query ($sql) en zie wat er dan staat. Is dat wat er staat wat je verwacht? Of, zoals Erwin H aangeeft, wat anders?
Waarom regel 10 en 11?
Je query is onveilig, omdat je nergens controleert of $_GET['punten'] wel een getal is en $_GET['speler'] gebruik je onbeveiligd (--> mysql_real_escape_string).
Wees consequent in het gebruik van " en '
Op regel 4 echo je met ' op andere plaatsen met "
Op regel 2 gebruik je bij mysql " en op regel 14 ineens '
Verder is het nu vermoedelijk voor iedereen erg makkelijk om in een url een naam en punten te zetten, waarna de database wordt geupdate. Pietje of Carla kan dan zijn/haar naam in de url zetten en 100 punten.
Gewijzigd op 17/08/2014 12:36:48 door Obelix Idefix
eerder werd mij aangeraden om mysqli te gebruiken maar mijn hosting provider kan dat volgens mij (nog) niet aan.
Probeerde met mysqli een verbinding te maken en kreeg een fout melding dat de syntax niet werd herkend ofzo.
ik ben een complete beginneling in php dus het ziet er inderdaad best wel rommelig uit. daar moet ik aan werken. dat laatste van pietje of carla is voor mij abacadabra jezal ongetwijfeld gelijk hebben maar hoe beveilig ik dat dan?
Luc
Toevoeging op 17/08/2014 13:09:31:
even off topic of misschien ook wel helemaal niet in:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$sql = 'UPDATE klaverjassen
SET totpunten=$row[0]+$punten
WHERE speler=".$speler."';
?>
$sql = 'UPDATE klaverjassen
SET totpunten=$row[0]+$punten
WHERE speler=".$speler."';
?>
is $spelen een string volgens mij gaat het daarom fout.
Nu heb ik het volgende:
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
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
<script language="javascript" type="text/javascript">
function populateData(id)
{
alert('in populateData');
y = document.getElementById("spelerid");
document.getElementById("speler").value = speler[y.selectedIndex];
}
</script>
<body>
<?php
mysql_connect("localhost", "xxxx", "xxxx") or die("Connection Failed");
mysql_select_db("xxxxx")or die("Connection Failed");
$query = "SELECT * FROM speler";
$result = mysql_query($query);
?>
<select id="spelerid" class="dropdown" onchange="populateData(this.value)">
<?php
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
?>
<option value="<?php echo $line['speler'];?>"> <?php echo $line['speler'];?>
<?php
$id = $line['spelerid'];
$source_name = $line['speler'];
}
?>
</select>
<P><INPUT ID="spelerid" TYPE="TEXT" NAME="spelerid" SIZE="25"></P>
</body>
hierbij is het de bedoeling dat ik uit de speler tabel de speler selecteer en dat ik daar automatisch de bijbehorende ID in de input box krijg tot nu toe krijg ik alleen de alert "in populateData"
Heeft iemand een idee wat hier fout gaat?
Gewijzigd op 17/08/2014 13:52:07 door Luc Gomes
Luc Gomes op 17/08/2014 12:54:07:
eerder werd mij aangeraden om mysqli te gebruiken maar mijn hosting provider kan dat volgens mij (nog) niet aan.
Probeerde met mysqli een verbinding te maken en kreeg een fout melding dat de syntax niet werd herkend ofzo.
Probeerde met mysqli een verbinding te maken en kreeg een fout melding dat de syntax niet werd herkend ofzo.
de kans dat je hostingprovider geen mysqli ondersteunt lijkt me klein. Anders zou ik op zoek gaan naar een ander.
Vermoedelijk heb je ergens een fout in je code zitten.
Maar als je hulp nodig hebt, zul je die moeten geven (of zelf moeten zoeken op internet).
Luc Gomes op 17/08/2014 12:54:07:
dat laatste van pietje of carla is voor mij abacadabra jezal ongetwijfeld gelijk hebben maar hoe beveilig ik dat dan?
Vraag 1 is waarom je met GET werkt en niet met POST in je formulier.
Als je straks een url krijgt als
http://www.mijnwebsite/update.php?naam=pietje&punten=100 is dat door iedereen heel eenvoudig te wijzigen. Ik verander pietje in obelix en 100 en 1000.
Zit die update.php (ik weet niet hoe het bij jou heet) achter een inlogpagina / zit er een beveiliging op? Dan wordt het al wat lastiger. Verder zou ik in ieder geval gaan werken met POST.
Plaats je code aub tussen code-tags ( [.code.] / [/.code.] zonder punten).
Zo is het niet echt leesbaar.
Wat is hier de reden voor?
Heb je nou de andere problemen al opgelost? Of ga je verder met iets, terwijl het vorige nog niet (goed) werkt?
Gewijzigd op 17/08/2014 13:20:35 door Obelix Idefix
Nu bevat de WHERE de speler(naam), in mij formulier selecteer ik de spelers met een dropdown uit de tabel spelers.
Nu wil ik ook het spelerid opnemen in de tabel klaverjassen zodat de getallen op de juiste plaats worden opgeteld als dat al werkt :).
En ja zowel het formulier als "procces.php" zitten achter een inlog beveiliging.
Gewijzigd op 17/08/2014 13:56:34 door Luc Gomes
En pas je vorige post even aan met die code-tags aub.
Gewijzigd op 17/08/2014 13:41:24 door Obelix Idefix
Toevoeging op 17/08/2014 14:23:34:
We komen dichterbij maar het is het nog steeds net niet:
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
<?
$result = mysql_query("SELECT totpunten,totmarsen FROM klaverjassen WHERE speler=speler");
if (!$result) {
echo 'Could not run query: ' . mysql_error();
exit;
}
$row = mysql_fetch_row($result);
echo $row[0];
echo $punten;
$sql = mysql_query("UPDATE klaverjassen SET totpunten = '".$row[0]."' + '".$_GET['punten']."' WHERE speler = '".$_GET['speler']."'");
$retval = mysql_query( $sql );
if(! $retval )
{
die('Could not update data: ' . mysql_error());
}
echo "Updated data successfully\n";
?>
$result = mysql_query("SELECT totpunten,totmarsen FROM klaverjassen WHERE speler=speler");
if (!$result) {
echo 'Could not run query: ' . mysql_error();
exit;
}
$row = mysql_fetch_row($result);
echo $row[0];
echo $punten;
$sql = mysql_query("UPDATE klaverjassen SET totpunten = '".$row[0]."' + '".$_GET['punten']."' WHERE speler = '".$_GET['speler']."'");
$retval = mysql_query( $sql );
if(! $retval )
{
die('Could not update data: ' . mysql_error());
}
echo "Updated data successfully\n";
?>
geeft de volgende foutmelding maar ik kan nergens de '1' vinden in de query.
3546 (totpunten vorige week)
3647 (punten deze week beide met de echo)
Could not update data: 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 '1' at line 1
Ik ben zo vrij geweest om de line leesbaarder te maken.
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$result = mysql_query("SELECT totpunten,totmarsen
FROM klaverjassen
WHERE speler=speler");
?>
$result = mysql_query("SELECT totpunten,totmarsen
FROM klaverjassen
WHERE speler=speler");
?>
En dan doel ik op dat 'WHERE speler=speler'. Dan haal je namelijk alle spelers op.... dat is neem ik aan toch ook weer niet de bedoeling.
En die '1' in je query komt ongetwijfeld voort uit de data die je in de string plakt. Dus als je gewoon naar je code blijft staren kom je die nooit tegen. Wat je (altijd!) moet doen bij een fout in je sql, is de query string echo'en zoals mysql die voor zijn kiezen krijgt. Dus in jouw geval op regel 12 zet je even om te testen:
Code (php)
En leer svp ook af om die hele query om 1 regel te proppen, maakt het zo verschrikkelijk onleesbaar. Een php script schrijf je ook niet op 1 regel, hoewel het voor de parser niets uitmaakt.
Gewijzigd op 17/08/2014 15:00:22 door Erwin H