2012-03-12 8 views
4

PDOでこのクエリをmysql dbに実行すると、間違ったデータ型が返されます。PHP PDOビット(1)が間違ったデータ型を返します

<?php 
$parameters = array(":1",92323); 

$query = " SELECT s.Site_ID,s.Site_Url,s.Site_Name, s.Site_Approved, s.Site_Status, s.Thumbnailed ,st.Description AS Site_Status_Desc 
FROM Sites s 
LEFT JOIN Sites_Status st ON st.Status_ID = s.Site_Status 
WHERE s.Account_ID = :1"; 

try { 

    $this->DBH = new PDO("mysql:host={$host};dbname={$db}", $user, $pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 

    $this->stmt = $this->DBH->prepare($query); 


    if(count($parameters)>0) { 

     foreach ($parameters as $key => $var) { 

      switch ($var) { 
       case is_int($var): 
        $this->stmt->bindValue($key,$var, PDO::PARAM_INT); 
        break; 
       case is_bool($var): 
        $this->stmt->bindValue($key,$var, PDO::PARAM_BOOL); 
        break; 
       case is_null($var): 
        $this->stmt->bindValue($key,$var, PDO::PARAM_NULL); 
        break; 

       default: 
        $this->stmt->bindValue($key,$var, PDO::PARAM_STR); 
        break; 
      } 


     } 

    } 

    if($this->stmt->execute()) { 

     // Set how many rows the query resulted in 
     $this->num_rows = $this->stmt->rowCount(); 

     return $this->stmt->fetchObject(); 
    } else { 
     return false; 
    } 

} catch (PDOException $e) { 
    $this->error_handler($e); 
} 

すべての行は、ビットフィールドを除いて、データ型として文字列になり、それは別の何かになり...

public 'Site_Approved' => string '�' (length=1) 

はPDOが正しいデータ型を返すようにする動的な方法はありますか?

+0

PHPのバイナリデータ型はstringです。 "正直ではない"と思われません。 – hakre

答えて

9

ブール値(TRUE/FALSE)を表すには、ビット(1)フィールドを使用しています。

データベースクライアントは、1文字がオクテットを表す文字列にビットフィールド(1ビットより大きい場合があります)をマップします。

それは、単一のオクテットとして文字列を扱うようあなただけ ord()機能を経由して、PHPの文字列としてごビット(1)フィールドを使用することができるよりも

:それは文字列だからあなたが直接$Site_Approvedを使用することはできません

if (ord($Site_Approved)) { 
    ... 
} 

最初のビットがセットされているかどうかにかかわらず常にTRUEと評価されます。と非常によく似て0から1振る舞うの範囲で

s.Site_Approved+0 AS Site_Approved 

Decimal値:

また、あなたが探しているかもしれないもの小数にすでにSQLクエリでデータベースの値をキャストすることができますPHPのブーリアン(型を共有しない、残りは同じ)

+0

あなたの返事をありがとう、これは多く説明します。私はデータベースのレイアウトを変更します。 tinyintはBITの代用品にすべきか? – Gomer

+0

あなたがその列で表現している内容によって異なります。 'Site_Approved'とは何ですか?ブール値?フラグのコレクション?おそらく、ENUMがあなたが探しているもの、おそらくBOOLEAN、多分INTEGER値です。あなたが表現したいことに依存します。ありがとう@hakre。 – hakre

+0

これは今1時間私を悩ませている:) – Aris

関連する問題