| Autor | Zpráva | ||
|---|---|---|---|
| potom Profil |
Ahoj, peru se s následujícím poblémem, a pořád nemůžu přijít na nějaké elegantní řešení.
V databází mám v buňce uložený kód například <table> <tbody> <tr> <td>%060%</td> <td>%090%</td> <td>%030%</td> </tr> </tbody> </table> Potřebuji, aby se před výstupem do prohlížeče provedlo to, že při zaznamenání masky %xxx% se tato maska nahradila výstupem z dotazu $sqr = "SELECT * from table WHERE identifikator = '%xxx%";
$result = $conn2->query($sqr);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo row[text];
}}
|
||
| Kajman Profil |
#2 · Zasláno: 5. 12. 2019, 19:34:43
Mrkněte se na www.php.net/manual/en/function.preg-replace-callback.php
|
||
| blaaablaaa Profil |
#3 · Zasláno: 6. 12. 2019, 09:07:25
Kajman:
Tady bych to udělal spíš vytáhnutím všech kódů z databáze do pole a obyčejným str_replace, než se v callbacku zvlášť dotazovat na jednotlivé kódy. |
||
| Kajman Profil |
#4 · Zasláno: 6. 12. 2019, 09:57:47
Když budou v textu tři náhrady, ale v databázi možných 10000 kódů, tak nebude vhodné chystat vše.
Ono by bylo univerzálnější získat všechny výskyty kódů, které se mají v textu nahradit www.php.net/manual/en/function.preg-match-all.php vyhodit z toho duplicity, udělat dotaz na tyto identifikátory, nachystat je do pole (nebo přímo do dvou polí) a pak udělat ten str_replace. |
||
| potom Profil |
#5 · Zasláno: 6. 12. 2019, 10:08:42
Díky za radu, řeším něco podobného poprvé, zbastlil jsem toto, ale to nefunguje:
$string = '[1] něco něco [2] ';
$newstring = preg_replace_callback( '#\[(.*?)\]#',
function($match) {
$res = $conn2->query("SELECT * from position WHERE storno = '0' AND seat_group = '$match' ");
if ($res->num_rows > 0) {
while($row = $res->fetch_assoc()) {
$outext .= ' <input class="form-check-input" id="" name = "" type="checkbox" value=""> ' ;
}}
return $outext;
},
$string
);
echo $newstring; |
||
| Kajman Profil |
A nefunguje to nějak konkrétně?
Edit: Na druhý pohled - anonymní funkci předáte proměnnou $conn2 např. díky konstrukci function($match) use($conn2) {- vstup do dotazu není ošetřen - pozor na sql injection - obsah závorky bude v $match[1] |
||
| potom Profil |
Kajman:
Děkuji moc, moc jste pomohl. Opravil jsem na fungující: $string = '[1] něco něco [2] ';
$newstring = preg_replace_callback( '#\[(.*?)\]#',
function($match) use($conn2) {
$res = $conn2->query("SELECT * from position WHERE storno = '0' AND seat_group = '$match[1]' ");
if ($res->num_rows > 0) {
while($row = $res->fetch_assoc()) {
$outext .= ' <input class="form-check-input" id="" name = "" type="checkbox" value=""> ' ;
}}
return $outext;
},
$string
);
echo $newstring;SQL injection ošetřuji funkcí, a z $row budu využívat id jako name input. Tam jsem ještě nedošel, díky moc :-) |
||
|
Časová prodleva: 7 let
|
|||
0