4

我真的很不知道该怎么做这个。在过去的 10 年里,我只是忍受了这个,但我认为是时候决定处理这个问题的正确方法了。

根据互联网,MySQL 不支持本机数据类型,这是有道理的,为什么每当我选择“BOOLEAN”时,我都会看到该列以 tinyint(1) 结尾。

我将数据存储为具有 1 或 0 值的 tinyint 没有问题,但是我确实有一个问题,即当我从数据库中选择具有此列的许多行时,我得到一个字符串“1”或“0”而不是PHP 本机布尔值 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 支持真正的布尔值列?我知道他们正在计划,但是...

4

1 回答 1

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 类型。为此,mysqlimysqli_result::fetch_object()PDOPDOStatement::fetchObject()

虽然可以从其元数据甚至从表定义中检索实际的列类型,但在典型情况下,客户端应用程序提前知道它。

底线是:你确实想这样做(或类似的东西):

$recordSet[$i]['myBoolColumn'] = (bool)$recordSet[$i]['myBoolColumn'];

...因为实际上您也应该这样做:

$recordSet[$i]['myIntColumn'] = (int)$recordSet[$i]['myIntColumn'];

但是 PHP 在打字方面非常宽松,毕竟我不会太担心这一点。

于 2013-07-12T00:33:41.780 回答