2012-04-09 67 views
1

我注意到PDO::FETCH_INTO fetch模式在PDOStatement::fetch()裏面不起作用,但是在manual裏說它可以使用PDO::FETCH_INTOPDOStatement::fetch()PDO的說明:: fetch()

我正在嘗試: $ query-> fetch(PDO :: FETCH_INTO,$ user);

這將返回:PDOStatement::fetch() expects parameter 2 to be long, object given

那不是意味着手工是一種誤導?在這種情況下使用PDO::FETCH_INTO的正確方法是什麼?

+0

錯誤消息聽起來不言自明,你正在使用該功能不正確。請查看http://www.php.net/manual/en/pdostatement.fetch.php#78794。 – DCoder 2012-04-09 10:37:43

+0

fetch()屬於PDOStatement類。我編輯了這個問題來解決它,因爲我認爲這只是一個錯字。 – 2012-04-09 10:40:16

+0

@ÁlvaroG.Vicario是的,謝謝。 – Tek 2012-04-09 10:42:42

回答

1

試試這個方法:

$stmt->setFetchMode(PDO::FETCH_INTO, $user); 
$user = $stmt->fetch(); 

UPDATE:

如果你有一個公共setter方法私有/保護特性(推薦)代替公共屬性,請改用FETCH_CLASS:

class User { 
    protected $username; 

    public setUsername($username) { 
     $this->username = $username; 
    } 
... 
} 
... 
$stmt->setFetchMode(PDO::FETCH_CLASS, 'User'); 
$user = $stmt->fetch(); 

更新2:

使用PDO :: FETCH_CLASS,你甚至不需要的setter(編輯:不需要爲PDO,這是良好的ID字段的setter):

class User { 
    protected $username; 
... 
} 
... 
$stmt->setFetchMode(PDO::FETCH_CLASS, 'User'); 
$user = $stmt->fetch(); 

更新3:在這裏看到完整的例子:http://pastebin.com/LneAj0xn

+0

太棒了,它有效,有點。現在我得到一個'無法訪問私人財產'。根據這個答案它應該工作:http://stackoverflow.com/questions/7282962/php-pdo-do-the-fetch-styles-fetch-class-and-fetch-into-fetch-into-private-objec或答案不正確? – Tek 2012-04-09 11:28:16

+0

嘗試爲它試圖設置的私有屬性定義一個setter,例如setUsername() 或者,您可以添加一個魔術__set()方法,但我會避免這種情況。 – 2012-04-09 11:47:24

+0

UPDATE:在使用鏈接PDO :: FETCH_CLASS而不是PDO :: FETCH_INTO的問題中。如果您在調用之前初始化$ user對象,它的工作方式可能會有所不同。試試 '$ stmt-> setFetchMode(PDO :: FETCH_CLASS,'User');' – 2012-04-09 11:54:53

0

請注意PDOStatement :: fetch()的第二個參數是cursor_orientation

你可能想是這樣的:

$user = $query->fetch(PDO::FETCH_INTO); 
+0

我已經試過了。本身使用'PDO :: FETCH_INTO'給了我一個PDO例外:'沒有指定的提取對象' – Tek 2012-04-09 10:41:39

+0

確認。將研究,但我不會感到驚訝,它只是不受支持。 – 2012-04-09 10:56:00