【问题标题】:Is it possible for PDO::FETCH_OBJ to set the value of a null field to null instead of leaving the property undefined?PDO::FETCH_OBJ 是否可以将 null 字段的值设置为 null 而不是未定义属性?
【发布时间】:2014-04-25 03:42:00
【问题描述】:

如果您:

  1. Left Join 表作为查询的一部分

  2. 并使用$W = $stmt->fetch(PDO::FETCH_OBJ) 循环遍历结果

  3. 还有一个字段ColumnName,其值为空,因为无法为当前行进行连接。

那么属性$W->ColumnName将是未定义的。

是否存在 PDO 设置,其中为 null 的列可以在获取的对象中将其属性定义为 null?

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    而不是使用 PHP 标准类来检索值,您可以使用如下所示的实体类。

    Class customer {
    
        protected $_email;
    
        public function __construct(array $config = array()){
             $this->setOptions($config);
         }
    
        public function getEmail(){
            return $this->_email;
        }
    
        public function setEmail($email){
            $this->_email = $email;
        }
    
        public function setOptions(array $options)
        {
            $_classMethods = get_class_methods($this);
            foreach ($options as $key => $value) {
                $method = 'set' . ucfirst($key);
                if (in_array($method, $_classMethods)) {
                    $this->$method($value);
                } else {
                    throw new Exception('Invalid method name');
                }
            }
            return $this;
        }
    
        public function setOption($key, $value){
            return $this->setOptions(array($key, $value));
        }
    }
    

    现在你可以简单地做到这一点。

    $W = $stmt->fetch(PDO::FETCH_ASSOC);
    $customer = new Customer($w);
    

    现在访问属性将返回 null 或实体类中设置的默认值。即使它在查询结果中未定义。

    $customer->getEmail(); 
    

    【讨论】:

    • 这实际上是我正在做的,但如果该字段为空,因此属性未定义,你会得到Notice: Undefined property: stdClass::SomeFieldFETCH_ASSOC 处理空值的方式不同吗?
    • @Nick 你在为你的 StdClass 中的 null 属性设置一个默认值吗?
    • 可以StdClass设置默认值吗?
    • @Nick 是的。但是你最终会创建一个像上面那样的实体类。
    • @Nick 这样您就可以创建实体类分配一个默认值或将其留空为空,从数据库中获取记录,将它们分配给实体类,验证数据并使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    相关资源
    最近更新 更多