2016-11-28 26 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