469,086 Members | 1,146 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,086 developers. It's quick & easy.

php undefined offset error

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
9 32076
Atli
5,058 Expert 4TB
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
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
5,058 Expert 4TB
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
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
5,058 Expert 4TB
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
5,821 Expert 4TB
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
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
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
5,821 Expert 4TB
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.

Similar topics

1 post views Thread by lawrence | last post: by
2 posts views Thread by Steven | last post: by
3 posts views Thread by delusion7 | last post: by
2 posts views Thread by neridaj | last post: by
1 post views Thread by atang | last post: by
1 post views Thread by CARIGAR | last post: by
reply views Thread by kglaser89 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.