我已按如下方式定义了我的表格:
CREATE TABLE `reputables` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`subject` varchar(200) NOT NULL,
`type` int(11) NOT NULL,
`verification_key` varchar(45) DEFAULT NULL,
`user_id` int(11) DEFAULT NULL,
`date_associated` datetime DEFAULT NULL,
`request_user_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `subject_UNIQUE` (`subject`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1$$
执行
$query = DB::select() ->from( 'reputables')->where('subject', '=', $key)->as_object()->execute();
$reputable = $query->current();
返回一个对象,但是属性的类型类型都是字符串,即使db列被定义为int也是如此。这会导致json_encode出现问题,因为它会在应该为整数的值周围加上双引号。
如何在设置对象属性时让数据库保留列类型?
更新
看起来这可能是一个php问题。这也是一样的。
$testres = mysql_query('SELECT * from reputables WHERE id = 1');
$obj = mysql_fetch_object($testres);
所有$ obj属性都是string类型。
答案 0 :(得分:2)
返回的类型总是字符串 之后可以使用一些自动检测,使用ctype_ *函数或者创建一个小例程来查询数据库中的字段dype并相应地设置类型
答案 1 :(得分:1)
大多数PHP DB函数都为每种数据类型返回字符串。我不确定Kohana是否支持这个,但你基本上需要使用绑定参数:
$stmt = $pdo->prepare("SELECT id FROM table");
$stmt->execute();
$stmt->bindColumn(1, $id, PDO::PARAM_INT);
$stmt->fetch(PDO::FETCH_BOUND)
var_dump($id); // will be an integer.
请注意,如果使用ORM图层(Kohana或其他),则可能会覆盖模型,以便在加载值时将某些字段强制转换为整数。当然,这对于任何在该上下文之外操作的手写SQL都没有帮助。
答案 2 :(得分:0)
$string = (string) (Object $object) // object becomes string
$object = new $string() // amazing
与数组相同:
foreach($array as $key => $value)
$arrayObject->$key = $value;