ugrás a tartalomhoz

preg_replace és adatbázis lekérdezés

sandrosdj · 2012. Júl. 22. (V), 18.43
Üdv!

Adott egy ilyen:
preg_replace('#\{builtin:([a-zA-Z_]+)\}#e', '\\1', $in);
Ahol a \\1 van az visszaadja a szöveget, ami a builtin: után van.
Amit oda beírok, az egy szó, aminek az adatbázisban meg van a párja és adatbázisból szeretném lekérni a hozzá tartozó másik mezőt. Hogy érthetőbb legyen megpróbálom ábrázolni:


adatbázis:
---------------------------
- name ---- content       -
- -------------------------
- weather - <?=$weather?> -  (korábban: $weather = "Jó idő";)
- sajt    - <b>deszka</b> -
- kenyer  - zsíroskenyér  -
---------------------------
oldalon:
{builtin:weather}

aminek meg kéne jelenjen preg_replace után:
Jó idő


Hogyan, milyen módon lehetne ezt megcsinálni?
 
1

preg_replace() helyett

kuka · 2012. Júl. 22. (V), 18.59
preg_replace() helyett használj preg_replace_callback()-et, a callback függvényben pedig programozd le az adatbázis lekérdezést. Valahogy így:

preg_replace_callback('#\{builtin:([a-zA-Z_]+)\}#', 'cserebere', $in);

function cserebere($talalat)
{
  $eredmeny = mysql_query("select content from tabla where name='" . mysql_real_escape_string($talalat[1]) . "'");

  if ($sor = mysql_fetch_assoc($eredmeny)) return $sor['content'];

  return $talalat[1];
}
Persze ez így keservesen lassú lesz ha több dolgot is le kell cserélni. Úgyhogy én inkább előre beolvasnám az tábla szóba jöhető értékeit egy tömbbe és onnan cserélgetnék. Ugyancsak preg_replace_callback() használatával.
2

Köszönöm a választ! :) Kapok

sandrosdj · 2012. Júl. 22. (V), 19.23
Köszönöm a választ! :)

Kapok egy ilyen hibát:
Warning: preg_replace_callback(): Requires argument 2, 'cserebere', to be a valid callback in /home/sandros/wwwroot/core.php on line 335
ettől függetlenül úgy veszem észre, hogy működik.
3

Én nem kapok.

kuka · 2012. Júl. 23. (H), 09.05
Én nem kapok. error_reporting(E_ALL) mellett PHP 5.3.14 zokszó nélkül végrehajtja.
4

Már nincs hiba, viszont azt

sandrosdj · 2012. Júl. 25. (Sze), 17.28
Már nincs hiba, viszont azt hogyan tudnám még megcsinálni, hogy ha az adatbázisban php kód van, az is fusson le?

Jelenleg van egy ilyenem, de nem működik:
if($sor = mysql_fetch_assoc($eredmeny))
{
	$str = $sor['content'];
	$str = eval("?> ".$str." <?php ");
	return $str;
}
Próbáltam már így is, de így sem:
if($sor = mysql_fetch_assoc($eredmeny))
{
	$str = $sor['content'];
	eval("\$str = \"$str\";");
	return $str;
}
5

ha az adatbázisban php kód

kuka · 2012. Júl. 25. (Sze), 17.46
ha az adatbázisban php kód van, az is fusson le?
Őszintén szólva én az ilyentől menekülök mint vámpír a fokhagymás házikolbásztól. PHP-ban voltak eddig a legrosszabb tapasztalataim az eval()-lal. De ettől függetlenül sem szoktam adatbázisban kódot tárolni.

Ha muszáj volna, valószínűleg egy ronda de stabil megoldást tákolnék össze:
  • A PHP kódot kiírnám egy időszakos állományba.
  • Szabó B. Gábor PHP alapú sablonmegoldás blogbejegyzése alapján include-al futtatnám és ob_start()/ob_get_contents()/ob_end_clean() segítségével csípném el a kimenetét.
Persze előbb várj még más hozzászólásokra, mert könnyen lehetséges, hogy van szép és jó módszer is.

Addig is egy kérdés: ha már PHP kód, akkor miért {builtin:weather} és nem $builtin['weather'], aztán oldja meg a PHP, hiszen az a dolga?
6

Ez egyfajta bb-kód szerűség

sandrosdj · 2012. Júl. 25. (Sze), 18.11
Ez egyfajta bb-kód szerűség lenne és ha több változóhoz is hozzáférnének az nem lenne valami biztonságos, ezért szeretném így megoldani.
7

Ha bbcode

Pepita · 2012. Júl. 28. (Szo), 03.17
Ha a funkció lényege hasonló, mint a bbcode-é, akkor szükségtelen PHP kódot tárolnod az adatbázisban. Ha konkrétan bbcode, akkor talász rá kész megoldásokat is.