Versio

rekenfout

Overzicht Reageren

Pagina: 1 2 volgende »

Jeroen vd

jeroen vd

08/01/2012 14:13:30
Quote Anchor link
ik heb hier een deel van een mysql query. de oorspronkelijke code is nogal omvangrijk, maar die werkt prima. de fout ligt echt hier

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
</php
`amount` = '" . ($times['amount'] - $ready) . "'
?>


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
 
PHP hulp

PHP hulp

25/05/2012 14:31:47
Gesponsorde koppelingen:
 
Jaron T

Jaron T

08/01/2012 15:12:36
Quote Anchor link
zijn $times['amount'] en $ready wel integers/floats/doubles ? kan zijn dat het mis gaat omdat de var wordt gezien als een String.
 
Noppes Homeland

Noppes Homeland

08/01/2012 15:17:12
Quote Anchor link
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
 
Wouter J

Wouter J

08/01/2012 15:19:20
Quote Anchor link
Typecast ze even naar een string:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
  
  amount = "'". ((int) $times['amount'] - (int) $ready)."'";
  
?>

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
 
- SanThe -

- SanThe -

08/01/2012 15:22:22
Quote Anchor link
PHP doet niet zo moeilijk:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$times
['amount'] = '45en5';
$ready = "34aap";
echo "`amount` = '" . ($times['amount'] - $ready) . "'";
?>


Geeft gewoon: `amount` = '11'
 
Pepijn ---

pepijn ---

08/01/2012 15:44:51
Quote Anchor link
</php staat er wat is dat
 
Wouter J

Wouter J

08/01/2012 15:52:05
Quote Anchor link
@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...
 
Jeroen vd

jeroen vd

08/01/2012 16:41:39
Quote Anchor link
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?
 
Jacco Brandt

Jacco Brandt

08/01/2012 16:45:08
Quote Anchor link
Echo de query, plaats deze hier en voer deze eens uit in phpmyadmin?
 
Wouter J

Wouter J

08/01/2012 16:48:46
Quote Anchor link
@Jeroen, hiermee kun je typecasten. Dat betekend dat je forceert dat een variabele of waarde een bepaald type heeft. Voorbeelden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
    
    var_dump((int) '245'); // wordt 245 als integerer
    var_dump((string) 24); // wordt '24'
    var_dump((array) 'hello world'); // wordt array( [0] => 'hello world' )
    var_dump((int) '24en4'); // wordt 24
?>
 
Pim -

Pim -

08/01/2012 16:57:55
Quote Anchor link
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 -

- SanThe -

08/01/2012 17:00:10
Quote Anchor link
PHP kan het wel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo 'jan' - 'piet';
?>


Geeft 0.
 
Wouter J

Wouter J

08/01/2012 17:02:24
Quote Anchor link
@SanThe, dat komt omdat (int) 'jan' 1 wordt en (int) 'piet' 1 en 1-1=0
 
Jeroen vd

jeroen vd

08/01/2012 17:15:14
Quote Anchor link
wanneer ik dit in php doe:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
    $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...
 
- SanThe -

- SanThe -

08/01/2012 17:17:15
Quote Anchor link
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 -
 
Ozzie PHP

Ozzie PHP

08/01/2012 17:18:43
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
echo 'een' + 'een';
//resultaat 2

echo 'dertig' - 'dertig';
// resultaat 0
?>


;) :D
 
- SanThe -

- SanThe -

08/01/2012 17:20:06
Quote Anchor link
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.
 
Jacco Brandt

Jacco Brandt

08/01/2012 17:23:41
Quote Anchor link
Jeroen vd op 08/01/2012 17:15:14:
wanneer ik dit in php doe:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
    $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.
 
Jeroen vd

jeroen vd

08/01/2012 17:24:18
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>


$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...
 
Wouter J

Wouter J

08/01/2012 17:33:50
Quote Anchor link
@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?
 
Noppes Homeland

Noppes Homeland

08/01/2012 17:34:54
Quote Anchor link
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.
 

Pagina: 1 2 volgende »



Overzicht Reageren