PHP + PDO + MySQL: jak zwracać liczby całkowite i liczbowe z MySQL jako liczby całkowite i liczbowe w PHP?

widziałem to pytanie powtórzone kilka razy na Stack Overflow, ale żaden wystarczająco zbadać problem (lub przynajmniej w sposób, który jest dla mnie pomocny)

Problem polega na tym, że zapytanie DB powinno zwracać typy danych integer w PHP dla kolumn integer. Zamiast tego zapytanie zwraca każdą kolumnę jako typ string.

Upewniłem się, że "PDO:: ATTR_STRINGIFY_FETCHES" jeśli false tylko po to, aby upewnić się, że wyniki nie są rzucane na string.

Odpowiedzi, które mam widziany:

  • It can ' t be done
    • nie, to działa na Mac OS X zainstalowany PHP / MySQL
  • Wpisz wszystkie wartości w kodzie
    • Nie, Nie będę tego robić
  • nie przejmuj się tym, PHP jest luźno wpisane
    • moje dane są wyprowadzane jako JSON i są wykorzystywane przez wiele innych usług, niektóre wymagają danych w odpowiednim formacie

Z moich badań rozumiem, że jest to kierowca kwestia wdrożenia.

Wiele źródeł twierdzi, że natywny sterownik MySQL nie obsługuje zwracania typów liczbowych. Nie wydaje się to prawdą, ponieważ działa na Mac OS X. chyba że chodzi o to, że "natywny sterownik MySQL na Linux nie obsługuje tej funkcji".

Oznacza to, że jest coś specjalnego w sterowniku / środowisku, które zainstalowałem na Mac OS X. próbowałem zidentyfikować różnice w celu zastosowania poprawki, ale jestem ograniczony moją wiedzą o jak to sprawdzić.

Różnice:

  • PHP na OS X został skompilowany i zainstalowany przez Home Brew
  • PHP na Ubuntu został zainstalowany poprzez "apt-get install php5-dev"
  • PHP na OS X łączy się z serwerem MySQL działającym również na OS X
    • wersja serwera: 5.1.71-Dystrybucja źródeł logów
  • PHP na Ubuntu łączy się z bazą danych Rackspace Cloud
    • wersja serwera: 5.1.66-0+squeeze1 (Debian)

Środowisko Ubuntu

  • Wersja: 10.04.1
  • PHP 5.4.21-1+debphp.org ~ lucid+1 (cli) (zbudowany: październik 21 2013 08:14:37)
  • Php-i

    Pdo_mysql

    PDO Driver for MySQL = > enabled Client API version => 5.1.72

Środowisko Mac OS X

  • 10.7.5
  • PHP 5.4.16 (cli) (zbudowany: Aug 22 2013 09:05:58)
  • Php-i

    Pdo_mysql

    PDO Driver dla MySQL = > enabled Client API version = > mysqlnd 5.0.10 - 20111026 - $Id: e707c415db32080b3752b232487a435ee0372157 $

Używane flagi PDO

PDO::ATTR_CASE => PDO::CASE_NATURAL,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
PDO::ATTR_STRINGIFY_FETCHES => false,
PDO::ATTR_EMULATE_PREPARES => false,

Jakakolwiek pomoc i ekspertyza bylaby mile widziana :) napewno bede tu wrzucac jak znajde odpowiedz.

Author: stephenfrank, 2013-11-19

1 answers

Rozwiązaniem jest upewnienie się, że używasz sterownika mysqlnd dla php.

Skąd wiesz, że nie używasz mysqlnd?

Podczas przeglądania php -i, nie będzie wzmianki o "mysqlnd". Sekcja pdo_mysql będzie miała coś takiego:

pdo_mysql

PDO Driver for MySQL => enabled Client API version => 5.1.72

Jak go zainstalować?

Większość przewodników instalacji dla L/A/M / P sugeruje apt-get install php5-mysql, ale natywny sterownik dla MySQL jest instalowany przez inny pakiet: php5-mysqlnd. Odkryłem, że to dostępne z ppa: ondrej / php5-oldstable .

Aby przełączyć się na nowy sterownik (na Ubuntu):
  • Usuń stary sterownik:
    apt-get remove php5-mysql
  • Zainstaluj nowy sterownik:
    apt-get install php5-mysqlnd
  • Restart apache2:
    service apache2 restart

Jak sprawdzić, czy Sterownik jest używany?

Teraz {[3] } wspomni jawnie" mysqlnd " w sekcji pdo_mysql:

pdo_mysql

PDO Driver for MySQL => enabled
Client API version => mysqlnd 5.0.10 - 20111026 - $Id:      e707c415db32080b3752b232487a435ee0372157 $

Ustawienia PDO

Upewnij się, że PDO::ATTR_EMULATE_PREPARES jest false (sprawdź ustawienia domyślne lub set it):
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

Upewnij się, że PDO::ATTR_STRINGIFY_FETCHES jest false (sprawdź ustawienia domyślne lub ustaw je):
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);

Zwrócone wartości

  • typy zmiennoprzecinkowe (FLOAT, DOUBLE) są zwracane jako pływaki PHP.
  • typy Integer (INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT †) są zwracane jako liczby całkowite PHP.
  • typy punktów stałych (dziesiętne, liczbowe) są zwracane jako łańcuchy znaków.

† BIGINTs o wartości większej niż 64 bit signed int (9223372036854775807) zwróci jako ciąg znaków (lub 32 bity w systemie 32 bitowym)

    object(stdClass)[915]
      public 'integer_col' => int 1
      public 'double_col' => float 1.55
      public 'float_col' => float 1.5
      public 'decimal_col' => string '1.20' (length=4)
      public 'bigint_col' => string '18446744073709551615' (length=20)
 100
Author: stephenfrank,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-07 06:25:00