即使列类型为整数,Kohana DB :: select也会将结果返回为字符串

时间:2011-11-05 20:25:29

标签: php kohana

我已按如下方式定义了我的表格:

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类型。

3 个答案:

答案 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;