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];
 }}
 
Poradíte prosím?
Kajman
Profil
Mrkněte se na www.php.net/manual/en/function.preg-replace-callback.php
blaaablaaa
Profil
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
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
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) {
- z $row nic využíváte
- 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 :-)

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:

0