By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
435,595 Members | 3,721 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 435,595 IT Pros & Developers. It's quick & easy.

php undefined offset error

P: 5
Hello

I have a script which have the facility of entering any code to some part of a webpage. I have some problems with it. When i put some code in the script then their is no error shown. When i try to not use a code and leave it empty the following php errors happens. I dont understand why. Help me.

Error shown are: -

[phpBB Debug] PHP Notice: in file /index.php on line 132: Undefined offset: 4
[phpBB Debug] PHP Notice: in file /index.php on line 141: Undefined offset: 4
[phpBB Debug] PHP Notice: in file /index.php on line 142: Undefined offset: 5
[phpBB Debug] PHP Notice: in file /includes/functions.php on line 4250: Cannot modify header information - headers already sent by (output started at /includes/functions.php:3730)
[phpBB Debug] PHP Notice: in file /includes/functions.php on line 4252: Cannot modify header information - headers already sent by (output started at /includes/functions.php:3730)
[phpBB Debug] PHP Notice: in file /includes/functions.php on line 4253: Cannot modify header information - headers already sent by (output started at /includes/functions.php:3730)
[phpBB Debug] PHP Notice: in file /includes/functions.php on line 4254: Cannot modify header information - headers already sent by (output started at /includes/functions.php:3730)


Error script part
Expand|Select|Wrap|Line Numbers
  1. // Start output Ad
  2. $aktiv = ($user->data['user_id'] != ANONYMOUS) ? '1' : '3';
  3.  
  4. $sql = "SELECT code, ID, position FROM " . AD_TABLE ." 
  5.     WHERE (activ = '" .$aktiv. "' OR activ = '1')
  6.     AND  (max_views <= views)
  7.     AND (show_all_forums = '1')
  8.     ORDER BY rand()    ";
  9.  
  10. $result = $db->sql_query($sql);
  11. while($row = $db->sql_fetchrow($result))
  12. {
  13.     $adcode[$row['position']] = html_entity_decode($row['code']);
  14.     $adID[$row['position']]['ID'] = $row['ID'];
  15. }
  16.  
  17. // update views for every Ad
  18. for ($i = 1; $i <= 4; $i++)
  19. {
  20.     if ($adID[$i]['ID'])     // line 132 error line
  21.     {
  22.         $db->sql_query('UPDATE ' . AD_TABLE . ' SET views = views +1 WHERE ID = ' . $adID[$i]['ID']);
  23.     }
  24. }
  25. // End output Ad
  26.  
  27. // Assign index specific vars
  28. $template->assign_vars(array(
  29.       'AD_CODE4'      => $adcode[4],   //line 141 error line
  30.     'AD_CODE5'      => $adcode[5],   //line 142 error line
  31.     'TOTAL_POSTS'    => sprintf($user->lang[$l_total_post_s], $total_posts),
  32.     'TOTAL_TOPICS'    => sprintf($user->lang[$l_total_topic_s], $total_topics),
  33.     'TOTAL_USERS'    => sprintf($user->lang[$l_total_user_s], $total_users),
  34.  
  35.  
Oct 4 '07 #1
Share this Question
Share on Google+
9 Replies


Atli
Expert 5K+
P: 5,058
Hi. Welcome to The Scripts!

The problem there is that your for loop is counting up to 4. Your array only has 3 elements. So, naturally, PHP prints a Notice telling you about it.

This leads to the header() problem. Headers need to be sent before any output. So when PHP prints the Notice, all headers are sent and no more headers will be accepted. Which leads to the failure of your header() functions and the last bunch of Notices.
Oct 4 '07 #2

P: 5
Thanks for the reply.
I am newbie with php. Please you exactly tell me where and what i should change to solve the problem.
Oct 4 '07 #3

Atli
Expert 5K+
P: 5,058
Try changin this:
Expand|Select|Wrap|Line Numbers
  1. // update views for every Ad
  2. for ($i = 1; $i <= 4; $i++)
  3. {
  4.     if ($adID[$i]['ID'])     // line 132 error line
  5.     {
  6.         $db->sql_query('UPDATE ' . AD_TABLE . ' SET views = views +1 WHERE ID = ' . $adID[$i]['ID']);
  7.     }
  8. }
  9.  
Into this:
Expand|Select|Wrap|Line Numbers
  1. // update views for every Ad
  2. foreach($adID as $ad) 
  3. {
  4.     if ($ad['ID'])  
  5.     {
  6.         $db->sql_query('UPDATE ' . AD_TABLE . ' SET views = views +1 WHERE ID = ' . $ad['ID']);
  7.     }
  8. }
  9.  
This way your code won't assume that there are four entries in the $adID array. It will simply go through each element, regardless of how many there are.
Oct 4 '07 #4

P: 5
Thanks ,fixed 1st one.

The following problems are still their. Any hint.

[phpBB Debug] PHP Notice: in file /index.php on line 141: Undefined offset: 4
[phpBB Debug] PHP Notice: in file /index.php on line 142: Undefined offset: 5
Oct 4 '07 #5

Atli
Expert 5K+
P: 5,058
These notices are basically the same as the other one.
Your code is assuming that there are a fourth and a fifth element in the $adcode array, but there aren't, thus it prints the notices.
Expand|Select|Wrap|Line Numbers
  1. 'AD_CODE4'      => $adcode[4],   //line 141 error line
  2. 'AD_CODE5'      => $adcode[5],   //line 142 error line'
  3.  
The code is obviously supposed to be fetching these elements from your database, but they don't exists there so the elements are empty.

You could simply ignore them. Your code will execute without them, but it may cause some side-effects.
Oct 4 '07 #6

pbmods
Expert 5K+
P: 5,821
Heya, simple12.

You can prevent these notices by doing this:
Expand|Select|Wrap|Line Numbers
  1. 'AD_CODE4'      => isset($adcode[4]) ? $adcode[4] : 'default value',
  2. 'AD_CODE5'      => isset($adcode[5]) ? $adcode[5] : 'default value',
  3.  
And in PHP 6, you'll be able to shorten it to:
Expand|Select|Wrap|Line Numbers
  1. 'AD_CODE4'      => $adcode[4] ?: 'default value',
  2. 'AD_CODE5'      => $adcode[5] ?: 'default value',
  3.  
Oct 4 '07 #7

P: 5
Thanks for the support.

yes i got rid of the notices now. But now if i left empty the code box(place where any extra code is inserted) it is showing value "default" written on webpage.
I want to know that can i put some code to prevent this script from showing error if it founds no data in database.
Oct 5 '07 #8

P: 5
Hey guys you really are superb in php.
I fixed with your support all the problems
at last i used only this code
Expand|Select|Wrap|Line Numbers
  1. 'AD_CODE4'      => isset($adcode[4]) ? $adcode[4] : '',
  2. 'AD_CODE5'      => isset($adcode[5]) ? $adcode[5] : '', 
  3.  
Just curious to know if it would work fine or will be unstable.But lol its working.
Oct 5 '07 #9

pbmods
Expert 5K+
P: 5,821
Heya simple12.

The '? :' is called a ternary operator. It's generally accepted as the standard way to assign default values.
Oct 5 '07 #10

Post your reply

Sign in to post your reply or Sign up for a free account.