fmesco Posted February 17, 2010 Share Posted February 17, 2010 Hi - I am new at php and have been learning some basics. I now have a problem with what seems to be something simple, but I just can't figure this out and am hoping someone can shed some light on why this might be happening. I've created an online template which is essentially an Estimate form that calculates Quotes for retail customers. The template contains over 50 calculated fields from my database along with some variables/values that are not stored in the database. Everything works great except that it seems that about 3 quarters of the way through the Estmate the calculations just stop calculating. An example of one of my calculations is this: <?php $fab_total= $calc_shopfee + $calc_umkit + $calc_vanum + $calc_disink + $calc_cooktop + $calc_sirail + $calc_supports + $calc_icorners + $calc_radius + $calc_arc + $calc_outlet + $node->field_other_fabfee[0]['value'] ?> <?php $fab_total= number_format($fab_total, 2, '.', ',') ?> <?php print check_plain ($fab_total, 2) ?> I think this code is right, as it works in several other instances with other field names. I should probably also mention that some of these fields are based on other calculated fields. But the answer as to why some work and others don't has me baffled. So, is there a limit to how many fields I can perform calculations on within php? or could it be I'm hitting a memory limit of some sort? Are there logs that might help me troubleshoot where exactly the form is failing? Any insight at all would be greatly appreciated. Quote Link to comment https://forums.phpfreaks.com/topic/192439-is-there-a-variable-limit-when-performing-many-php-calculations/ Share on other sites More sharing options...
roopurt18 Posted February 17, 2010 Share Posted February 17, 2010 You need to terminate statements with semi-colons. Quote Link to comment https://forums.phpfreaks.com/topic/192439-is-there-a-variable-limit-when-performing-many-php-calculations/#findComment-1013999 Share on other sites More sharing options...
fmesco Posted February 17, 2010 Author Share Posted February 17, 2010 Thanks roopurt18, Could this cause my problem? I added them in and there is still no change to the result of my equations. They now look like this: <?php $svc_total= $calc_template + $calc_install + $calc_tearout + $calc_rasiect + $calc_surcharge + $node->field_other_servicefee[0]['value']; ?> <?php $svc_total= number_format($svc_total, 2, '.', ','); ?> <?php print check_plain ($svc_total, 2); ?> If only it were this simple! Quote Link to comment https://forums.phpfreaks.com/topic/192439-is-there-a-variable-limit-when-performing-many-php-calculations/#findComment-1014021 Share on other sites More sharing options...
roopurt18 Posted February 17, 2010 Share Posted February 17, 2010 Try dumping each value and seeing if any are bad: <?php var_dump( $calc_template, $calc_install, $calc_tearout, $calc_rasiect, $calc_surcharge, $node->field_other_servicefee[0]['value'] ); $svc_total= $calc_template + $calc_install + $calc_tearout + $calc_rasiect + $calc_surcharge + $node->field_other_servicefee[0]['value']; var_dump( $svc_total ); $svc_total= number_format($svc_total, 2, '.', ','); var_dump( $svc_total ); print check_plain ($svc_total, 2); Quote Link to comment https://forums.phpfreaks.com/topic/192439-is-there-a-variable-limit-when-performing-many-php-calculations/#findComment-1014031 Share on other sites More sharing options...
Daniel0 Posted February 17, 2010 Share Posted February 17, 2010 You need to terminate statements with semi-colons. A statement is ended either explicitly using a semi-colon or implicitly by stepping out of PHP mode using ?>, so in this case it makes no difference. Quote Link to comment https://forums.phpfreaks.com/topic/192439-is-there-a-variable-limit-when-performing-many-php-calculations/#findComment-1014041 Share on other sites More sharing options...
fmesco Posted February 17, 2010 Author Share Posted February 17, 2010 roopurt18, Thanks for that bit of code...had never done a dump before. That's cool. This is what it spit out: string(6) "885.00" string( "1,770.00" string(6) "150.00" string(6) "100.00" string(5) "75.00" string(5) "50.00" float(1261) string( "1,261.00" 1,261.00 All those numbers are correct values, except for the 1,261.00. Those numbers should add up to 3,030.00. This is why I'm confused...they should work, but they're not. Any other suggestions as to what I can check to do more troubleshooting? Thanks! Quote Link to comment https://forums.phpfreaks.com/topic/192439-is-there-a-variable-limit-when-performing-many-php-calculations/#findComment-1014050 Share on other sites More sharing options...
roopurt18 Posted February 17, 2010 Share Posted February 17, 2010 The problem is that your values are strings, which means they are casted to numeric types during the addition. In the case of "1,770.00", when you cast this to a float you get a one. 885 + 1 + 150 + 100 + 75 + 50 = 1261 Any punctuation in your values is going to throw off the automatic type-cast from string to float. Therefore you might consider the following: <?php $search = array( '$', ',' ); // Add any other possible punctuation $replace = ''; $calc_template = str_replace( $search, $replace, $calc_template ); $calc_install = str_replace( $search, $replace, $calc_install ); // repeat for each variable... $svc_total= $calc_template + $calc_install + $calc_tearout + $calc_rasiect + $calc_surcharge + $node->field_other_servicefee[0]['value']; $svc_total= number_format($svc_total, 2, '.', ','); print check_plain ($svc_total, 2); ?> Quote Link to comment https://forums.phpfreaks.com/topic/192439-is-there-a-variable-limit-when-performing-many-php-calculations/#findComment-1014059 Share on other sites More sharing options...
fmesco Posted February 18, 2010 Author Share Posted February 18, 2010 Wow, that worked like a charm! Awesome! Thanks! Do you know if I can declare this just once with all the variables in them, or do I need to do this before each calculation group in the form? Thanks again...I've been pulling my hair out for 2 weeks on this! Quote Link to comment https://forums.phpfreaks.com/topic/192439-is-there-a-variable-limit-when-performing-many-php-calculations/#findComment-1014072 Share on other sites More sharing options...
roopurt18 Posted February 18, 2010 Share Posted February 18, 2010 You could use variable variables. Or you can use arrays. Whatever you pick will cut down on the final number of lines of PHP you have to write, but you'll still probably have to maintain the list of variables being filtered. <?php // VARIABLE VARIABLES APPROACH $search = array( '$', ',' ); // Add any other possible punctuation $replace = ''; $tmp_other_servicefee = $node->field_other_servicefee[0]['value']; // values like this go into temp variables // just add any variables to filter to this array $vars = array( 'calc_template', 'calc_install', 'calc_tearout', 'calc_rasiect', 'calc_surcharge', 'tmp_other_servicefee' ); foreach( $vars as $var ) { if( is_string( ${$var} ) ) { ${$var} = str_replace( $search, $replace, ${$var} ); } } // note that since you are performing addition only, you can compute $svc_total // during the loop as i've done with the "ARRAY APPROACH" below // if you are doing mixed operations, i.e. division, addition, multiplication, etc // then you are best off performing the calculation in steps that clearly outline // the order of operations. $svc_total= $calc_template + $calc_install + $calc_tearout + $calc_rasiect + $calc_surcharge + $tmp_other_servicefee; $svc_total= number_format($svc_total, 2, '.', ','); print check_plain ($svc_total, 2); ?> <?php // ARRAY APPROACH // This approach will lend itself best when the operator is the same for all of them // (in your case: addition) $search = array( '$', ',' ); // Add any other possible punctuation $replace = ''; $values = array(); $values[] = $calc_template; $values[] = $calc_install; $values[] = $calc_tearout; $values[] = $calc_rasiect; $values[] = $calc_surcharge; $values[] = $node->field_other_servicefee[0]['value']; $svc_total = 0; foreach( $values as $key => $val ) { if( is_string( $val ) ) { $val = str_replace( $search, $replace, $val ); } $svc_total += $val; } $svc_total= number_format($svc_total, 2, '.', ','); print check_plain ($svc_total, 2); ?> Quote Link to comment https://forums.phpfreaks.com/topic/192439-is-there-a-variable-limit-when-performing-many-php-calculations/#findComment-1014081 Share on other sites More sharing options...
Rustywolf Posted February 22, 2010 Share Posted February 22, 2010 Also , i would suggest you use a is_int() function in there just to make sure there are no invalid characters ( or "special" characters ) Quote Link to comment https://forums.phpfreaks.com/topic/192439-is-there-a-variable-limit-when-performing-many-php-calculations/#findComment-1016015 Share on other sites More sharing options...
roopurt18 Posted February 22, 2010 Share Posted February 22, 2010 is_numeric() would work better in this case. Quote Link to comment https://forums.phpfreaks.com/topic/192439-is-there-a-variable-limit-when-performing-many-php-calculations/#findComment-1016314 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.