Autor Zpráva
notwist
Profil
Zdravím,

můžete mi někdo poradit, co dělám špatně?

Tento příklad funguje. Vezme si hodnotu z databáze a vypíše: "Toto je jméno Josef"
$test = "Toto je jméno $radek[jmeno]";
echo "<td>$test</td>";

Tento příklad ale nefunguje. V poli pole3 v databázi mám tento text: "Toto je jméno $radek[jmeno]" (bez uvozovek). Když proměnnou $text_zpravy vypíšu, napíše mi přesně to, co je zadané v databázi. Já bych ale potřeboval, aby se za $radek[jmeno] dynamicky doplnila hodnota jako v prvním příkladu a ne to jen vypsat jako text.
$text_zpravy = mysql_result(mysql_query("SELECT pole3 FROM x_aktiv WHERE tabulka = '$table' AND projekt='$projekt' AND typ='sms'"), 0);
echo "<td>$text_zpravy</td>";

Poradíte někdo, prosím?
Dan Charousek
Profil
Podobný případ se řešil zde.
Jednoduše: nedělej to.

Jestli chceš v nějakém textu, který je uložený v DB vypisovat nějakou hodnotu ze sloupce, také v DB, můžeš si dodefinovat nějakou vlastní funkci, která bude nahrazovat nějaké zástupné znaky (podobně jako v odkázaném vlákně).

<?php

function replaceFromArray(array $data, $input) {
    return preg_replace_callback("~\{(.*?)\}~", function($m) use ($data) {
        return isset($data[$m[1]]) ? $data[$m[1]] : $m[0];
    }, $input);
}

$arr = ["neco" => "Hello world!"];
$string = "Zde bude {neco} a zde {nic}";

echo replaceFromArray($arr, $string); // Vypíše: Zde bude Hello World! a zde {nic}

?>

V tvém případě s databází by to mohlo vypadat nějak takto:

$dotaz = mysql_query("SELECT pole3 FROM x_aktiv WHERE tabulka = '$table' AND projekt='$projekt' AND typ='sms'");
while($row = mysql_fetch_assoc($dotaz)) {
    echo replaceFromArray($row, $row['pole3']);
}
edit: doplnil jsem středník, který mi při psaní vypadl :)
notwist
Profil
Paráda! :-) Vyzkouším a děkuji za rychlou odpověď.
juriad
Profil
notwist:
To nejde. Nahrazování je možné jen v řetězcovém literálu, nikoli v existujícím řetězci. To by byla obrovská bezpečnostní díra, vem si, že že by uživatel do svého komentáře zadal název proměnné a ona by se doplnila na výstup. Pak by to byla jen otázka času a zkoušení, než by zjistil, v které proměnné je uloženo heslo k databázi.

Toto se řeší tak, že do databáze uložíš nějaký svůj řetězec, například:
"Jméno uživatele je %JMENO% a je mu %VEK% let."
Pak jen pomocí například preg_replace_callback nahradíš sekvence %něco% jak budeš potřebovat, nikoli za jakoukoli existující proměnnou.
Dan Charousek
Profil
Taky bys neměl používat mysql.
notwist
Profil
Proč ne?
Dan Charousek
Profil
notwist:
Viz. článek, na který odkaz odkazuje.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: