Home » Php » php – ob_start() within a loop

php – ob_start() within a loop

Posted by: admin July 12, 2020 Leave a comment

Questions:

I’ve got a problem when looping using foreach() loop and inside of this loop using ob_start() and ob_get_clean().

Here’s my function:

protected function renderEmail() {
$template = $this->_case.".php";
if(is_file($this->_dir.DS.$template)) {
    ob_start();
    if(!empty($this->_records)) {               
        foreach($this->_records as $key => $value) {
            ${$key} = $value;
        }
    }
    require_once($this->_dir.DS.$template);
    return ob_get_clean();
} else {
    $this->_errors[] = "Email template not found";
    return false;
} }

This function is basically generating content of the email and then returns it.

The problem I have is when I loop through a number of email addresses – to send the same email content – only the first one returns the content – the following ones are blank – any idea why?

How to&Answers:

Ok – you won’t believe – once I’ve posted this question – straight after I’ve realised where the problem was – I’m using require_once() function – which prevents the same file to be included again – once changed to include() everything works fine!

Answer:

Every time you are going to use a same file several times inside a loop, you should never user require_once() or include_once, instead use, ‘include’, and everything will be fine!

Answer:

Why looping?

extract($this->_records);

looks a bit shorter than

foreach($this->_records as $key => $value) {
    ${$key} = $value;
}

and native in addition

and var_dump is a great help sometimes (for the next time you run into trouble like this one) 🙂