php - Trying to get property of non-object works on one part of page but not on other

I'm retrieving a row from my MySQL database using a prepared statement that works fine (tested in phpmyadmin) with the specific values etc.

I use <?php echo (htmlspecialchars($row_feed->f_text)); ?> to display it on line 400 of my page and again on line 900 (it's an actual copy paste). The first instance displays the result as expected and the second throws an error:

Uncaught Customizable_Exception: Trying to get property 'f_text' of non-object in C:\xampp\htdocs\bbto.eu\index.php:878

How is that even possible? I've checked, the $row_feed variable is not reused for something else in between and it works fine in the same file a couple of lines ahead. The only thing is that the first instance is within this loop while($row_feed = $feed->fetch_object()) { } while the other one is after it closes but since when has that any impact?

Minimal reproducible example:

$sql = "SELECT * FROM feed";
$statement = $mysqli->prepare($sql);
if(!$statement->execute()) { die("Query error: ".$statement->error); } 
$feed = $statement->get_result();

while ($row_feed = $feed->fetch_object()) {
echo (htmlspecialchars($row_feed->f_text));
}
### other stuff going on
echo (htmlspecialchars($row_feed->f_text));

I get my error on the second echo.

Answer

Solution:

The only thing is that the first instance is within this loop while($row_feed = $feed->fetch_object()) { } while the other one is after it closes but since when has that any impact?

The basic principle of doing such a while loop over the query result, is that the fetch call will return NULL when there are no more records to be processed, and that is what makes the loop terminate at this point then. So of course after your loop, $row_feed is NULL.

how can I reuse $row_feed's last value

Store it into a different variable, inside the while loop: $last_row = $row_feed;. This will be overwritten in each loop iteration, so only the last value will ???survive??? after the loop. Since it is inside the loop, this line will not execute any more when $row_feed = $feed->fetch_object() has resulted in NULL.

while ($row_feed = $feed->fetch_object()) {
  echo htmlspecialchars($row_feed->f_text);
  $last_row = $row_feed;
}
### other stuff going on
echo htmlspecialchars($last_row);

Source