我有一个PHP json_encode函数的问题.它将数字编码为字符串,例如
array('id' => 3)
Run Code Online (Sandbox Code Playgroud)
变
"{ ["id": "3", ...)
Run Code Online (Sandbox Code Playgroud)
当js遇到这些值时,它会将它们解释为字符串,并且数值操作会失败.有谁知道一些方法来防止json_encode编码数字作为字符串?谢谢!
我在MySQL数据库中有一个表字段:
userid INT(11)
Run Code Online (Sandbox Code Playgroud)
所以我用这个查询将它调用到我的页面:
"SELECT userid FROM DB WHERE name='john'"
Run Code Online (Sandbox Code Playgroud)
然后为了处理结果我做:
$row=$result->fetch_assoc();
$id=$row['userid'];
Run Code Online (Sandbox Code Playgroud)
如果我这样做:
echo gettype($id);
Run Code Online (Sandbox Code Playgroud)
我得到一个字符串.这不应该是整数吗?
我已经在Stack Overflow上重复了几次这个问题,但是没有一个能够充分探索这个问题(或者至少以一种对我有帮助的方式)
问题是数据库查询应该在PHP中为整数列返回整数数据类型.相反,查询将每列作为字符串类型返回.
我确保"PDO :: ATTR_STRINGIFY_FETCHES"为false,以确保结果不会被转换为字符串.
我见过的答案:
根据我的研究,我了解这是一个驱动程序实现问题.
许多消息来源声称MySQL本机驱动程序不支持返回数字类型.这似乎不正确,因为它适用于Mac OS X.除非他们的意思是" Linux上的MySQL本机驱动程序不支持该功能".
这意味着我在Mac OS X上安装的驱动程序/环境有一些特殊之处.我一直在尝试识别差异以便应用修复,但我受限于我对如何检查这些内容的了解.
php -i
PDO_MYSQL
用于MySQL的PDO驱动程序=>已启用客户端API版本=> 5.1.72
php -i
PDO_MYSQL
用于MySQL的PDO驱动程序=>启用客户端API版本=> mysqlnd 5.0.10 - 20111026 - $ Id:e707c415db32080b3752b232487a435ee0372157 $
PDO::ATTR_CASE => PDO::CASE_NATURAL,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_ORACLE_NULLS …Run Code Online (Sandbox Code Playgroud) 我尝试使用mysql_fetch_row()和获取MySQL查询结果,mysql_result()并且数值作为字符串返回.
有没有办法获取数据作为存储在表中的数据类型?
应用程序将查询许多不同的查询,因此我将无法以1为单位将值转换为预期的数据类型.
我正在使用PHP的PDO来查询MySQL数据库.它将数字和整数作为字符串返回,并且正在弄乱我的JSON.
除了逐行输入值之外,还有更好的方法来修复它吗?
array(2) {
["name"]=> string(11) "Preliminary"
["sell_price"]=> string(6) "864.00"
}
Run Code Online (Sandbox Code Playgroud) 在从旧mysql_*()函数迁移到新PDO类的过程中,我又遇到了一个问题:我有一个下表:
CREATE TABLE `test` (
`Id` tinyint(4) unsigned zerofill NOT NULL,
`UserName` varchar(4) NOT NULL,
`TestDecimal` decimal(6,0) unsigned zerofill DEFAULT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
注意zerofill'ed Id和TestDecimal字段.
如果我运行以下代码,使用旧mysql_*()函数:
$SqlQuery = "SELECT * FROM test";
$Sql_Result = mysql_query($SqlQuery);
var_dump(mysql_fetch_array($Sql_Result));
Run Code Online (Sandbox Code Playgroud)
我得到以下输出,正确的zerofilled Id列:
array (size=6)
0 => string '0001' (length=4)
'Id' => string '0001' (length=4)
1 => string 'alex' (length=4)
'UserName' => string 'alex' (length=4)
2 => string '000002' (length=6) …Run Code Online (Sandbox Code Playgroud) PDO具有PDO::ATTR_EMULATE_PREPARES控制是否应仅在DB不支持或始终模拟准备语句的选项.但是,它没有提到它是否总是默认模拟它们.
通常人们会认为仿真只在必要时才使用,但因为它是PHP,所以没有什么可以假设只是因为它是理智的......
我的PDO fetch以字符串形式返回所有内容.
我有一个id(int)和username(varchar)的用户类.
当我尝试以下sql请求时
$db->prepare('SELECT * FROM users WHERE id=:id_user');
$db->bindParam(':id_user', $id_user);
$db->execute();
$user_data = $db->fetch(PDO::FETCH_ASSOC);
Run Code Online (Sandbox Code Playgroud)
和var_dump($ user_data),id参数是一个字符串.我怎样才能使PDO尊重mysql中正确的数据类型?
首先,据我所知,有作为SO等各种类似的问题这个和这个.但是,当我从表中获取值时,整数总是被提取为字符串.
我使用PHP5.4(5.4.16-1~dotdeb.1)和MYSQL5.5(5.5.31 + dfsg-0 + wheezy1).这里写的是PHP5.4.0中默认启用了MySQL Native Driver.但我仍然得到字符串值.
我按如下方式初始化PDO对象.
try {
$dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8';
$db = new PDO($dsn,DB_USER,DB_PASS);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
} catch (PDOException $e) {
header('HTTP/1.1 500');
exit;
} catch (Exception $e) {
header('HTTP/1.1 500');
exit;
}
Run Code Online (Sandbox Code Playgroud)
当我插入时,我尝试使用execute(array(...))格式并使用bindValue(...,PDO::PARAM_INT),但它们并没有什么区别.
例如,以下是我插入新行的方法.
public function insertList ($db,$account_id,$list_name) {
$sql = $db->prepare('INSERT INTO lists VALUES (?,?,?,?,?)');
try {
// $sql->execute(array($list_name,0,0,0,$account_id));
$sql->bindValue(1,$list_name,PDO::PARAM_STR);
$sql->bindValue(2,0,PDO::PARAM_INT);
$sql->bindValue(3,0,PDO::PARAM_INT);
$sql->bindValue(4,0,PDO::PARAM_INT);
$sql->bindValue(5,$account_id,PDO::PARAM_INT); …Run Code Online (Sandbox Code Playgroud) 我们正在使用Symfony来创建一些Web服务.我们使用Doctrine-ORM来存储实体,使用Doctrine-DBAL来检索数据,因为它非常轻,可以重用ORM(实体管理器)连接.
使用Doctrine-DBAL时,整数值作为字符串返回给PHP,我们希望有整数值,特别是因为它们被退回到Javascript.下面讨论如何使用PDO从MySQL获取数值类型?我们安装了mysql本机驱动程序sudo apt-get install php5-mysqlnd并使用PDO :: ATTR_EMULATE_PREPARE = false设置我们的symfony(dbal)配置:
doctrine:
dbal:
.
.
options:
20 : false # PDO::ATTR_EMULATE_PREPARES is 20
Run Code Online (Sandbox Code Playgroud)
使用这种配置,当mysql字段是整数时,我们得到整数.到现在为止还挺好.
但是有一个新问题:当通过Doctrine-ORM存储具有布尔值的实体时,实体不会被持久化.我们在日志中看到INSERT和COMMIT,但记录不在数据库中(如果我们使用的表没有在实体中定义的布尔字段,则存储记录).
此外,我们没有得到任何错误或异常,因此我们发现这非常危险.我们认为PDO库中存在一个错误,但我们必须更多地了解它.
问题:有没有人经历过这种行为?任何解决方法?Doctrine应该解释这个吗?