您好,欢迎访问一九零五行业门户网

mysqli 和 pdo 查询出来的类型转换

一直有一个问题,就是php用mysqli还是pdo,查询出来的结果都是int类型的数据会自动变成string类型,php本身弱类型。但是现在写api,直接从数据库里查出来的结果,然后json_encode 返回给客户端是不行的。java 和 oc 都是强类型 数字就是数字,字符串就是字符串。123 != 123
这个是程序代码,用的mysqli类
这个是表结构
这个是查询 出来的结果
google 了好多说法,pdo倒是有解决的方法pdo查询int转换成string的问题。但是mysqli没找到,而且不知道这个究竟是什么问题。或者是有没有一些现成的类库,可以自动转换的。
回复内容: 一直有一个问题,就是php用mysqli还是pdo,查询出来的结果都是int类型的数据会自动变成string类型,php本身弱类型。但是现在写api,直接从数据库里查出来的结果,然后json_encode 返回给客户端是不行的。java 和 oc 都是强类型 数字就是数字,字符串就是字符串。123 != 123
这个是程序代码,用的mysqli类
这个是表结构
这个是查询 出来的结果
google 了好多说法,pdo倒是有解决的方法pdo查询int转换成string的问题。但是mysqli没找到,而且不知道这个究竟是什么问题。或者是有没有一些现成的类库,可以自动转换的。
关闭模拟预处理时,能保持数据类型,但某些类型,输出的数据跟数据库里的值不一致:
比如float(9,2)类型的字段,字段内容为32.10,pdo关闭模拟预处理时读到的值为32.099998474121,类型为float.
也就是说开启pdo模拟预处理(默认),返回的数据类型都是string,值跟数据库存储的内容一致.
mysql服务器没有使用预处理时,返回的是string类型的数据.
mysqli不使用prepare查询返回的字段类型全部是string,值跟数据库存储的内容一致.
使用prepare时跟pdo_mysql关闭模拟预处理一样,返回对应类型的数据(decimal类型依旧是字符串),而且float类型的值也存在不一致.
所以,数据库中带有小数点的数据,建议使用字符串类型或decimal类型保存.
类型转换:
settype($foo, array);
settype($foo, bool);
settype($foo, boolean);
settype($foo, float);
settype($foo, int);
settype($foo, integer);
settype($foo, null);
settype($foo, object);
settype($foo, string);
$foo = (array)$foo;
$foo = (b)$foo; // from php 5.2.1
$foo = (binary)$foo; // from php 5.2.1
$foo = (bool)$foo;
$foo = (boolean)$foo;
$foo = (double)$foo;
$foo = (float)$foo;
$foo = (int)$foo;
$foo = (integer)$foo;
$foo = (object)$foo;
$foo = (real)$foo;
$foo = (string)$foo;
可以用mysqli_result对象的fetch_field方法来获得字段的元数据。参见:php: mysqli_result::fetch_field - manual。
相关方法还有fetch_fields、fetch_field_direct。
给个示例吧:
//获取到$result之后$types = array();while ( $finfo = $result->fetch_field() ) { if ( in_array( $finfo->type, array( mysqli_type_bit, mysqli_type_tiny, mysqli_type_short, mysqli_type_long, mysqli_type_longlong, mysqli_type_int24 ) ) { $type = 'int'; } else if ( in_array( $finfo->type, array( mysqli_type_float, mysqli_type_double, mysqli_type_decimal, mysqli_type_newdecimal ) ) { $type = 'float'; } else { //其他需要转换的类型请自行研究 //类型常量请参见http://php.net/manual/zh/mysqli.constants.php,mysqli_type开头的那些就是 $type = 'string'; } $types[$finfo->name] = $type;}$result = $result->fetch_assoc();foreach ( $result as $name => &$value ) { settype($value, $types[$name]);}//现在$result里的数据类型已经符合要求了
其它类似信息

推荐信息