Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL布尔类型_Php_Mysql_Codeigniter_Handlebars.js - Fatal编程技术网

Php MySQL布尔类型

Php MySQL布尔类型,php,mysql,codeigniter,handlebars.js,Php,Mysql,Codeigniter,Handlebars.js,我真的很不知道该怎么办。在过去的10年里,我一直在忍受这一点,但我认为是时候决定正确的方式来处理这个问题了 根据互联网,MySQL不支持本机数据类型,这就是为什么每当我选择“BOOLEAN”时,我都会看到列以tinyint结尾(1) 我可以将数据存储为一个带有1或0值的tinyint,但我确实有一个问题,即当我使用此列从数据库中选择许多行时,会得到一个字符串“1”或“0”,而不是PHP本机bool true/false。当然,PHP仍然可以将这个变量作为布尔值处理,因为每当我执行==0或==1,

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

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

我可以将数据存储为一个带有1或0值的tinyint,但我确实有一个问题,即当我使用此列从数据库中选择许多行时,会得到一个字符串“1”或“0”,而不是PHP本机bool true/false。当然,PHP仍然可以将这个变量作为布尔值处理,因为每当我执行==0或==1,甚至=='0'或=='1'时,它似乎会自动知道我希望它做什么,如果我真的感到满意的话

所以,我现在开始,将这些数据运行到PHP的
json_encode
函数中,当我的主干/把手实现进行ajax调用时输出它,并得到一个漂亮的json对象(通常包含许多行的数据):
{“myVariable”:“1”}
或这个
{“myVariable”:“0”}

我相信您可以在handlebar.js中看到这样做的问题:

{{#if myVariable}} 
    Do this
{{else}}
    Do that
{{/if}}
现在,我真的不想做这样的事情:

<?php
for($i = 0; $i < count($recordSet); $i++) {
    $recordSet[$i]['myVariable'] = (bool)$recordSet[$i]['myVariable'];
}
?>

有更好的办法吗?我正在使用代码点火器。。。可以通过某种方式修改数据库类来检测tinyint(1)列并自动将其强制转换为bool,然后执行此操作直到MySQL支持真正的布尔列吗?我知道他们正在计划,但是…

请记住,默认情况下,PHP/MySQL驱动程序返回的列值只是字符串(即非类型化的字节数组)。这个简短的片段演示了这一点:

//mysqli驱动程序
$c=mysqli_connect($host、$user、$pass、$dbname);
$r=mysqli_查询($c,'SELECT*fromfoo');
$f=mysqli\u fetch\u数组($r);
foreach($f为$k=>$v){
echo“$k=>$v[”.gettype($v)。]'.PHP_EOL;
}
//PDO
$c=newPDO(“mysql:dbname=$dbname;host=$host”,$user,$pass);
$r=$c->query('SELECT*fromfoo');
$f=$r->fetch();
foreach($f为$k=>$v){
echo“$k=>$v[”.gettype($v)。]'.PHP_EOL;
}
“默认情况下”,因为可以为驱动程序提供映射,以便它可以将这些字符串转换为原生PHP类型。为此,
mysqli
has,
PDO
has

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

底线是:您确实想这样做(或做类似的事情):

。。。因为事实上你也应该这样做:

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

但是PHP在类型方面非常松散,毕竟我不会太担心这一点。

这是一个很好的解决方案,可以使用什么样的数据类型,但是它不能很好地解决如何从查询中高效地获得纯PHP真/假值的问题,它更概括了哪些数据类型存储值。无论我使用的是BIT还是tinyint(1),当通过
json\u encode
select运行查询结果时,返回字符串“1”或“0”仍然存在同样的问题,CASE blnColumn当“0”时返回“FALSE”,当“1”时返回“FALSE”,然后返回“TRUE”
——或者,您可以始终将myVariable转换为number客户端。类似于:{{{#if+myVariable}}.tinyint(1)应该可以很好地满足您的需要。只要在客户机上正确解码json对象,就可以使用PHP和javascript true/false语法(有关Zero和js的更多信息:)
$recordSet[$i]['myBoolColumn'] = (bool)$recordSet[$i]['myBoolColumn'];
$recordSet[$i]['myIntColumn'] = (int)$recordSet[$i]['myIntColumn'];