2016-11-28 6 views
1

私はPDOにブール値を渡す際に問題が発生しているので、私は尋ねます。PHPのis_boolはINTとBOOLの違いをどのように伝えますか?

この機能は私のTrue/Falseのを与える:

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を取得タイプが入力値$pa['active']が1である場合、入力が0の場合は常にPDO::PARAM_INTが得られます。は、私が欲しいものを知っていますか?または、どうすればこの問題を解決できますか?

+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年前のバグがありますので、2行目のBOOLタイプをINTに変更するだけです。 – Warren

関連する問題