追加到数组替换数组中的所有元素
Appending to array replaces all elements in the array
我正在使用以下代码从数据库构建行数组。
$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[])确实被添加到循环的每次迭代中;然而,除了追加 table 的每一行之外,所有元素都被最后追加的结果替换。所以我有一个数组,其元素数量与 table 中的行相同,但元素都相同。
如有任何想法,我们将不胜感激。
示例:
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
}
)
所有数组索引指向同一个对象$site
。
您必须按值而不是按引用进行复制:
$ret[] = clone $site;
见http://php.net/manual/en/language.oop5.cloning.php
另外我想知道为什么你真的需要在这里存储一个对象。
另一个答案有一个不错的解释,但为什么不直接获取对象数组呢?
$sth = $dbh->prepare('SELECT name, title, url FROM site ORDER BY siteid');
$ret = $sth->fetchAll(PDO::FETCH_OBJ);
根据文档(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;
}
我正在使用以下代码从数据库构建行数组。
$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[])确实被添加到循环的每次迭代中;然而,除了追加 table 的每一行之外,所有元素都被最后追加的结果替换。所以我有一个数组,其元素数量与 table 中的行相同,但元素都相同。
如有任何想法,我们将不胜感激。
示例:
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
}
)
所有数组索引指向同一个对象$site
。
您必须按值而不是按引用进行复制:
$ret[] = clone $site;
见http://php.net/manual/en/language.oop5.cloning.php
另外我想知道为什么你真的需要在这里存储一个对象。
另一个答案有一个不错的解释,但为什么不直接获取对象数组呢?
$sth = $dbh->prepare('SELECT name, title, url FROM site ORDER BY siteid');
$ret = $sth->fetchAll(PDO::FETCH_OBJ);
根据文档(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;
}