我真的很想知道如何处理这个问题。在过去的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)列并自动将其转换为bool然后直到MySQL支持真正的布尔列才能执行此操作吗?我知道他们正在计划,但是......
答案 0 :(得分:1)
请记住,默认情况下,PHP / MySQL驱动程序返回的列值只是字符串(即无类型的字节数组)。这个简短的片段演示了它:
// mysqli driver
$c = mysqli_connect ($host, $user, $pass, $dbname);
$r = mysqli_query($c, 'SELECT * FROM foo');
$f = mysqli_fetch_array($r);
foreach ($f as $k => $v) {
echo "$k => $v [" . gettype($v) . ']' . PHP_EOL;
}
// PDO
$c = new PDO("mysql:dbname=$dbname;host=$host", $user, $pass);
$r = $c->query('SELECT * FROM foo');
$f = $r->fetch();
foreach ($f as $k => $v) {
echo "$k => $v [" . gettype($v) . ']' . PHP_EOL;
}
“默认情况下”,因为可以为驱动程序提供映射,以便它可以将这些字符串转换为本机PHP类型。为此,mysqli
有mysqli_result::fetch_object()
,PDO
有PDOStatement::fetchObject()
。
虽然可以从元数据中甚至从表定义中检索实际列类型,但在典型情况下,客户端应用程序会提前知道它。
底线是:你做想要这样做(或类似的东西):
$recordSet[$i]['myBoolColumn'] = (bool)$recordSet[$i]['myBoolColumn'];
...因为事实上你也应该这样做:
$recordSet[$i]['myIntColumn'] = (int)$recordSet[$i]['myIntColumn'];
但是PHP在打字方面非常松懈,毕竟我不会太担心这个。