Das erste Beispiel hat nicht funktioniert, da die doppelten Anführungszeichen nicht rekursiv Variablen ersetzen. "$html_code" gibt dir nur einen String, der den Inhalt der Variable $html_code enthält, aber nicht Platzhalter in diesem ersetzt. Einziger Hack an dieser Stelle wäre
eval,
von dem ich aber dringend abrate.
PHP-Code:
function global_query($string, $html_code) {
//$resultset = mysql_query($string);
//while ($field = mysql_fetch_object($resultset)) {
// Platzhalter-Objekt an Stelle von DB-Ergebnis
$field = (object) array('name' => 'Test');
if (eval("\$formatted = \"$html_code\";") !== FALSE) {
return $formatted;
}
//}
}
// Dollarzeichen muss auch hier escaped werden, da PHP sonst hier schon
// Variablenersetzung versucht
echo global_query("SELECT 1", "<b>\$field->name</b>");
Nicht nur fällt dieser Code schon auseinander, wenn man Parameter nicht korrekt ausklammert (zudem müssen durch die doppelte Auswertung z. B. Anführungsstriche als
\\\" geschrieben werden), sondern man müsste auch erheblichen Aufwand betreiben, um seinen Vorlage-String sauber zu bekommen, wenn dieser bereits zum Teil aus Benutzerinhalt besteht, da man ansonsten leicht Opfer des Äquivalents einer SQL-Injection wird, bei der beliebiger PHP-Code ausgeführt werden kann.
Außerdem hast du noch das Problem, dass deine Datenbank-Inhalte u. U. keine gültigen HTML-Textliterale sind (wenn sie z. B. spitze Klammern oder Entitäten enthalten).