2015-01-28 2 views
2

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

$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 
     } 
) 

ответ

1

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

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

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

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

$ret[] = clone $site; 

см http://php.net/manual/en/language.oop5.cloning.php

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

+0

клон не работает; действовал так же, как оригинал. – Mike

+1

Как я вижу, выборка в массив была в порядке для вас, так что только для записи, почему клон мог провалиться: http://stackoverflow.com/questions/4959949/clone-is-not-working-for-me – nlu

0

попробовать этот способ, в соответствии с документацией (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; 
    } 
Смежные вопросы