Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

php - call to a member function on null [duplicate]

Tags:

php

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 );
}
like image 384
Hoffa Avatar asked Aug 04 '15 04:08

Hoffa


2 Answers

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.

like image 94
Source Matters Avatar answered Oct 25 '22 12:10

Source Matters


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!

like image 32
Jsowa Avatar answered Oct 25 '22 13:10

Jsowa