2013-09-26 4 views
1

Относительно новый для PHP здесь, поэтому я, вероятно, пытаюсь сделать слишком много.Заполнение массива объектами из выборки

У меня есть объект, группа, и я получаю все группы из базы данных и нажимаю их на массив, прежде чем отправлять его на мой взгляд.

Так у меня есть:

$groups=array(); 
$group=new Group(); 
$stmt=$databaseconnection->prepare("SELECT Id, Name, Description FROM Groups"); 
$stmt->execute(); 
$stmt->bind_result($group->Id, $group->Name, $group->Description); 

while($stmt->fetch()){ 
    $groups[]=$group; 
    $group=new Group(); 
    } 

return $groups; 

это возвращает массив элементов, насчитывающих в общей сложности элементов следует иметь в массиве, но все они так же, как последний элемент. если у меня есть 3 группы, а последний - «Пользователи», у меня есть массив с 3 элементами, которые являются «пользователями».

Почему это происходит? Каков наилучший способ сделать это?

Спасибо!

ответ

0

bind_result хранит столбцы в переменных при каждом вызове выборки, поэтому вам нужно будет создавать новую группу каждый раз и устанавливать члены данных группы в соответствующие значения.

... 
$stmt->bind_result($id, $name, $description); 

while($stmt->fetch()){ 
    $group = new Group(); 
    $group->Id = $id; 
    $group->Name = $name; 
    $group->Description = $description; 

    $groups[] = $group; 
} 
return $groups; 
+0

Gah, это делает некоторые из моих более длинных запросов и больших объектов реальной болью. Рад, что я не слишком сильно опередил меня. Благодаря! – Snowburnt

0

Одна забавная уловка, которую я должен упростить, делая такие вещи, как этот другой путь:

в моем хранилище классов У меня есть функция, которая возвращает один элемент на основе Id, то у меня есть еще один класс, возвращает различные группы элементов. Так что справиться с этим, как это:

$collection = array(); 

$stmt=$connect->prepare("SELECT Id FROM SOME_TABLE WHERE CRITERIA=?"); 
$stmt->bind_param("s", $Whatever); 
$stmt->execute(); 
$stmt->bind_result($id); 

while($stmt->fetch()){ 
    $collection[] = $this->getItem($id); 
    } 

(GetItem возвращает сборку из объекта на основе идентификатора прошел)

Это полезно, когда вам нужно иметь один переключатель и несколько селектора, и очень полезное когда у вас много атрибутов/свойств в вашем классе (вам нужно только один раз напечатать подготовленный оператор, связанные параметры, связанные результаты и назначения атрибутов).

В качестве альтернативы вы можете заполнить массив, а затем закрыть соединение с базой данных, а затем сделать foreach в массиве для сохранения соединений.

Смежные вопросы