2016-11-28 24 views
1

我问,因为我有一个布尔值传递给PDO的问题。PHP的is_bool如何区分INT和BOOL?

这个功能让我真/假:

public function getBoolVal($var){ 
    if (!is_string($var)) return (bool) $var; 
    switch (strtolower($var)) { 
     case '1': 
     case 'true': 
     case 'on': 
     case 'yes': 
     case 'y': 
      return true; 
     default: 
      return false; 
    } 
} 

我有这样一行数据绑定到参数的函数中:

$this->db->bind('active', (bool)$this->getBoolVal($pa['active'])); 

bind函数内部是:

foreach ($this->parameters as $param => $value) { 
    $type = PDO::PARAM_STR; 
    switch ($value[1]) { 
     case is_int($value[1]): 
      $type = PDO::PARAM_INT; 
      break; 
     case is_bool($value[1]): 
      $type = PDO::PARAM_BOOL; 
      break; 
     case is_null($value[1]): 
      $type = PDO::PARAM_NULL; 
      break; 
    } 
    // Add type when binding the values to the column 
    $this->sQuery->bindValue($value[0], $value[1], $type); 
} 

当这些值被绑定时,我得到PDO::PARAM_BOOL as类型当输入值$pa['active']是1,但我总是PDO::PARAM_INT如果输入为0 ...

所以给予1或0,如何在地球上不会is_bool知道我想要什么???或者我该如何解决这个问题?

+0

自发布此,我和我的数据库中的字段TINYINT免掉。我认为使用整数与我正在处理的外部数据“更安全”。 - 很高兴被告知,否则,虽然:) – Warren

+0

你为什么不把所有的价值作为字符串? –

回答

0

你可以改变你的代码

if ($value[1] === true or $value[1] === false) { 
    $type = PDO::PARAM_BOOL; 
} 
else { 
    switch ($value[1]) { 
     case is_int($value[1]): 
      $type = PDO::PARAM_INT; 
      break; 
     case is_float($value[1]): 
      $value[1] = str_replace(',', '.', $value[1]);//already string, pdo does not support float values 
      break; 
     case is_null($value[1]): 
      $type = PDO::PARAM_NULL; 
      break; 
    } 
} 
+0

谢谢。这非常简单,也感谢浮球的加入。 我决定再次使用我的TinyInt字段,但是我遇到了一个问题 - 显然PHP/PDO和BOOL有10年的bug,所以我只是将第二行的BOOL类型更改为INT,并且适用于我。 – Warren