Ben PDOStatement-> fetchObject üye olmayan değişkenleri kullanmak yapabilir miyim?

4 Cevap php

Ben böyle bir sınıf var diyelim:

Class User {
  var $id
  var $name;
}

Ve ben bu yüzden gibi php PDO kullanarak bir sorguyu çalıştırın:

$stm = $db->prepare('select * from users where id = :id');
$r = $stm->execute(array(':id' => $id));
$user = $r->fetchObject('User');

Benim kullanıcı nesnesini vardump Eğer ben kullanıcı sınıfında tanımlı değil bunu diğer alanlarda her türlü sahiptir. Sadece bana / Talep ihtiyaç alanları geri verir, böylece Açıkçası benim sorgu belirli yapabiliriz. Ben yapmak istemiyorum ama eğer bu işi ben bunu istiyorum yol yapmak için herhangi bir yolu var mı?

Bu nesne oluşturmak ve benim için üye değişkenleri belirlemek için tek bir kod satırı çünkü ben, fetchObject fikir gibi. Ben sadece benim sınıfında tanımlı değil değişkenleri ayarlamak istemiyorum.

EDIT:

Karim79 doğru ve ben bunu istiyorum yol almak ya da fetchObject işe yaramaz gibi iyi görünüyor. Ben istenilen sonuçları almak için getir yok sonra kod aşağıdaki bit ekledik.

$valid_vars = get_class_vars('User');
foreach (get_object_vars($user) as $key => $value) {
    if (!array_key_exists($key, $valid_vars)) {
        unset($user->$key);
    }
}

Açıkçası ben PDOStatement sınıfını genişletmek ve kendi yöntemini fetchIntoObject ya da bunun gibi bir şey eklemek ve otomatik olarak bu boşaltır yapacağım :/ en zarif çözüm. Umarım çok yükü olmak, ancak kolayca kod 1 hattı ile bir nesne haline getirmek için muktedir istiyorum olmamalı :)

SUPER EDIT:

Teşekkürler bulunuyor Mamaar ben tekrar belgelerine gitti comment. Ben sorunun ne olduğunu buldum. http://us.php.net/manual/en/pdo.constants.php ve PDO :: FETCH_CLASS gidin ve özellikleri sınıfta yokmuş sihirli yöntem __ set () kullanıldığını açıklıyor. Ben, benim hedef sınıf ve Tada yılında yöntemini overwrote çalışır. Yine, en zarif çözüm. Ama şimdi ben neden anlamak, ve bu benim için çok önemli: D

4 Cevap

Bunun mümkün olduğunu sanmıyorum. fetchObject fetchObject 's $class_name parametre olarak belirtilen classname bir örneğini oluşturur (stdClass hangi varsayılan). Bu aynı adla varolan sınıflar için kontrol edin ve bir örnek oluşturmak, yalnızca sonuç sütun adlarıyla eşleşen üye değişkenlere değer atama olmaz. Böyle, daha sıkıcı bir şey güvenerek öneririm:

$user = new User($result['id'], $result['name']);

Tabii Kullanıcı sınıfı bir yapıcı vererek Hangi anlamına gelecektir:

Class User {
  var $id
  var $name;

  public function __construct($id, $name)
  {
     $this->id = $id;
     $this->name = $name;
  }

}

Muhtemelen kullanabilirsiniz PDOStatement-> $ alım_tarzı parametre olarak PDO :: FETCH_CLASS veya PDO :: FETCH_INTO ile yöntemini getirme

Düzenleme: Bu yüzden kendimi denedim, ve onunla çalışmak var PDOStatement->setFetchMode

class User
{
    public $id;
    public $name;
}

$db = new PDO('mysql:host=127.0.0.1;dbname=test', 'username', 'password');

$stmt = $db->prepare("select * from users where id=:userId");
$stmt->setFetchMode(PDO::FETCH_CLASS, 'User');
$stmt->execute(array(':userId' => 1));

$user = $stmt->fetch();
var_dump($user);

PDOStatement->execute() bir nesneyi döndürmek değil - YANLIŞ / DOĞRU döndürür.

Değişim satır 2 ve 3'e

if ( $stm->execute( array( ':id' => $id ) ) ){    
    $user = $stm->fetchObject( 'User' );
}

ve işe yarıyor

Alternatif olarak, tabii ki sadece bir dizi getir ve sadece bunu kendiniz typecasting yapabilirsiniz:

$user = (User) $r->fetch();

Btw, ben bu davranış görmedim. Belki PDO :: FETCH_LAZY aktive olması, bu ekstra veri oluşturmak olabilir. Sen ile test edebilirsiniz -> fetchObject ("stdClass"), başka bir nedeni kullanıcı sınıfı, ya da Veli ile yaşamaktadır?