| 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: 10 let
|
|||
0