Apologies if this is real basic, but when PHP gets into functions I'm over my head.
I have a plug-in for a forum, which loads a flash cookie as a method to detect duplicate accounts.
The script is failing on about 0.1% of page views, causing a WSOD. The error points to this line:
return $this->registry->output->getTemplate( 'dml' )->duplicatesLoadMovie( $host, $path, $id, $md5 );
The error message is:
Fatal error: Call to a member function duplicatesLoadMovie() on null in /var/www/.../web/forums/hooks/duplicatesLoadMovie.php on line 75
To me, this reads as one of $host
, $path
, $id
, or $md5
is returning null
, but as this is not my script (and the coder is, of course, unresponsive), I would like to fix this in the simplest way possible (other than removing it, which is the fallback position).
Can I simply do something to the effect of $id = 0 if id.null
? (sorry for the Rubyspeak) for each of the $variables
?
Full source of the file:
class duplicatesLoadMovie
{
/**
* Registry object shortcuts
*
* @var $registry
* @var $settings
* @var $member
* @var $memberData
**/
public $registry;
public $settings;
public $member;
public $memberData;
/**
* Main function executed automatically by the controller
*
* @access public
* @return @e void
**/
public function __construct()
{
$this->registry = ipsRegistry::instance();
$this->settings =& $this->registry->fetchSettings();
$this->member = $this->registry->member();
$this->memberData =& $this->registry->member()->fetchMemberData();
}
/**
* Get the output
*
* @access public
* @return @e string
**/
public function getOutput()
{
/* Grab host URL and installation path of the community */
$host = $this->settings['board_url'];
$parsed = parse_url( $host );
$path = trim( $parsed['path'], '/' );
if( $path == '' )
{
$path = '/';
}
$host = 'host=' . $host;
$path = 'path=' . $path;
/* Determine the appropriate identification method (member_id for members and session_id for guests) */
if( $this->memberData['member_id'] )
{
$id = 'mid=' . $this->memberData['member_id'];
}
else
{
$id = 'sid=' . $this->member->session_id;
}
/* Grab the secure key for AJAX */
$md5 = 'md5=' . $this->member->form_hash;
/* Finally, call the template bit */
return $this->registry->output->getTemplate( 'dml' )->duplicatesLoadMovie( $host, $path, $id, $md5 );
}
I'd suspect that this getTemplate( 'dml' )
is not returning a value. If you do a var_dump(getTemplate( 'dml' ))
, does it show anything?
You might check for "null" before doing that line of code, and in your "else" statement, output an error message, or some other action suitable for that error.
Your problem is solved long time ago, but I suppose a lot of people looking for solution struggle with this error. PHP 8.0 introduces new operator nullsafe operator (?->)
. It's not for suppressing the error(!), but for cases when variable is allowed to be null
and then we don't need to double check its value.
So in OP's question last row would look like:
return $this->registry->output->getTemplate( 'dml' )?->duplicatesLoadMovie( $host, $path, $id, $md5 );
It should be used very carefully, because it's not solution for every occurence of this kind of error!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With