2010-08-01 6 views
1

J'utilise l'extension mysqli et lier le résultat à un objet:déclaration mysqli: fetch() un tableau de résultats

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

Chaque appel à $stmt->fetch() écrasera les propriétés $ qui sont devenus des références article. Si je clone simplement l'objet - ces références restent et les deux instances changent simultanément:

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

Il devrait y avoir un moyen de déréférencer les clone donc fait vraiment une copie, pas un ensemble de données référencées. Existe-t-il un moyen simple et flexible de récupérer toutes les données afin qu'elles soient stockées sous la forme d'un tableau d'objets? Le principal problème est de savoir comment supprimer les références: &string.

La seule solution que je vois est d'instancier un autre objet et copier manuellement toutes les propriétés:

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

mais cela semble être un surpuissant: il copiera toutes les propriétés (y compris certaines supplémentaires qui ne sont pas en fait référencé) ce qui n'est pas nécessaire, et d'ailleurs - est une pénalité à la performance.

+0

Actially, j'ai écrit une classe qui lie les champs de résultat à un objet automagiquement. La seule chose qui lui manque est une option pour stocker les lignes, pas seulement itérer et oublier. – kolypto

Répondre

1

Vous pouvez implémenter votre propre fonction magique __clone() afin qu'il crée un non référencé » copie de votre objet. Je pense que ça devrait marcher.

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); 

Sortie

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

laid comme l'enfer, mais fonctionne ...

+0

Donc, il n'y a pas de magie connue qui va déréférencer les propriétés? :) – kolypto

+0

Ajout d'un code comme exemple. – Mchl

0

Si je vous comprends bien, vous voulez récupérer les données dans des objets? Mysqli a une méthode/fonction fetch_object: http://www.php.net/manual/en/mysqli-result.fetch-object.php utiliser comme ceci:

$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

Il a, mais je voudrais utiliser des déclarations préparées pour cela :) – kolypto

+0

J'ai mis à jour la réponse – jmz

+0

Toujours pas de travail malheureusement – Mchl

Questions connexes