Бит PHP PDO (1) возвращает неверный тип данных

Когда я запускаю этот запрос с PDO к базе данных mysql, он возвращает неправильные типы данных.

<?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);
}

Все строки становятся строками как типы данных, кроме поля BIT, оно становится чем-то другим...

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

Есть ли динамический способ заставить PDO возвращать правильные типы данных?


person Gomer    schedule 12.03.2012    source источник
comment
Двоичный тип данных в PHP — строка. Не кажется неправильным.   -  person hakre    schedule 12.03.2012


Ответы (1)


Вы используете поле Bit(1) для представления логического значения (TRUE/FALSE).

Клиент базы данных отображает битовые поля (которые могут быть больше одного бита) в строки, в которых один символ представляет октет.

Вы можете просто использовать поле Bit(1) как строку PHP с помощью функции ord(), поскольку она обрабатывает строку как один октет:

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

Вы не можете использовать $Site_Approved напрямую, потому что это строка, и она всегда будет оцениваться как TRUE независимо от того, установлен ее первый бит или нет.

В качестве альтернативы вы можете привести значение базы данных в запросе SQL уже к десятичной дроби, которая может быть тем, что вы ищете:

s.Site_Approved+0 AS Site_Approved

Десятичные значения в диапазоне от 0 до 1 ведут себя очень похоже на логические значения PHP (они просто не имеют общего типа, остальное то же самое).

person hakre    schedule 12.03.2012
comment
Спасибо за ответ, это многое объясняет. Я изменю структуру базы данных. Должен ли tinyint быть хорошей заменой BIT? - person Gomer; 12.03.2012
comment
Зависит от того, что вы представляете с помощью этого столбца. Что такое Site_Approved? Логическое значение? Коллекция флагов? Возможно, вы ищете ENUM, может быть, BOOLEAN, может быть, значение INTEGER. Зависит от того, что вы хотите выразить. - person hakre; 12.03.2012
comment
Спасибо. Это меня сегодня бесило. Была ячейка, которую я не мог изменить на более логичное значение Bool, и это исправило это! - person earl3s; 11.03.2014