Mam pole tabeli w bazie danych MySQL:
userid INT(11)
Więc wzywam go do mojej strony za pomocą tego zapytania:
"SELECT userid FROM DB WHERE name='john'"
Następnie, aby zająć się wynikiem, robię:
$row=$result->fetch_assoc();
$id=$row['userid'];
Teraz, jeśli to zrobię:
echo gettype($id);
Dostaję sznurek. Czy nie powinna to być liczba całkowita?
$conn->query("your query")
otrzymałem pola liczb całkowitych jako ciąg, ale kiedy użyłem,$conn->prepare("your query")
otrzymałem parametry tak, jak były w bazie danychOdpowiedzi:
Gdy wybierzesz dane z bazy danych MySQL przy użyciu PHP, typ danych będzie zawsze konwertowany na ciąg. Możesz przekonwertować go z powrotem na liczbę całkowitą, używając następującego kodu:
Lub używając funkcji
intval()
:źródło
Użyj mysqlnd (natywnego sterownika) dla php.
Jeśli korzystasz z Ubuntu:
Jeśli jesteś na Centos:
Natywny sterownik odpowiednio zwraca typy całkowite.
Edytować:
Jak zauważył @Jeroen, ta metoda będzie działać tylko po wyjęciu z pudełka w przypadku PDO.
Jak zauważył @LarsMoelleken, ta metoda będzie działać z mysqli, jeśli ustawisz również opcję MYSQLI_OPT_INT_AND_FLOAT_NATIVE na true.
Przykład:
źródło
$link = mysqli_connect('localhost', 'root', ''); mysqli_set_charset($link,'utf8'); $result = mysqli_query($link,'SELECT CAST(\'3.51\' AS DECIMAL(3,2))'); $row = mysqli_fetch_assoc($result); var_dump($row);
zwraca:array(1) { ["CAST('3.51' AS DECIMAL(3,2))"]=> string(4) "3.51" }
Najłatwiejsze rozwiązanie, które znalazłem:
Możesz wymusić na json_encode używanie rzeczywistych liczb dla wartości, które wyglądają jak liczby:
(od PHP 5.3.3).
Możesz też po prostu przesłać swój identyfikator do int.
źródło
json_encode
do oddania ciąg do int czy możliwe jest jak za pomocą mikroskopu dusić paznokcie.UNIX_TIMESTAMP()
np. Przez.Moim rozwiązaniem jest przekazanie wyniku zapytania
$rs
i pobranie tablicy assoc rzutowanych danych jako zwrotu:Przykładowe użycie:
źródło
Nie. Niezależnie od typu danych zdefiniowanego w tabelach, sterownik MySQL PHP zawsze obsługuje wartości wierszy jako ciągi.
Musisz przesłać swój identyfikator do int.
źródło
Podoba mi się odpowiedź Chada, zwłaszcza gdy wyniki zapytania będą przekazywane do javascript w przeglądarce. Javascript bezproblemowo traktuje encje numeryczne jako liczby, ale wymaga dodatkowej pracy, aby traktować encje podobne do liczb jako ciągi. tj. musi na nich używać parseInt lub parseFloat.
Opierając się na rozwiązaniu Chada, używam tego i często jest to dokładnie to, czego potrzebuję i tworzy struktury, które można zakodować w formacie JSON, aby ułatwić obsługę w javascript.
Dodanie ciągu liczbowego do 0 tworzy w PHP typ numeryczny i poprawnie identyfikuje typ, dzięki czemu liczby zmiennoprzecinkowe nie zostaną obcięte do liczb całkowitych.
źródło
Dzieje się tak, gdy
PDO::ATTR_EMULATE_PREPARES
jest ustawionetrue
na połączenie.Ostrożnie, ustawienie go tak, aby
false
uniemożliwić użycie parametrów więcej niż raz. Uważam, że wpływa to również na jakość powracających komunikatów o błędach.źródło
Możesz to zrobić za pomocą ...
... w zależności od rozszerzenia, którego chcesz użyć. Pierwsza nie jest zalecana, ponieważ rozszerzenie mysql jest przestarzałe. Trzeci jest nadal eksperymentalny.
Komentarze w tych hiperłączach dobrze się spisują, wyjaśniając, jak ustawić typ ze zwykłego starego ciągu na jego oryginalny typ w bazie danych.
Niektóre frameworki również to abstrakcyjne (zapewnia CodeIgniter
$this->db->field_data()
).Możesz także zgadywać - na przykład przeglądać wynikowe wiersze i używać na każdym z nich is_numeric () . Coś jak:
To zmieniłoby wszystko, co wygląda jak liczba, w jedno ... zdecydowanie nie jest idealne.
źródło
if (is_float()) { $value = (float)$value; }
W moim projekcie zwykle używam zewnętrznej funkcji, która „filtruje” pobierane dane
mysql_fetch_assoc
.Możesz zmieniać nazwy pól w tabeli, aby intuicyjnie zrozumieć, jaki typ danych jest przechowywany.
Na przykład, możesz dodać specjalny sufiks do każdego pola liczbowego: jeśli
userid
jestINT(11)
, możesz zmienić jego nazwęuserid_i
lub jeśli jestUNSIGNED INT(11)
, możesz zmienić nazwęuserid_u
. W tym momencie możesz napisać prostą funkcję PHP, która jako dane wejściowe otrzyma tablicę asocjacyjną (pobieraną za pomocąmysql_fetch_assoc
) i zastosować rzutowanie na „wartość” przechowywaną za pomocą tych specjalnych „kluczy”.źródło
Jeśli używane są przygotowane instrukcje, typem będzie int. Ten kod zwraca tablicę wierszy, gdzie każdy wiersz jest tablicą asocjacyjną. Jak gdyby
fetch_assoc()
został wywołany dla wszystkich wierszy, ale z zachowanymi informacjami o typie.źródło
MySQL ma sterowniki dla wielu innych języków, konwertując dane na łańcuchy „standaryzuje” dane i pozostawia użytkownikowi możliwość rzutowania wartości typu na int lub inne
źródło
W moim przypadku
mysqlnd.so
zostało zainstalowane rozszerzenie. ALE tego nie zrobiłempdo_mysqlnd.so
. Tak więc, problem rozwiązany został poprzez wymianępdo_mysql.so
zpdo_mysqlnd.so
.źródło
Podoba mi się technika masterminda , ale kodowanie może być prostsze:
Dodałem również sprawdzanie, czy zapytanie zwraca false, a nie zestaw wyników.
I sprawdzanie wiersza z polem, które ma wartość null.
A jeśli pożądany typ to string, to nie tracę na to czasu - to już jest string.
Nie zawracam sobie głowy używaniem tego w większości kodu PHP; Po prostu polegam na automatycznej konwersji typu php. Ale w przypadku odpytywania dużej ilości danych, aby następnie wykonać obliczenia arytmetyczne, rozsądne jest rzutowanie z góry na optymalne typy.
źródło