PHP + PDO + MySQL:如何从MySQL中返回整数和数字列作为整数和数字在PHP中?
我已经看到这个问题在Stack Overflow上重复了几次,但是没有一个能够充分地探究这个问题(或者至less对我有帮助)
问题是数据库查询应该返回整型数据types的整数列在PHP中。 而是查询以stringtypes的forms返回每一列。
我已经确保“PDO :: ATTR_STRINGIFY_FETCHES”如果只是为了确保结果不被转换为string。
我见过的答案:
- 这是不能做到的
- 不,它正在Mac OS X上安装PHP / MySQL
- 在你的代码中input所有的值
- 不,我不会这样做的
- 不要担心,PHP是松散的types
- 我的数据以JSONforms输出,并被许多其他服务使用,有些则需要格式正确的数据
从我的研究中,我了解到这是一个驱动程序的实现问题。
许多消息来源声称,MySQL本地驱动程序不支持返回的数字types。 这似乎不正确,因为它在Mac OS X上工作。除非他们的意思是说“ Linux上的MySQL本地驱动程序不支持该function”。
这意味着我在Mac OS X上安装的驱动程序/环境有一些特殊之处。我一直试图找出差异来应用修复程序,但是由于我对如何检查这些东西的知识而受到限制。
区别:
- OS X上的PHP是通过Home Brew编译和安装的
- Ubuntu上的PHP通过“apt-get install php5-dev”安装
- OS X上的PHP连接到也在OS X上运行的MySQL服务器
- 服务器版本:5.1.71-日志源分配
- Ubuntu上的PHP连接到Rackspace云数据库
- 服务器版本:5.1.66-0 + squeeze1(Debian)
Ubuntu环境
- 版本:10.04.1
- PHP 5.4.21-1 + debphp.org〜lucid + 1(cli)(内置:2013年10月21日08:14:37)
-
php -i
PDO_MYSQL
用于MySQL的PDO驱动程序=>启用的客户端API版本=> 5.1.72
Mac OS X环境
- 10.7.5
- PHP 5.4.16(cli)(内置:2013年8月22日上午09时05分58秒)
-
php -i
PDO_MYSQL
用于MySQL的PDO驱动程序=>启用客户端API版本=> mysqlnd 5.0.10 – 20111026 – $ Id:e707c415db32080b3752b232487a435ee0372157 $
使用的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,
任何帮助和专业知识将不胜感激:)如果我find答案,我一定会在这里发布。
解决的办法是确保你使用的是mysql的mysqlnd驱动程序。
你怎么知道你没有使用mysqlnd?
当查看php -i
,将不会提及“mysqlnd”。 pdo_mysql
部分将有这样的东西:
pdo_mysql PDO Driver for MySQL => enabled Client API version => 5.1.72
你如何安装它?
L / A / M / P的大多数安装指南都build议apt-get install php5-mysql
但是MySQL的本地驱动程序是由不同的包安装的: php5-mysqlnd
。 我发现这是可用的ppa:ondrej / php5-oldstable 。
切换到新的驱动程序(在Ubuntu上):
- 删除旧的驱动程序:
apt-get remove php5-mysql
- 安装新的驱动程序:
apt-get install php5-mysqlnd
- 重新启动apache2:
service apache2 restart
如何检查驱动程序是否正在使用?
现在, php -i
将在pdo_mysql
部分明确提到“mysqlnd”:
pdo_mysql PDO Driver for MySQL => enabled Client API version => mysqlnd 5.0.10 - 20111026 - $Id: e707c415db32080b3752b232487a435ee0372157 $
PDO设置
确保PDO::ATTR_EMULATE_PREPARES
是false
(检查你的默认值或设置它):
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
确保PDO::ATTR_STRINGIFY_FETCHES
为false
(检查您的默认设置或设置它):
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
返回值
- 浮点types(FLOAT,DOUBLE)以PHP浮点forms返回。
- 整数types(INTEGER,INT,SMALLINT,TINYINT,MEDIUMINT,BIGINT†)作为PHP整数返回。
- 定点types(DECIMAL,NUMERIC)作为string返回。
†大于64位有符号整数(9223372036854775807)的BIGINT将以stringforms返回(或32位系统上的32位)
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)