【发布时间】:2013-04-15 17:38:36
【问题描述】:
我真的很纠结如何处理这个问题。在过去的 10 年里,我一直在忍受这个问题,但我认为是时候决定处理这个问题的正确方法了。
根据互联网,MySQL 不支持本机数据类型,这是有道理的,为什么每当我选择“BOOLEAN”时,我都会看到该列以 tinyint(1) 结尾。
我将数据存储为具有 1 或 0 值的 tinyint 没有问题,但是我确实有一个问题,即当我使用该列从数据库中选择许多行时,我得到一个字符串“1”或“ 0" 而不是 PHP 原生 bool true/false。 PHP 当然仍然可以将此变量作为布尔值处理,因为它似乎自动知道我想要它做什么,只要我做 == 0 或 == 1 甚至 == '0' 或 == '1' 如果我我真的觉得可以。
所以,我开始了,获取这些数据并将其运行到 PHP 的 json_encode 函数中,并在我的 Backbone/Handlebars 实现进行 ajax 调用时输出它,并获得一个漂亮漂亮的 JSON 对象(通常在其中包含许多行的数据它)用这个:{"myVariable":"1"} 或这个{"myVariable":"0"}。
我相信您可以在 Handlebars.js 中看到想要做这样的事情的问题:
{{#if myVariable}}
Do this
{{else}}
Do that
{{/if}}
现在,我真正不想做的是这样的事情:
<?php
for($i = 0; $i < count($recordSet); $i++) {
$recordSet[$i]['myVariable'] = (bool)$recordSet[$i]['myVariable'];
}
?>
由于我正在构建的应用程序在数据库中有数千列,因此我不能(或应该只需要)为我想要在我的 javascript 中像 bool 一样运行的每一列运行上述代码。而且我真的不想这样做(尽管这可能是最简单的)
Handlebars.registerHelper('ifTrue', function(a, b) {
// Cast the compared value to a bool and then run a regular handlebars #if statement
});
有没有更好的方法?我正在使用代码点火器...可以以某种方式修改数据库类以检测 tinyint(1) 列并自动将其转换为布尔值,然后执行此操作直到 MySQL 支持真正的布尔值列?我知道他们正在计划,但是...
【问题讨论】:
-
这对于使用什么数据类型来说是一个很好的解决方案,但是它并没有完全回答如何有效地从查询中获取纯 PHP 真/假值,它更多地概述了哪些数据类型存储价值。无论我使用的是 BIT 还是 tinyint(1),当通过
json_encode运行查询结果时,返回字符串“1”或“0”时,同样的问题仍然存在。 -
select <columns>, CASE blnColumn WHEN '0' THEN 'FALSE' WHEN '1' THEN 'TRUE'- dreamincode.net/forums/topic/… -
否则,您始终可以将 myVariable 转换为数字客户端。类似于:{{#if +myVariable}}。
-
tinyint(1) 应该可以很好地满足您的目的。只要您在客户端正确解码 json 对象(更多关于 zeros 和 js:stackoverflow.com/questions/7615214/…),即可使用 PHP 和 javascript true/false 语法
标签: php mysql codeigniter handlebars.js