Я строю массив строк из БД, используя код ниже.
$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
}
)
Другой ответ имеет достойное объяснение, но почему бы просто не извлечь из него массив объектов?
$sth = $dbh->prepare('SELECT name, title, url FROM site ORDER BY siteid');
$ret = $sth->fetchAll(PDO::FETCH_OBJ);
Все индексы массива указывают на один и тот же объект $site
,
Вы должны скопировать по значению, а не по ссылке:
$ret[] = clone $site;
увидеть http://php.net/manual/en/language.oop5.cloning.php
Также мне интересно, почему вам действительно нужно хранить объект здесь.
попробуй так, согласно документации ( 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;
}