Присоединение к массиву заменяет все элементы в массиве

Я строю массив строк из БД, используя код ниже.

$site = new stdClass();
$dbh = _vic_commander_db();
$sth = $dbh->prepare('SELECT name, title, url FROM site ORDER BY siteid');
$sth->bindColumn(1, $site->name);
$sth->bindColumn(2, $site->title);
$sth->bindColumn(4, $site->url);

$sth->execute();
$ret = array();
while ($sth->fetch(PDO::FETCH_BOUND))
{
$ret[] = $site;
}

Массив ($ ret []) добавляется к каждой итерации цикла; однако в дополнение к ПРИЛОЖЕНИЮ каждой строки таблицы все элементы заменяются последним добавленным результатом. Итак, у меня есть массив с тем же количеством элементов, что и строк в таблице, но все элементы одинаковы.

Любые идеи будут высоко ценится.

Пример из:

    array(3) (
[0] => stdClass object {
name => (string) Same Site Name
title => (string) Same Site Title
url => (string) samepurl.com
}
[1] => stdClass object {
name => (string) Same Site Name
title => (string) Same Site Title
url => (string) samepurl.com
}
[2] => stdClass object {
name => (string) Same Site Name
title => (string) Same Site Title
url => (string) samepurl.com
}
)

2

Решение

Другой ответ имеет достойное объяснение, но почему бы просто не извлечь из него массив объектов?

$sth = $dbh->prepare('SELECT name, title, url FROM site ORDER BY siteid');
$ret = $sth->fetchAll(PDO::FETCH_OBJ);
1

Другие решения

Все индексы массива указывают на один и тот же объект $site,

Вы должны скопировать по значению, а не по ссылке:

$ret[] = clone $site;

увидеть http://php.net/manual/en/language.oop5.cloning.php

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

3

попробуй так, согласно документации ( execute() до bindColumn() ):

$site = new stdClass();
$dbh = _vic_commander_db();
$sth = $dbh->prepare('SELECT name, title, url FROM site ORDER BY siteid');
$sth->execute();

$sth->bindColumn(1, $site->name);
$sth->bindColumn(2, $site->title);
$sth->bindColumn(4, $site->url); //could you explain why 4?? not 3 ???

$ret = array();
while ($sth->fetch(PDO::FETCH_BOUND))
{
$ret[] = $site;
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector