Oznámení
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:
- pokud maska začíná vykřičníkem, tak se použije eregi
- pokud maska obsahuje znak procento (%), tak se na začátek masky připíše ^, procenta se nahradí .* a na konec masky se dá $
- 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.