Jump to content

SLSCoder

Members
  • Posts

    61
  • Joined

  • Last visited

  • Days Won

    1

Everything posted by SLSCoder

  1. In view of this very ugly thread I've started using your solution every time I read a data array field. I actually use $arMine["NoField"]??'' with no spaces. It works well. It's a little messy (and it's gonna take forever to fix them all) but you guys win. Thanks Kicken
  2. Thanks. I've got every one of your problems here covered. Your illusions about my code are unfounded and incorrect. This conversation is over. This forum did not help me - again. Thank you for your time.
  3. I fear PHP has lost site of its objective. PHP is famous because it's EASY - less so anymore with every new version. More code is not generally a better solution. This looks like bloatware to me: if(isset($arMine["NoField"])) . That would be hundreds of cases many of which are html input field values. This is a *little* better: $arMine["NoField"] ?? '' Thanks. I may even use this. ginerjm: Thanks for your responses. If I *want* warnings I would have no problem displaying them. If I'm in production and my users encounter a bug I've gotta fix it. So if I need warnings I just turn them on. I need to be ABLE to shut them off and always could. It doesn't work anymore. I don't know why. I've explained what I did. 'ALL php code' - as I stated above, all my files require_once a session file which handles that and a lot of other stuff for every page in the app. If I upgrade PHP it's a BIG move. PHP demolishes my code with every single new version (in the old days upgrades were better not destructive). That to say it happens first on a dev site and once re-debugged can be used in production. Of course debugging may well include the need to see warnings. webdeveloper123: Thanks for your response. I don't want the warnings to EVER show up unless I want them. That because I don't want to have to write code to cover every single case where I use a (maybe non-existent) field value in a data array.
  4. I know but it's just a pain in pretty near every interface. I store db fields in the same array as page functionality fields - sometimes. A given field (usually a functionality field) may or may not be in the array. If not, I just want an empty string. The solve is if(isset($arMine["NoField"])) ... For the field that threw the error I needed to debug I did that so it's fixed. In general ... not really. I'd rather lose the warnings. Is there no way to actually stop warnings from displaying?
  5. I'm running PHP 8.1 in Apache2 on a Debian server. I need PHP to display error messages but not warning messages. I've got 2 config files, cli & fpm. I'm not sure which one Apache2 is using. Both have error_reporting set like this: error_reporting = E_ALL & ~E_WARNING & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT Moreover, every time a page loads session code loads with it. At the top of my page: SessionHandler.php is this: error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT); I've also tried changing it to this: error_reporting(E_ALL & ^ E_WARNING & ^ E_NOTICE & ^ E_DEPRECATED & ^ E_STRICT); Still the warning messages display. I've got a habit of trying to display values in associative arrays where the key doesn't exist. PHP throws a warning up for doing this: Warning: Undefined array key "ScpFeatureBundleID" How can I get rid of this warning without stopping errors from displaying?
  6. Thanks. open_basedir is not set. It's remmed out. I saw that on stackoverflow. You were right /var/log Nothing in there. I wonder why it wouldn't access /usr/share.
  7. OK, I moved the fonts to /var/www/fonts/truetype and set ownership & group to www-data. The permissions look right. JpGraph seems to be happy now. Funny though, the JpGraph default path was /usr/share/fonts/truetype which is what sent me down that trail. I just didn't realize that you can't access any folder on the server from a PHP website. It's fixed now. Thanks.
  8. It's my box. It's a standard debian apache 2 installation. All the sites are in /var/www/ Where are the PHP error logs? What does "bundle it into your application's codebase" mean? Multiple sites; multiple PHP apps will need access to the fonts.
  9. Then is it impossible to access folders outside the domain root from the website like /usr/share/ ? I'm accessing multiple folders in /var/www/ for things like PHPWord, JpGraph, etc. They're accessible to all the domains I run. In fact, the app that needs the fonts is JpGraph. <?php echo "Root: {$_SERVER['DOCUMENT_ROOT']}<br>"; if(file_exists("/usr/share/fonts/truetype/verdana.ttf")) echo "file exists<br>"; else echo "file does NOT exist<br>"; $file = file_get_contents("/usr/share/fonts/truetype/verdana.ttf"); if($file === false) echo "no file<br>"; else echo $file . "<br>";
  10. It is not part of the domain. I don't see why that'd matter. Root: /var/www/dev.aecperformance.com file does NOT exist no file
  11. Thanks. I can't believe I didn't see that! It didn't work though. So, now my code is: if(file_exists("/usr/share/fonts/truetype/verdana.ttf")) echo "file exists<br>"; else echo "file does NOT exist<br>"; $file = file_get_contents("/usr/share/fonts/truetype/verdana.ttf"); if($file === false) echo "no file<br>"; else echo $file . "<br>"; The response is still: file does NOT exist no file Also, when I showed errors none appeared.
  12. I'm trying to access a font file: usr/share/fonts/truetype/verdana.ttf As you can see the file does exist and owner, group and public have permissions to read it. It is owned by root not www-data but I can't see how that's a problem if public has read permissions. My code: if(file_exists("usr/share/fonts/truetype/verdana.ttf")) echo "file exists<br>"; else echo "file does NOT exist<br>"; $file = file_get_contents("usr/share/fonts/truetype/verdana.ttf"); if($file === false) echo "no file<br>"; else echo $file . "<br>"; returns: file does NOT exist no file How can I make my fonts in usr/share/fonts/truetype/ accessible to PHP?
  13. I can't believe it. What did you google? I tried a few things. The last was this: php charts -javascript -jquery I don't suppose you could come up with an open-source version for commercial use?? Thanks. Also, how can I code my own charts? I'd be interested in that. If you could point me in a direction that would help.
  14. How can I generate charts (bar, line pie, donut) in php that will create files (jpg, png, svg, ...) or base64 on the server? Does a library exist (preferably open source) that can do it? If not is there a service that I can connect to via cURL? I'm trying to export reports from php in various formats (PHPWord, PHPSpreadsheet, PHPPresentation, mPDF, HTML) that will include charts. The html must be basic html (no scripting) and runnable without an internet connection; just a report.
  15. gizmola, again thanks for your response. I am looking for ways to speed the app up so this is clearly something I'm going to have to study and implement. I'll look into Redis and learn what it will take to use it and where in my app it will help. Thanks again.
  16. I'm almost scared to ask this because I kind of expect you guys to chew me to bits - lol - but I have to try and find out. I have to be able to reasonably handle 50,000 records total (1 = Count + AvgX + AvgY) from this set of queries. I can't think of a better way to do it and it works fine with a few records (13 surveys total in the initial tests) but I'm concerned about it being efficient enough with more records. I'm wondering if putting it all into a stored proc would speed it up. I don't like stored procs. I prefer the code to be in my server side language (PHP in this case). If I have to change the database server stored procs make the job bigger, I have to rewrite all that code. The records are the Total count, Total X Avg, Total Y Avg and the Counts and the X and Y averages for each cell. The WHERE clauses are pretty straight forward; generally just a filter for answers.QuestionID and maybe a few other answers table fields. The FILTER can include combinations of any fields from the surveys and/or answers table. The FILTER params come from a client side form so must be protected from sql injection - thus PDO. $arParams is an array of the FILTER params. Here, I'm building a cross tab report for 2 params (ie QuestionID: 134 and QuestionID 78) in numeric ranges given: Min1 to Max1 by Interval1, Min2 to Max2 by Interval2. I know this is pretty complicated. If it's too much don't worry about it. Like I said, this code works, it's just an awful lot of queries so I suspect with a lot of records it'll be slow. //Get Total Count and Total X and Y averages try { $sql = "SELECT COUNT(DISTINCT surveys.RecordID) AS Cnt FROM answers INNER JOIN surveys ON answers.SurveyID = surveys.RecordID WHERE surveys.RecordID IN (SELECT SurveyID FROM answers WHERE " . $Where1 . ") AND surveys.RecordID IN (SELECT SurveyID FROM answers WHERE " . $Where2 . ")"; if(!empty($Filter)) $sql .= " AND " . $Filter; $ar = $this->executePDOQuery($sql, $arParams); $Total = $ar[0]["Cnt"]; $sql = "SELECT AVG(" . $DataFld1 . ") AS Avg FROM answers INNER JOIN surveys ON answers.SurveyID = surveys.RecordID WHERE " . $Where1 . " AND surveys.RecordID IN (SELECT SurveyID FROM answers WHERE " . $Where2 . ")"; if(!empty($Filter)) $sql .= " AND " . $Filter; $ar = $this->executePDOQuery($sql, $arParams); if(is_numeric($ar[0]["Avg"])) $TotalXAvg = round($ar[0]["Avg"], 1); else $TotalXAvg = ""; $sql = "SELECT AVG(" . $DataFld2 . ") AS Avg FROM answers INNER JOIN surveys ON answers.SurveyID = surveys.RecordID WHERE surveys.RecordID IN (SELECT SurveyID FROM answers WHERE " . $Where1 . ") AND " . $Where2; if(!empty($Filter)) $sql .= " AND " . $Filter; $ar = $this->executePDOQuery($sql, $arParams); if(is_numeric($ar[0]["Avg"])) $TotalYAvg = round($ar[0]["Avg"], 1); else $TotalYAvg = ""; } catch(Exception $exp) { throw new Exception("Error in daRptStatsAnly.getCmp1n1Data 2: " . $exp->getMessage() . "<br>" . $sql); } //Get First X & First & Count and XAvg and YAvg try { $sqlA1 = "SELECT COUNT(DISTINCT surveys.RecordID) AS Cnt FROM answers INNER JOIN surveys ON answers.SurveyID = surveys.RecordID WHERE surveys.RecordID IN (SELECT SurveyID FROM answers WHERE " . $Where1 ." AND " . $DataFld1 . " < " . $CurMax1 . ")"; $sqlA = $sqlA1 . " AND surveys.RecordID IN (SELECT SurveyID FROM answers WHERE " . $Where2 . " AND " . $DataFld2 . " < " . $CurMax2 . ")"; if(!empty($Filter)) $sqlA .= " AND " . $Filter; $ar = $this->executePDOQuery($sqlA, $arParams); $arRec = []; $arRec["Cnt"] = $ar[0]["Cnt"]; if($arRec["Cnt"] > $MaxCnt) $MaxCnt = $arRec["Cnt"]; $sqlB1 = "SELECT AVG(" . $DataFld1 . ") AS Avg FROM answers INNER JOIN surveys ON answers.SurveyID = surveys.RecordID WHERE " . $Where1 . " AND " . $DataFld1 . " < " . $CurMax1; $sqlB = $sqlB1 . " AND surveys.RecordID IN (SELECT SurveyID FROM answers WHERE " . $Where2 . " AND " . $DataFld2 . " < " . $CurMax2 . ")"; if(!empty($Filter)) $sqlB .= " AND " . $Filter; $ar = $this->executePDOQuery($sqlB, $arParams); if(is_numeric($ar[0]["Avg"])) { $arRec["XAvg"] = round($ar[0]["Avg"], 1); if($arRec["XAvg"] > $MaxXAvg) $MaxXAvg = $arRec["XAvg"]; } else $arRec["XAvg"] = "n/a"; $sqlC1 = "SELECT AVG(" . $DataFld2 . ") AS Avg FROM answers INNER JOIN surveys ON answers.SurveyID = surveys.RecordID WHERE surveys.RecordID IN (SELECT SurveyID FROM answers WHERE " . $Where1 ." AND " . $DataFld1 . " < " . $CurMax1 . ")"; $sqlC = $sqlC1 . " AND " . $Where2 . " AND " . $DataFld2 . " < " . $CurMax2; if(!empty($Filter)) $sqlC .= " AND " . $Filter; $ar = $this->executePDOQuery($sqlC, $arParams); if(is_numeric($ar[0]["Avg"])) { $arRec["YAvg"] = round($ar[0]["Avg"], 1); if($arRec["YAvg"] > $MaxYAvg) $MaxYAvg = $arRec["YAvg"]; } else $arRec["YAvg"] = "n/a"; } catch(Exception $exp) { throw new Exception("Error in daRptStatsAnly.getCmp1n1Data 2: " . $exp->getMessage() . "<br>" . $sql); } $arData[$idxX] = []; $arData[$idxX][$idxY] = $arRec; $YLabels[$idxY] = $CurMin2 . " to < " . $CurMax2; $XLabels[$idxX] = $CurMin1 . " to < " . $CurMax1; //Get First X and Remaining Y Count and Averages while($CurMax2 <= $Max2) { $idxY++; $CurMin2 = $CurMax2; $CurMax2 = $CurMin2 + $Interval2; try { $sqlA = $sqlA1 . " AND surveys.RecordID IN (SELECT SurveyID FROM answers WHERE " . $Where2 . " AND " . $DataFld2 . " >= " . $CurMin2 . " AND " . $DataFld2 . " < " . $CurMax2 . ")"; if(!empty($Filter)) $sqlA .= " AND " . $Filter; $ar = $this->executePDOQuery($sqlA, $arParams); $arRec = []; $arRec["Cnt"] = $ar[0]["Cnt"]; if($arRec["Cnt"] > $MaxCnt) $MaxCnt = $arRec["Cnt"]; $sqlB = $sqlB1 . " AND surveys.RecordID IN (" . $Where2 . " AND " . $DataFld2 . " >= " . $CurMin2 . " AND " . $DataFld2 . " < " . $CurMax2 . ")"; if(!empty($Filter)) $sqlB .= " AND " . $Filter; $ar = $this->executePDOQuery($sqlB, $arParams); if(is_numeric($ar[0]["Avg"])) { $arRec["XAvg"] = round($ar[0]["XAvg"], 1); if($arRec["XAvg"] > $MaxXAvg) $MaxXAvg = $arRec["XAvg"]; } else $arRec["XAvg"] = "n/a"; $sqlC = $sqlC1 . " AND " . $DataFld2 . " >= " . $CurMin2 . " AND " . $DataFld2 . " < " . $CurMax2 ; if(!empty($Filter)) $sqlC .= " AND " . $Filter; $ar = $this->executePDOQuery($sqlC, $arParams); if(is_numeric($ar[0]["Avg"])) { $arRec["YAvg"] = round($ar[0]["Avg"], 1); if($arRec["YAvg"] > $MaxYAvg) $MaxYAvg = $arRec["YAvg"]; } else $arRec["YAvg"] = "n/a"; } catch(Exception $exp) { throw new Exception("Error in daRptStatsAnly.getCmp1n1Data 2: " . $exp->getMessage() . "<br>" . $sql); } $arData[$idxX][$idxY] = $arRec; $YLabels[$idxY] = $CurMin2 . " to < " . $CurMax2; } $Max2 = round($Max2); if($CurMax2 > $Max2) $YLabels[$idxY] = $CurMin2 . " to " . $Max2; //Get remaining X Counts & for each, First X and Y Average while($CurMax1 <= $Max1) { $CurMin2 = $Min2; $CurMax2 = $CurMin2 + $Interval2; $CurMin1 = $CurMax1; $CurMax1 = $CurMin1 + $Interval1; $idxX++; $idxY = 0; $arData[$idxX] = []; try { $sqlA1 = "SELECT COUNT(DISTINCT surveys.RecordID) AS Cnt FROM answers INNER JOIN surveys ON answers.SurveyID = surveys.RecordID WHERE surveys.RecordID IN (SELECT SurveyID FROM answers WHERE " . $Where1 . " AND " . $DataFld1 . " >= " . $CurMin1 ." AND " . $DataFld1 . " < " . $CurMax1 . ")"; $sqlA = $sqlA1 . " AND surveys.RecordID IN (SELECT SurveyID FROM answers WHERE " . $Where2 . " AND " . $DataFld2 . " < " . $CurMax2 . ")"; if(!empty($Filter)) $sqlA .= " AND " . $Filter; $ar = $this->executePDOQuery($sqlA, $arParams); $arRec = []; $arRec["Cnt"] = $ar[0]["Cnt"]; if($arRec["Cnt"] > $MaxCnt) $MaxCnt = $arRec["Cnt"]; $sqlB1 = "SELECT AVG(" . $DataFld1 . ") AS Avg FROM answers INNER JOIN surveys ON answers.SurveyID = surveys.RecordID WHERE " . $Where1 . " AND " . $DataFld1 . " >= " . $CurMin1 ." AND " . $DataFld1 . " < " . $CurMax1; $sqlB = $sqlB1 . " AND surveys.RecordID IN (SELECT SurveyID FROM answers WHERE " . $Where2 . " AND " . $DataFld2 . " < " . $CurMax2 . ")"; if(!empty($Filter)) $sqlB .= " AND " . $Filter; $ar = $this->executePDOQuery($sqlB, $arParams); if(is_numeric($ar[0]["Avg"])) { $arRec["XAvg"] = round($ar[0]["Avg"], 1); if($arRec["XAvg"] > $MaxXAvg) $MaxXAvg = $arRec["XAvg"]; } else $arRec["XAvg"] = "n/a"; $sqlC1 = "SELECT AVG(" . $DataFld2 . ") AS Avg FROM answers INNER JOIN surveys ON answers.SurveyID = surveys.RecordID WHERE surveys.RecordID IN (SELECT SurveyID FROM answers WHERE " . $Where1 . " AND " . $DataFld1 . " >= " . $CurMin1 ." AND " . $DataFld1 . " < " . $CurMax1 . ")"; $sqlC = $sqlC1 . " AND " . $Where2 . " AND " . $DataFld2 . " < " . $CurMax2 ; if(!empty($Filter)) $sqlC .= " AND " . $Filter; $ar = $this->executePDOQuery($sqlC, $arParams); if(is_numeric($ar[0]["Avg"])) { $arRec["YAvg"] = round($ar[0]["Avg"], 1); if($arRec["YAvg"] > $MaxYAvg) $MaxYAvg = $arRec["YAvg"]; } else $arRec["YAvg"] = "n/a"; } catch(Exception $exp) { throw new Exception("Error in daRptStatsAnly.getCmp2NumData: " . $exp->getMessage() . "<br>" . $sql); } $arData[$idxX][$idxY] = $arRec; //Get Counts & Averages for Remaining Y while($CurMax2 <= $Max2) { $idxY++; $CurMin2 = $CurMax2; $CurMax2 = $CurMin2 + $Interval2; try { $sqlA = $sqlA1 . " AND surveys.RecordID IN (SELECT SurveyID FROM answers WHERE " . $Where2 . " AND " . $DataFld2 . " >= " . $CurMin2 . " AND " . $DataFld2 . " < " . $CurMax2 . ")"; if(!empty($Filter)) $sqlA .= " AND " . $Filter; $ar = $this->executePDOQuery($sqlA, $arParams); $arRec = []; $arRec["Cnt"] = $ar[0]["Cnt"]; if($arRec["Cnt"] > $MaxCnt) $MaxCnt = $arRec["Cnt"]; $sqlB = $sqlB1 . " AND surveys.RecordID IN (SELECT SurveyID FROM answers WHERE " . $Where2 . " AND " . $DataFld2 . " >= " . $CurMin2 . " AND " . $DataFld2 . " < " . $CurMax2 . ")"; if(!empty($Filter)) $sqlB .= " AND " . $Filter; $ar = $this->executePDOQuery($sqlB, $arParams); if(is_numeric($ar[0]["Avg"])) { $arRec["XAvg"] = round($ar[0]["Avg"], 1); if($arRec["XAvg"] > $MaxXAvg) $MaxXAvg = $arRec["XAvg"]; } else $arRec["XAvg"] = "n/a"; $sqlC = $sqlC1 . " AND " . $Where2 . " AND " . $DataFld2 . " >= " . $CurMin2 . " AND " . $DataFld2 . " < " . $CurMax2; if(!empty($Filter)) $sqlC .= " AND " . $Filter; $ar = $this->executePDOQuery($sqlC, $arParams); if(is_numeric($ar[0]["Avg"])) { $arRec["YAvg"] = round($ar[0]["Avg"], 1); if($arRec["YAvg"] > $MaxYAvg) $MaxYAvg = $arRec["YAvg"]; } else $arRec["YAvg"] = "n/a"; } catch(Exception $exp) { throw new Exception("Error in daRptStatsAnly.getCmp2NumData: " . $exp->getMessage() . "<br>" . $sql); } $arData[$idxX][$idxY] = $arRec; } }
  17. gizmola thanks for your response. If I understand memcached correctly it won't help me. The data is constantly changing, it's not static at all.
  18. OK thanks. I'll make that a preference as well.
  19. I have a table1 with an ID and a Name where the ID is found in a sql query on different table2. I have access to an existing PHP array containing all the IDs and Names of table1. For each of the records I find n the sql query on table2 I have a choice. I can either INNER JOIN table1 on table2 in the sql query and then include the Name in the query OR while looping through the query recordset, for each record found I can loop through the array of table1 and match the ID to the ID in the query record to get the Name. Which method is generally faster?
  20. I added the code in the page because it still would not display the errors. I wasn't confident that I had the 'right' php.ini file even though I did edit the one shown in php_info.php. Normally, that code wouldn't be there. I'm aware that & ~E_NOTICE turns off notices. My problem was that even if I have php.ini set as: error_reporting = E_ALL the page still wouldn't show the parse error. The error was caused by a missing semi colon and yesterday the page returned: This page isn’t working Today the error displays as it should. I've removed the error display code on the page and it still works fine. I *swear* I didn't change anything. Yesterday when I quit, it didn't work. Today, it works just fine. ?#)!@#$??? It's all good now. You guys are a lot of help. We appreciate you. Thanks
  21. This code works $sErr = "Hello World"; echo $sErr . "<br>"; This code makes the page display: This page isn’t working $sErr = "Hello World" echo $sErr . "<br>"; Why is it doing that and how can I make it show me the error?
  22. Yea, sorry. I'm working on it. It turns out that it seems to be doing it on compile time errors. What caused it to return This page isn't working was a missing semi-colon.
  23. I've been through this a hundred times. I cannot make php display errors consistently. My php.ini file has this: error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT display_errors = On display_startup_errors = On log_errors = On ignore_repeated_errors = Off ignore_repeated_source = Off report_memleaks = On Nothing exists below these params that would change them. I have a file https://dev.aecperformance.com/php_info.php which shows my php info. When I pull that up I see: Loaded Configuration File /etc/php/8.1/apache2/php.ini I don't understand why this is. It used to be in /etc/php/8.1/fpm php8.1-fpm is installed and is active. Whether or not php is actually using it I can't say. It should be using fpm. Nevertheless, I have uploaded the php.ini file to both: /etc/php/8.1/apache2/php.ini and to /etc/php/8.1/fpm/php.ini I've rebooted the server since making the changes to make sure that php is reloaded. On my web page I have: ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); STILL when I try to load the page I get: This page isn’t working https://dev.aecperformance.com/test.php How can I make PHP display errors and suppress warnings?
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.