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: 4 roky
|
0