2010-08-01 83 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