ShadowMage Posted April 16, 2020 Share Posted April 16, 2020 I've recently upgraded to PHP 7 from PHP 5, but I've noticed now that warnings and notices are preventing other output from being displayed. In PHP 5, if I tried to echo an undefined variable, I would get the notice in the midst of all the other output. But now, in PHP 7 it seems to just output the notice and nothing else, although I do get several notices if I have the undefined variable in a loop. This is an issue for me, because I often place echo statements around the code when I'm debugging to trace the flow of the code, but that doesn't work in PHP 7 anymore because none of my debugging statements are being printed to the screen. I can make it work and adjust my debugging procedure by placing exit calls just before the line that's generating the error, but I'm still curious if there's a INI setting or something that can change this behavior? Link to comment Share on other sites More sharing options...
ckrudelux Posted April 16, 2020 Share Posted April 16, 2020 (edited) Maybe it's an error reporting level. My code doesn't halt if I echo something that doesn't exist. If I rember correctly I think I had some similar issue until I change the error reporting level. This is also a neat trick in php 7 like isset but without all the extra work echo $var ?? 'default value'; Edited April 16, 2020 by ckrudelux Added explanation Link to comment Share on other sites More sharing options...
ShadowMage Posted April 16, 2020 Author Share Posted April 16, 2020 (edited) My code doesn't halt either. As mentioned, I can get multiple notices, but I get no other output besides the error notices. As an example: echo "Hello World"; echo $undefinedVar1; echo $undefinedVar2; The above code, in PHP 5, would print the "Hello World" line and then the undefined variable errors (both of them). In 7, I still get both error messages, but not the "Hello World" line. EDIT: Oh, and my error reporting level is the same in both: error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT Edited April 16, 2020 by ShadowMage Link to comment Share on other sites More sharing options...
ckrudelux Posted April 16, 2020 Share Posted April 16, 2020 Hm, looked at my own files and noticed that I have this in the top. Does it solve the issue? I think I gave up trying to find what was wrong and just tried this and left it like that. <?php error_reporting(E_ALL); ini_set("display_errors", "on"); Link to comment Share on other sites More sharing options...
dsonesuk Posted April 16, 2020 Share Posted April 16, 2020 (edited) How about // Report all PHP errorserror_reporting(-1); All <?php// Turn off all error reportingerror_reporting(0);// Report simple running errorserror_reporting(E_ERROR | E_WARNING | E_PARSE);// Reporting E_NOTICE can be good too (to report uninitialized // variables or catch variable name misspellings ...)error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);// Report all errors except E_NOTICEerror_reporting(E_ALL & ~E_NOTICE);// Report all PHP errors (see changelog)error_reporting(E_ALL);// Report all PHP errorserror_reporting(-1);// Same as error_reporting(E_ALL);ini_set('error_reporting', E_ALL);?> Edited April 16, 2020 by dsonesuk Link to comment Share on other sites More sharing options...
ShadowMage Posted May 22, 2020 Author Share Posted May 22, 2020 (edited) So, I'm bumping this back up because it's become an issue again. I had been working around it using die() to print out variables and such just before any offending lines, but I've encountered a situation now where that doesn't work. Consider the following: $x = 10; $y = 3; for ($z=0; $z<10; $z++) { echo "Attempt $x / $y: "; echo ($x/$y)."<br />"; $y--; } In PHP 5, I would get output as: Attempt 10 / 3: 3.33333333 Attempt 10 / 2: 5 Attempt 10 / 1: 10 Attempt 10 / 0: PHP Warning: Division by zero in C:\inetpub\major\test.php on line 37 Now, in PHP 7, I just get the error. And I can't use die() in the loop to print the "attempt..." line because the first iteration through the loop is correct and functional. I really need to figure out how to make PHP output everything again like it used to. While writing this, I thought of a workaround for the above situation. I could put a conditional to check the value of $y like this: $x = 10; $y = 3; for ($z=0; $z<10; $z++) { if ($y==0) echo "dividing by 0: $x / $y<br />"; echo "Attempt $x / $y: "; echo ($x/$y)."<br />"; $y--; } Or use a try/catch block for more complicated equations. Maybe this is best practice anyway? EDIT: Turns out a try/catch doesn't catch this error apparently... I don't know. Still seems silly to me that PHP would prevent all other output in the event of a non-fatal error. Edited May 22, 2020 by ShadowMage Link to comment Share on other sites More sharing options...
ShadowMage Posted May 22, 2020 Author Share Posted May 22, 2020 (edited) This is really beginning to be a problem... I've found all the division by 0 errors I had before, but I still have this guy: PHP Warning: A non-numeric value encountered in ...filepath... on line 166 Line 166 looks like this: $numPieces = ($Dim['bays']*$Dim['purlins'])*$Dim['qty']; The error doesn't even tell me which of the three variables is throwing the error. Normally, this wouldn't be an issue, because I'd just print out all the variables in the equation to see what they're being set to. However, because of the issue that started this thread, that's not possible. I've tried to catch this error in the following ways: try { $numPieces = ($Dim['bays']*$Dim['purlins'])*$Dim['qty']; } catch (Throwable $e) { echo "<pre>".print_r($Dim, true)."</pre>"; } and: $blnDump = false; $which = ''; if (!is_numeric($Dim['bays'])) { $blnDump = true; $which = 'bays'; } elseif (!is_numeric($Dim['purlins'])) { $blnDump = true; $which = 'purlins'; } elseif (!is_numeric($Dim['qty'])) { $blnDump = true; $which = 'qty'; } if ($blnDump) echo "$which was non-numeric:<br /><pre>".print_r($Dim, true)."</pre>"; but neither one catches the error and I just get the error printed on the page. The error prints twice, because the code above is in a function that gets called multiple times within a loop, and the issue apparently is occurring on two different iterations of the loop. And, because the code is in a loop, I can't use exit; or die(); to kill the script and print my debugging messages, because it kills the script on the first iteration of the loop. As luck would have it, the first iteration is error free and is therefore unhelpful to say the least. Edited May 22, 2020 by ShadowMage Link to comment Share on other sites More sharing options...
ShadowMage Posted October 12, 2021 Author Share Posted October 12, 2021 Bumping this again because it is really a pain to try and work around this issue. Does anyone have any ideas as to how I can get all the output back? It's incredibly helpful in trying to track down undefined indexes and such within loops. Link to comment Share on other sites More sharing options...
Ingolme Posted October 12, 2021 Share Posted October 12, 2021 I'm not entirely certain what the problem is. PHP does not prevent you from outputting at any point in the program before it halts. Warnings are not catchable, they're printed right on the screen, so a try-catch block won't work. I would print out the values of the variables right before they're used and then, once the program is done running, the values shown immediately before the warning will be the ones you are looking for. // Debug var_dump($Dim['bays'], $Dim['purlins'], $Dim['qty']); echo "<br>\r\n"; $numPieces = ($Dim['bays']*$Dim['purlins'])*$Dim['qty']; I suspect that some of the keys in $Dim are not set. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now