tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

Prefixy pro tabulky

před 11 lety

jansfabik
Člen | 193

Zdravím,

pro jednotlivé tabulky mám zvolené prefixy a potřebuji je pomocí substFallBack doplnit. Ale potřeboval bych poradit, jak to mám udělat, když potřebuji nastavit stejně začínajícím tabulkám stejný prefix.

Chci něco takového:

<?php
$paterns = array (
    'tabulka' => 'prefix1_',
    'skupinatabulek_.*' => 'prefix2_',
    '.*' => 'prefix3_'
    );
?>

Asi budu nucen použít POSIX Regex pro zajištění zpětné kompatibility, ale obávám se, že to bude hodně pomalé:

<?php
function substFallBack($table)
{
    global $paterns;
    foreach ($paterns as $patern => $prefix)
        if (eregi ($patern, $table))
            return $prefix.$table;
    return $table;
}

dibi::setSubstFallBack('substFallBack');
?>

A navíc je tady problém s tím, že když se tabulka jmenuje třeba ‚abctabulka‘, tak se mi v případě masky ‚tabulka‘ přidá špatný přefix.

Tak vás proto žádám o radu, jak to mám nejlépe udělat.

před 11 lety

phx
Člen | 652

Rychlosti bych se nebal. Mozna by stalo za to ony regulerni vyrazy upravit napr takto:

$paterns = array (
    '^tabulka$' => 'prefix1_',
    '^skupinatabulek_.*$' => 'prefix2_',
    '^.*$' => 'prefix3_'
    );

Tim osetris onu zamenu prefixu.

But muzes obecne udelat nejakou metodu jak pises (setSubstFallBack) a nebo definovat do dibi 3 ruzne prefixy a dat je natvrdo do SQL dotazu.

před 11 lety

jansfabik
Člen | 193

Tak jsem to vyřešil trochu jinak:

  1. pokud maska začíná vykřičníkem, tak se použije eregi
  2. pokud maska obsahuje znak procento (%), tak se na začátek masky připíše ^, procenta se nahradí .* a na konec masky se dá $
  3. pokud ani jedno neplatí, tak skript oveří, jestli se název tabulky rovná té masce
<?php

$paterns = array (
    'tabulka' => 'prefix1_',
    'skupinatabulek_%' => 'prefix2_',
    '!regexp[a-zA-Z]+' => 'prefix3_'
    );

function substFallBack($table)
{
    global $paterns;
    foreach ($paterns as $patern => $prefix) {
        if ($patern{0} == '!') {
            $patern = substr ($patern, 1);
            if (eregi ($patern, $table))
                return $prefix.$table;
        } elseif (strpos($table, '%')) {
            $patern = '^'.str_replace ('%', '.*', $patern).'$';
            if (eregi ($patern, $table))
                return $prefix.$table;
        } else {
            if ($patern == $table)
                return $prefix.$table;
        }
    }
    return $table;
}
?>

Možná by to chtělo ještě ošetřit u toho procentového zápisu přítomnost metaznaků, ale vyslím si, že ty se v názvech tabulek nepoužívají. Nebo možná by ještě bylo lepší, abych před načtením té funkce před všechny tyhle zápisy dal vykřičník a přepsal je na regulární výrazy.