【问题标题】:PHP PDO Bit(1) returns wrong data typePHP PDO Bit(1) 返回错误的数据类型
【发布时间】:2012-03-28 18:12:10
【问题描述】:

当我使用 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 返回正确的数据类型?

【问题讨论】:

  • PHP 中的二进制数据类型是字符串。看起来并不“不正确”。

标签: php mysql pdo sqldatatypes


【解决方案1】:

您正在使用 Bit(1) 字段来表示布尔值 (TRUE/FALSE)。

数据库客户端将位域(可以大于一位)映射到一个字符代表一个八位字节的字符串。

您可以通过 ord() 函数将 Bit(1) 字段用作 PHP 字符串,因为它将字符串视为单个八位字节:

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

你不能直接使用$Site_Approved,因为它是一个字符串,无论它的第一位是否设置,它总是会计算为TRUE

或者,您可以将 SQL 查询中的数据库值转换为小数,这可能是您正在寻找的:

s.Site_Approved+0 AS Site_Approved

0 到 1 范围内的十进制值的行为与 PHP 的布尔值非常相似(它们只是不共享类型,其余相同)。

【讨论】:

  • 感谢您的回复,这解释了很多。我将更改数据库布局。 tinyint 应该是 BIT 的良好替代品吗?
  • 取决于您用该列表示的内容。 Site_Approved 是什么?一个布尔值?标志的集合?也许 ENUM 是您正在寻找的,也许是 BOOLEAN,也许是 INTEGER 值。看你想表达什么。
  • 谢谢。今天这件事惹恼了我。有一个单元格我无法更改为更合乎逻辑的 Bool 值,这修复了它!
猜你喜欢
  • 2021-01-03
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 2019-04-06
  • 1970-01-01
  • 2020-09-21
  • 2014-08-29
  • 1970-01-01
相关资源
最近更新 更多