2010-08-01 79 views
1

數組我使用mysqli擴展,並將結果綁定到一個對象:mysqli的語句:取()結果

class Item { 
    public $id, $name; 
    } 
$Item = new Item; 
$stmt->bind_result($Item->id, $Item->name); 

$stmt->fetch()每次調用將覆蓋這成爲引用$項目的屬性。如果我只是克隆對象 - 這些引用仍然存在,這兩種情況同時改變:

object(Item)#1 (2) { 
    ["id"]=> 
    &int(1) 
    ["name"]=> 
    &string(4) "name" 
} 

所以應該有一種方法來解引用他們,所以clone真叫一個副本,而不是一組引用的數據的。是否有一種簡單而靈活的方式來檢索所有數據,以便將其存儲爲一組對象?主要問題是如何刪除引用:&string

我看到的唯一的解決辦法是實例化另一個對象,並手動複製所有的屬性:

$Item2 = new Item; 
foreach ($Item as $prop => $val) 
    $Item2->$prop = $val; 

但是這似乎是一個矯枉過正的:它會複製所有屬性(包括一些額外的人這實際上不是引用),這是沒有必要的,而且 - 是對性能的懲罰。

+0

Actially,我寫結合的結果字段對象自動地類。它唯一缺乏的是存儲行的選項,而不僅僅是迭代和遺忘。 – kolypto 2010-08-01 01:49:32

回答

1

您可以實現自己的__clone()神奇的功能,這樣它會創建您的對象不再被引用的」副本。我認爲它應該工作。

http://www.php.net/manual/en/language.oop5.cloning.php

<?php 

class Item { 
    public $id, $name; 

    public function __clone() { 
    $id = $this->id; 
    unset($this->id); 
    $this->id = $id; 
    $name = $this->name; 
    unset($this->name); 
    $this->name = $name; 
    } 
} 

$id = 1; 
$name = 'o_0 Tync'; 

$i1 = new Item(); 
$i1->id = &$id; 
$i1->name = &$name; 

$i2 = clone $i1; 

$id = 2; 
$name = 'Mchl'; 
var_dump($i1,$i2); 

輸出

object(Item)#1 (2) { 
    ["id"]=> 
    &int(2) 
    ["name"]=> 
    &string(4) "Mchl" 
} 
object(Item)#2 (2) { 
    ["id"]=> 
    int(1) 
    ["name"]=> 
    string(8) "o_0 Tync" 
} 

醜得要命,但工程...

+0

那麼,有沒有已知的魔術可以對屬性進行解引用? :) – kolypto 2010-08-02 19:55:48

+0

增加了一些代碼作爲例子。 – Mchl 2010-08-02 20:18:30

0

如果我正確理解你,你想要將數據提取到對象中?庫MySQLi有fetch_object方法/功能:http://www.php.net/manual/en/mysqli-result.fetch-object.php使用方法如下:

$foobar = $conn->escape_string($foobar); 
$stmt = $conn->query("SELECT * FROM foo WHERE bar = '$foobar'"); 
while ($item = $stmt->fetch_object("Item")) { 
    $items[] = $item; 
} 
$stmt->close(); 
+0

它有,但我想用這個準備好的語句:) – kolypto 2010-08-02 19:19:58

+0

我更新了答案 – jmz 2010-08-02 19:37:30

+0

仍然不會工作不幸 – Mchl 2010-08-02 19:38:34