Autor Zpráva
nethor
Profil
Zdravím,
jak správně upravit velké číslo pro MySQL ? Sloupec je typ bigint.
Přetypování (int) i intval() v php přeteče, tak nějak funguje floatval(), ale myslím, že to taky není správné řešení.
Našel jsem zmínky o gmp_intval() - ten ale přetéká také, moc tedy nechápu, k čemu je ta fce dobrá.
Asi by to šlo řešit regulárem, ale to mi přijde trochu přes ruku.

Jak na to?
Alphard
Profil
float je hloupost, nemá dostatečnou přesnost. Z GMP instancí by se stejně musel exportovat string, regulár je myslím dobrý nápad.
nethor
Profil
OK, takhle nějak?
function bigint($Value){
    $Value = preg_replace("~\D+~","",$Value);
    if(strlen($Value) < 1) {
        $Value = 0    ;
    }
    return $Value        ;
}
edit: .. doplněno ošetření nuly.
Kajman
Profil
Mínus před čísly bych neodstraňoval a nulu vracel jako string nebo null.
nethor
Profil
Kajman:
To je pravda, mínus jsem v tomto případě neřešil a mohlo by se to vymsít.
U nuly je myslím v tomhle případě jedno, jetli je string nebo int, ale null by určitě být neměla, způsobovalo by to chyby v MySQL.
Nějak se to komplikuje, nedaří se mi to dostat do jenoho reguláru.
function bigint($Value){
    $Minus = preg_replace("~(-)?.*~","$1",$Value)    ;    
    $Value = $Minus.preg_replace("~\D+~","",$Value);
    if(strlen($Value) < 1 || $Value == "-") {
        $Value = 0    ;
    }
    return $Value        ;
}
juriad
Profil
Nevidím přímý způsob, jak to udělat jedním regexem.
Osobně bych odstranil vše kromě číslic, a pak k tomu na začátek přilepil mínus, pokud mínus bylo kdekoli v původním řetězci (zjisíš pomocí strpos).

function bigint($Value) {
    $Minus = strpos($Value, "-") !== FALSE; # je záporné
    $Value = preg_replace("~\D~", "", $Value); # odstraníme nečísla
    $Value = preg_replace("~^0*~", "", $Value); # odstraníme počáteční nuly
    if (strlen($Value) == 0) { # pokud nezbylo nic
        return "0";
    }
    if ($Minus) { # vrátíme mínus na začátek
        $Value = "-" . $Value;
    }
    return $Value;
}
Keeehi
Profil
nethor:
Jde ti o přetypování nebo o ochranu aby ti uživatel nenacpal něco nepěkného do databáze?

function isBigInt($value) {
    return preg_match('~-?\D+~', $value) === 1;
}

Když ti to projde, můžeš tu promennou s klidem vrazit do dotazu.
nethor
Profil
juriad:
Prakticky totéž (doufám) dělá funkce, kterou jsem uvedl, jen s tím rozdílem, že akceptuji mínus pouze na začátku.
Na nuly na začátku jsem, pravda, také zapomněl. Ty ale v dotazu nevadí, ve prospěch rychlosti scriptu bych to oželel.

Keeehi:
Obojí.
Jde o zpracování dat z XML, hodnoty bigint potřebuji jako klíče k propojení tabulek.
Proto jsem původně také řešil jen kladné hodnoty. Ale, když už se s ím pářu, chtěl jsem najít evivalent fce intval() , ale s větším (ev. neomezeným) rozsahem.
Konkrétně mi jde i fci, kterou můžu bez obav použít pro vytvoření dotazu na MySQL.
např:
 mysql_fetch_object(mysql_query("select * from `table` where Id = ".bigint($Id)." limit 1"));
Alphard
Profil
Identifikátor může být řetězec, není třeba zacházet s ním jako s číslem.
Kajman
Profil
Alphard:
Místo zabrané tabulkou a indexy bude v případě bigintu menší. Takže identifikátor bych v db použil bigint, ale parametr v dotazu může být klidně string, db si to přetypuje.
nethor
Profil
OK.
Vzhledem k tomu, že jde v tomto konkréním případě pravděpodobně o autoincermenty,
nechám v Db typ bigint a v PHP bude asi stačit funkce v oblasti přirozených čísel (1. zmíněná).
Děkuji za pomoc.

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