Autor | Zpráva | ||
---|---|---|---|
nethor Profil |
#1 · Zasláno: 22. 3. 2016, 14:50:09
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 |
#2 · Zasláno: 22. 3. 2016, 15:01:49
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 ; } |
||
Kajman Profil |
Mínus před čísly bych neodstraňoval a nulu vracel jako string nebo null.
|
||
nethor Profil |
#5 · Zasláno: 22. 3. 2016, 17:05:09
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 |
#9 · Zasláno: 22. 3. 2016, 23:48:36
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 |
#11 · Zasláno: 24. 3. 2016, 22:31:30
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. |
||
Časová prodleva: 9 let
|
0