Jump to content

PHP Notice: Undefined offset: 3


Bottyz

Recommended Posts

$domains = count($alloweddomains);
for($y=0;$y<$domains+1;$y++) {
	if((stristr($_SERVER['HTTP_REFERER'], $alloweddomains[$y]))) {
		$allowed = 1;
	}
} 

Hi all,

 

Probably a really easy one for you to solve, but I'm a little stumped. I've recently upgraded to php 5.4 and have started getting a few php notices and I'm going through them one by one, but I'm stuck fixing the following:

 

[29-Jul-2015 06:54:21 America/New_York] PHP Notice:  Undefined offset: 3 in /public_html/filedownload.php on line 25

 

I've attached the code and I believe its referring to the $y variable.

 

 

 

Any ideas or assistance is always appreciated.

Link to comment
https://forums.phpfreaks.com/topic/297534-php-notice-undefined-offset-3/
Share on other sites

Oh and I'm also getting a very similar PHP notice for the below, again I think the culprit is the $o variable.

		class unicode_replace_entities {
		    public function UTF8entities($content="") {
		        $contents = $this->unicode_string_to_array($content);
		        $swap = "";
		        $iCount = count($contents);
		        for ($o=0;$o<$iCount;$o++) {
		            $contents[$o] = $this->unicode_entity_replace($contents[$o]);
		           $swap .= $contents[$o];
			    }
			    return mb_convert_encoding($swap,"UTF-8"); //not really necessary, but why not.
			}

This time the notice is: [28-Jul-2015 06:44:41 America/New_York] PHP Notice:  Uninitialized string offset: 0 in /public_html/contactform.php on line 108

 

 

Pulling what little hair I have left out over these!

 

Thanks :)

 

29-Jul-2015 06:54:21 America/New_York] PHP Notice:  Undefined offset: 3 in /public_html/filedownload.php on line 25

You  are getting that notice because there is not a array index 3 in $alloweddomains. This is because your for loop is most likely iterating one too many times, due to you adding one to $domains in the condition. 

If  $alloweddomains is an array, then use a foreach loop instead

// loop over each allowed domain
foreach($alloweddomains as $domain) {
	if((stristr($_SERVER['HTTP_REFERER'], $domain))) {
		$allowed = 1;
	}
} 

 

This time the notice is: [28-Jul-2015 06:44:41 America/New_York] PHP Notice:  Uninitialized string offset: 0 in /public_html/contactform.php on line 108

You are getting that notice because $contents is an empty string. What type of value should $contents be?

You  are getting that notice because there is not a array index 3 in $alloweddomains. This is because your for loop is most likely iterating one too many times, due to you adding one to $domains in the condition. 

If  $alloweddomains is an array, then use a foreach loop instead

// loop over each allowed domain
foreach($alloweddomains as $domain) {
	if((stristr($_SERVER['HTTP_REFERER'], $domain))) {
		$allowed = 1;
	}
} 

You are getting that notice because $contents is an empty string. What type of value should $contents be?

 

Thanks for your detailed answer, I've replaced my code with the above and its no longer causing an error and the download still works so I'm assuming it works as intended :)

 

With regards to the unicode_replace_entities function. This is being passed a user inputted message from a message box on a contact form on the website. Its called as follows:

function previous_request_value($str) {
	if (isset($_REQUEST[$str]) )
		return $_REQUEST[$str];
	else
		return '';
	}

$message_body = trim(previous_request_value('message_body'));
$message_body=nl2br(htmlspecialchars(stripslashes($message_body), ENT_QUOTES, 'UTF-8'));
$oUnicodeReplace = new unicode_replace_entities();
$message_body = $oUnicodeReplace->UTF8entities($message_body);

Then the full class for unicode_replace_entities is:

class unicode_replace_entities {
	public function UTF8entities($content="") {
		$contents = $this->unicode_string_to_array($content);
		$swap = "";
		$iCount = count($contents);
		for ($o=0;$o<$iCount;$o++) {
		      $contents[$o] = $this->unicode_entity_replace($contents[$o]);
		      $swap .= $contents[$o];
		}
		return mb_convert_encoding($swap,"UTF-8"); //not really necessary, but why not.
	}

	public function unicode_string_to_array( $string ) { //adjwilli
		$strlen = mb_strlen($string);
		$array = "";
		while ($strlen) {
		      $array[] = mb_substr( $string, 0, 1, "UTF-8" );
		      $string = mb_substr( $string, 1, $strlen, "UTF-8" );
		      $strlen = mb_strlen( $string );
		}
		return $array;
	}
	
	public function unicode_entity_replace($c) { //m. perez
		$h = ord($c{0});   
		if ($h <= 0x7F) {
		        return $c;
		} else if ($h < 0xC2) {
		        return $c;
		}
           
		if ($h <= 0xDF) {
			$h = ($h & 0x1F) << 6 | (ord($c{1}) & 0x3F);
		        $h = "" . $h . ";";
			return $h;
		} else if ($h <= 0xEF) {
			$h = ($h & 0x0F) << 12 | (ord($c{1}) & 0x3F) << 6 | (ord($c{2}) & 0x3F);
			$h = "" . $h . ";";
			return $h;
		} else if ($h <= 0xF4) {
			$h = ($h & 0x0F) << 18 | (ord($c{1}) & 0x3F) << 12 | (ord($c{2}) & 0x3F) << 6 | (ord($c{3}) & 0x3F);
			$h = "" . $h . ";";
			return $h;
		}
        }
}

As you can tell some of this is not my code, and I can't confess to fully understanding all of it.

Archived

This topic is now archived and is closed to further replies.

×
×
  • 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.