Tutorials

Debugging: A Beginner's guide

by Ben Smithers on Jun 9, 2008 5:47:39 PM

Logical Errors

So your script doesn't report any errors and the queries are working fine. But it doesn't do what it's supposed to. Chances are, you have an error in your logic.

Unfortunately, logical errors are the hardest to find. You may have been expecting an if statement to be true, when indeed it is false. The best solution to any problem like this is: echo, echo, echo. You must echo out information at strategic places throughout your script to help you narrow down the problem. You might, for example, check that a function has been called by placing an echo inside it. You might echo a variable to check its value; or you might echo something after an if statement to see if it was true or false. Never assume anything. You might have missed something and your best bet is to be patient and track it down.

Logical errors are also often caused by poor code layout. Always indent code between braces. Again, a good editor will help you out, as it will do this for you. It's much easier to keep track of braces and spot missing ones if you properly indent your code. It should also allow you to highlight one brace and find it's partner. The worst error message you can see is this:

Parse error: syntax error, unexpected $end in C:\wamp\www\phpfreaks.php on line 3

This usually means there's an unclosed brace. I've seen plenty of people assume they can just tack a brace onto the end of the script. It's almost never that simple. If I see someone with this problem, they're on their own! Your only option is to carefully walk though your code and make sure every brace is opened and closed in the correct place.

This error would also be generated if you had an unclosed backtick (`). Thanks to 448191 for pointing out that a lot of editors don't pick this up in their highlighting, so it could be tricky to spot.

That's it for logical errors. We'll sum up on page 7.

Comments

One small note worth adding: setting display_errors at runtime (ini_set()) won't work if the script contains fatal errors (like a parse error) because it will never get executed.

1. philipolson on Jun 10, 2008 2:09:56 PM

That's a good point there. I'll add a note in to that effect.

2. Ben Smithers on Jun 10, 2008 5:13:00 PM

You can also set error reporting in the .htaccess file if you have access to that and not your php.ini file. Here's what you need to put in the .htaccess file

php_flag display_errors on
php_value error_reporting 2047

// Or whatever error reporting level you want to use - I use 2047.

3. anthropos9 on Jun 10, 2008 6:55:58 PM

Re comment #1: Did you check that what you said is true? Setting it at runtine does work (providing you do it before any errors occur).

4. Daniel Egeberg on Jun 11, 2008 12:54:49 AM

With a syntax error Daniel? Not in my tests. With error_reporting turned off, this prodces a blank page:

5. Ben Smithers on Jun 11, 2008 1:40:02 AM

Hmm... I tested using

That does not output any errors. I just figured it would be the same type of fatal error as a syntax error would.

6. Daniel Egeberg on Jun 11, 2008 2:39:08 AM

Yeah, but then i think that makes sense. If there's a parse error, then the PHP engine wont be able make sense of the code; so it wont be able to understand that it's supposed to make a modification to the php.ini. Whereas with something like a fatal error for an undefined function, PHP can understand what it's being asked to do, just can't do it.

Also; valid point regarding .htaccess anthopos9. I'm not sure i'll add it in however, as it might just confuse the issue.

7. Ben Smithers on Jun 11, 2008 7:22:07 AM

Ben, with the htaccess thing... "php_flag display_errors on
php_value error_reporting 2047"

Right now theres nothing in the htaccess file but it writes errors to "error_log".
If I added in what you said would it fix it?

8. Stephen on Jun 15, 2008 8:31:49 PM

Well, it would turn turn display_errors On and it would set your error_reporting to 2047 which is all errors except recoverable. So if that's what you meant by 'fix it' then yes, i guess it would.

You might need to clarify, however.

9. Ben Smithers on Jun 16, 2008 3:51:06 PM

I'm new to php and I am reading PHP 5 for Dummies, I'm at chapter 3 creating you first PHP script. The script I'm using is
<html>
<head><title>Hello World Script</title></head>
<body>
<?php
echo “<p>Hello World!</p>”
?>
</body>
</html>
I saved it as helloworld.php on my localhost and even on my web server and I keep getting the same message:
Parse error: syntax error, unexpected '>' in C:\wamp\www\Test\helloworld.php on line 5
I have no idea whats wrong with it as I have just copied and pasted from the ebook!!
Please could someone help as I can't work it out?

10. Bleakers on Jun 19, 2008 8:51:48 AM

It appears you're using some sort of curly quotes instead of the regular straight ones. It's probably printed like that in your ebook. Try to type it manually and run it again.

11. Daniel Egeberg on Jun 19, 2008 1:17:22 PM

Thank you very much Daniel. That has fix the problem.

12. Bleakers on Jun 20, 2008 6:40:16 AM

As an addendum to the section on logic errors, an extremely handy line of code for figuring out what variables have what values (without having to exhaustively echo them) is the following:

This will exit the script - you can just as easily use echo. As a warning, it only works within the scope from which it is called (ie. from within functions only the local scope is returned), and from the global scope, you'll get all superglobals as well. This can flood you with data that you don't need - in this case, feel free to trim it down by specifying particular arrays in place of get_defined_vars().

13. akitchin on Aug 21, 2008 6:12:02 PM
Login or register to post a comment.