Je query lijkt mij prima. Ik weet niet of je in je huidige code er rekening mee houdt, maar zorg ook even dat je $bericht een mysqli_real_escape_string() bevat om SQL injections tegen te gaan.
<?php
// Lees eerst de te vervangen variabelen in d.m.v. een query
// Bijv
$sql = "select tekst from tabel";
$cResult = mysqli_query($verbinding,$sql);
$rowResult = mysqli_fetch_array($cResult);
$cVar1 = $rowResult['tekst'];
// Zorg dat in je tekst de verwijzingen staan. In dit voorbeeld is dit de variabele '[#naam2]'
// De tekst is dan: Verhaaltje, pietje loopt in het bos en toen kwam [&naam2] ook. ';
$cVerhaal = str_replace("[&naam2]",$cVar1,$cVerhaal);
?>
Dit kun je zo met, in principe, een oneindig aantal var's doen
> Welicht is het dan 'beter' ipv [&naam2] gewoon $naam2 te doen.
Daarmee loop je wel het risico dat PHP probeert om $naam2 te interpoleren (wat een E_NOTICE geeft als $naam2 niet bestaat, en wat sowieso niet leidt tot het gewenste eindresultaat).
Waar ik zelf de voorkeur aan geef is om de placeholder ook af te sluiten, dus bijvoorbeeld: %naam2%. Anders wordt het lastiger om onderscheid te maken tussen naam2 en naam20 (want is naam20 een variabele, of is het naam2 gevolgd door een 0?)