2012-03-12 42 views
4

當我用PDO運行這個查詢到一個mysql數據庫時,它返回錯誤的數據類型。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中的二進制數據類型是字符串。似乎不「不正確」。 – hakre 2012-03-12 10:52:39

回答

9

您正在使用位(1)字段來表示布爾值(TRUE/FALSE)。

數據庫客戶端將位域(可以大於一位)映射到其中一個字符表示八位字節的字符串中。

可以比只使用你的位(1)字段作爲PHP字符串通過ord()功能,因爲它把字符串作爲一個字節:

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

不能直接使用$Site_Approved,因爲它是一個字符串無論第一位是否設置,它總是會評估爲TRUE

或者,您可以在SQL查詢中已經投數據庫值,這可能是你正在尋找一個十進制:在0到1的行爲非常相似範圍

s.Site_Approved+0 AS Site_Approved 

十進制值PHP的布爾(他們只是不分享類型,其餘部分是相同的)。

+0

感謝您的回覆,這解釋了很多。我將更改數據庫佈局。一個tinyint應該是BIT的一個很好的替代品嗎? – Gomer 2012-03-12 11:39:53

+0

取決於您使用該列表示的內容。什麼是「Site_Approved」?布爾?一組標誌?也許ENUM是你要找的,也許是BOOLEAN,也許是一個INTEGER值。取決於你想表達什麼。 – hakre 2012-03-12 17:07:34

+0

謝謝@hakre。這一直困擾着我一個小時:) – Aris 2013-04-05 09:18:54