rekenfout
ik heb hier een deel van een mysql query. de oorspronkelijke code is nogal omvangrijk, maar die werkt prima. de fout ligt echt hier
het probleem is dat de computer zich lijkt te verrekenen. voor elke willekeurige waarde van $times['amount'] EN voor elke willekeurige waarde van $ready, komt er ALTIJD 1 uit. (getest voor waardes 1-10 voor $times['amoun'] en 1-5 voor $ready)
nu is de vraag, hoe kan dit? mij lijkt dat een computer zich niet kan verrekenen, dus dat dit een programmeerfout is. ik heb al een aantal andere dingen geprobeerd, bijvoorbeeld de berekening buiten de query te halen, maar dit lost allemaal niets op.
het probleem is dat de computer zich lijkt te verrekenen. voor elke willekeurige waarde van $times['amount'] EN voor elke willekeurige waarde van $ready, komt er ALTIJD 1 uit. (getest voor waardes 1-10 voor $times['amoun'] en 1-5 voor $ready)
nu is de vraag, hoe kan dit? mij lijkt dat een computer zich niet kan verrekenen, dus dat dit een programmeerfout is. ik heb al een aantal andere dingen geprobeerd, bijvoorbeeld de berekening buiten de query te halen, maar dit lost allemaal niets op.
Gewijzigd op 08/01/2012 14:17:57 door Jeroen vd
Gesponsorde koppelingen:
zijn $times['amount'] en $ready wel integers/floats/doubles ? kan zijn dat het mis gaat omdat de var wordt gezien als een String.
Hoe heb jij dan het veld amount gedefinieerd in de datbase tabel.
-> show create table <tabelnaam>
In feite wordt ($times['amount'] - $ready) berekend door php en niet door de database engine.
Dus voor de database engine staat er gewoon UPDATE x SET amount = '9' WHERE id = 1
-> show create table <tabelnaam>
In feite wordt ($times['amount'] - $ready) berekend door php en niet door de database engine.
Dus voor de database engine staat er gewoon UPDATE x SET amount = '9' WHERE id = 1
Typecast ze even naar een string:
Om problemen met strings op te lossen.
En backtricks (`) horen niet in een query. Ze zijn bedoelt zodat je ook kolomnamen kan hebben met reserved words, maar het is fout om reserved words te gebruiken en dat moet je dus nooit doen en daarom heb je geen backtricks nodig.
Om problemen met strings op te lossen.
En backtricks (`) horen niet in een query. Ze zijn bedoelt zodat je ook kolomnamen kan hebben met reserved words, maar het is fout om reserved words te gebruiken en dat moet je dus nooit doen en daarom heb je geen backtricks nodig.
Gewijzigd op 08/01/2012 15:28:48 door Wouter J
PHP doet niet zo moeilijk:
Geeft gewoon: `amount` = '11'
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$times['amount'] = '45en5';
$ready = "34aap";
echo "`amount` = '" . ($times['amount'] - $ready) . "'";
?>
$times['amount'] = '45en5';
$ready = "34aap";
echo "`amount` = '" . ($times['amount'] - $ready) . "'";
?>
Geeft gewoon: `amount` = '11'
</php staat er wat is dat
@pepijn, ga nou niet stoer doen dat je ook een typfout hebt ontdekt. Iedereen weet dat er <?php staat maar hij per ongeluk de shift niet heeft ingedrukt en dan komt er </php...
ik weet zeker dat deze waarden integers zijn. als ik ze hard coded invoer, gebeurd er namelijk precies hetzelfde. de tabel in de database heeft een veld met naam amount met als eigenschap INT(4).
@wouter, waar zorgen die (int) voor?
@wouter, waar zorgen die (int) voor?
Echo de query, plaats deze hier en voer deze eens uit in phpmyadmin?
@Jeroen, hiermee kun je typecasten. Dat betekend dat je forceert dat een variabele of waarde een bepaald type heeft. Voorbeelden:
Ik neem aan dat bij aftrekken de variabelen automatisch naar int worden getypecast. Een tekst van een tekst aftrekken lijkt me vrij betekenisloos :-P .
@SanThe, dat komt omdat (int) 'jan' 1 wordt en (int) 'piet' 1 en 1-1=0
wanneer ik dit in php doe:
geeft hij als uitvoer:
`amount` = '9'
en vervolgens de database op deze manier updaten lukt ook.
Toevoeging op 08/01/2012 17:15:39:
en toch doet hij het in de hele code fout...
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$times['amount'] = 10;
$ready = 1;
echo "`amount` = '" . ($times['amount'] - $ready) . "'";
?>
$times['amount'] = 10;
$ready = 1;
echo "`amount` = '" . ($times['amount'] - $ready) . "'";
?>
geeft hij als uitvoer:
`amount` = '9'
en vervolgens de database op deze manier updaten lukt ook.
Toevoeging op 08/01/2012 17:15:39:
en toch doet hij het in de hele code fout...
Wouter J op 08/01/2012 17:02:24:
@SanThe, dat komt omdat (int) 'jan' 1 wordt en (int) 'piet' 1 en 1-1=0
Wel een beetje serieus blijven, toch?
Wel leuk bedacht.
Gewijzigd op 08/01/2012 17:17:43 door - SanThe -
Wouter J op 08/01/2012 17:02:24:
@SanThe, dat komt omdat (int) 'jan' 1 wordt en (int) 'piet' 1 en 1-1=0
Ja, inderdaad. PHP is slimmer dan je denkt en kan ook met geschreven getallen rekenen hoor, probeer maar eens:
;) :D
Jeroen vd op 08/01/2012 17:15:14:
en toch doet hij het in de hele code fout...
Dan doe je toch ergens iets niet helemaal goed.
Laat de hele query eens zien en de regels waarop je de $vars vult.
Jeroen vd op 08/01/2012 17:15:14:
wanneer ik dit in php doe:
geeft hij als uitvoer:
`amount` = '9'
en vervolgens de database op deze manier updaten lukt ook.
Toevoeging op 08/01/2012 17:15:39:
en toch doet hij het in de hele code fout...
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$times['amount'] = 10;
$ready = 1;
echo "`amount` = '" . ($times['amount'] - $ready) . "'";
?>
$times['amount'] = 10;
$ready = 1;
echo "`amount` = '" . ($times['amount'] - $ready) . "'";
?>
geeft hij als uitvoer:
`amount` = '9'
en vervolgens de database op deze manier updaten lukt ook.
Toevoeging op 08/01/2012 17:15:39:
en toch doet hij het in de hele code fout...
Ik doel dan ook op de complete query.
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
//$buildingtime en $ready
$buildingtime = (($times['time_ready'] - $times['time_started']) / $times['amount']);
$ready = floor((time() - $times['time_started']) / $buildingtime);
// de query
$timesupdatequery = "UPDATE `buildtimes` SET `time_started` = '" . ($times['time_started'] - ($ready * $buildingtime)) . "', `amount` = '" . ($times['amount'] - $ready) . "' WHERE `username` = '" . $username . "'";
// als dit gelukt is
header ("Location: building.php?building=" . $building);
?>
//$buildingtime en $ready
$buildingtime = (($times['time_ready'] - $times['time_started']) / $times['amount']);
$ready = floor((time() - $times['time_started']) / $buildingtime);
// de query
$timesupdatequery = "UPDATE `buildtimes` SET `time_started` = '" . ($times['time_started'] - ($ready * $buildingtime)) . "', `amount` = '" . ($times['amount'] - $ready) . "' WHERE `username` = '" . $username . "'";
// als dit gelukt is
header ("Location: building.php?building=" . $building);
?>
$times is een array die met mysql_fetch_array uit de database komt met velden time_started, time_ready, amount en user. $buildingtime is hier de tijd die nog nodig is om iets te bouwen. $ready is hoeveel er al klaar zijn. vervolgens wordt er naar dezelfde pagina toe geredirect. $building en $user worden doorgegeven via get en session.
Toevoeging op 08/01/2012 17:25:05:
de hele query in de database (met ingegeven waarden) doet ie ook goed...
@Ozzie, :D
@Jeroen, zoals ik al zei moet je backtricks niet gebruiken in een query. En getallen horen in PHP niet tussen quotes en in SQL dus ook niet, dus niet time_started = '13' maar time_started = 13
Kun je misschien de echo van de query hier ook posten (dus als de variabelen ook erin staan). Dus hoe de query er uit ziet?
@Jeroen, zoals ik al zei moet je backtricks niet gebruiken in een query. En getallen horen in PHP niet tussen quotes en in SQL dus ook niet, dus niet time_started = '13' maar time_started = 13
Kun je misschien de echo van de query hier ook posten (dus als de variabelen ook erin staan). Dus hoe de query er uit ziet?
moge ik vragen waar $timesupdatequery aan _query wordt gevoerd??? Of laat je dat gewoon achterwege vanwege het magische?
En ik hoop dat er na de header ook nog een exit; volgt, anders heb je ook nog eens kans dat er zaken gebeuren die je niet wilt laten gebeuren.
En ik hoop dat er na de header ook nog een exit; volgt, anders heb je ook nog eens kans dat er zaken gebeuren die je niet wilt laten gebeuren.



