我确信我一定做错了什么,但我似乎无法在任何地方找到答案(至少在文档和SO中都没有)。我是PHP和SQL的初学者。
我有一个名为“mObject_has_media”的简单表,只有两列“media_idMedia”和“mObject_idmObject”
当我尝试使用此代码查询表时,
public function selectMediaIds (MObject $object) {
$medias = array ();
$req = $this -> _db -> query ('SELECT media_idMedia FROM mObject_has_media WHERE mObject_idmObject = ' . $object -> id ());
while ($data = $req -> fetch (PDO::FETCH_ASSOC)) {
$medias[] = $data;
}
$req -> closeCursor ();
return $medias;
}
问题是:当我var_dump方法的结果的内容时,我得到:
array (size=2)
0 =>
array (size=1)
'media_idMedia' => string '52' (length=2)
1 =>
array (size=1)
'media_idMedia' => string '53' (length=2)
我想摆脱那些嵌套数组,只是得到类似的东西:
array (size=2)
0 => 'media_idMedia' => string '52' (length=2)
1 => 'media_idMedia' => string '53' (length=2)
所以我可以简单地将这个数组运行到一个foreach循环中......我确信这个问题与fetch()方法有关,但是尽管尝试了不同的选项,我还没有能够得到理想的行为。
类似的问题(我认为)在这里被问到:PDO::FETCH_ASSOC Does not return the correct table columns但答案提到了Zend框架,我根本不使用任何框架,这只是vanilla PHP。
答案 0 :(得分:1)
让我们创建一个多维数组,仅用于测试目的:
$array = array(
array('foo' => 'value1'),
array('foo' => 'value2')
);
现在考虑以下代码:
$result = array();
while ($row = array_shift($array)) {
// $row will contain one nested array at a time
$result[] = $row;
}
print_r($result);
$row
是一个数组,使用语句$result[] = $row;
,您将整个数组推送到$result
,从而使其成为多维的。
这将输出:
Array
(
[0] => Array
(
[foo] => value1
)
[1] => Array
(
[foo] => value2
)
)
现在,请考虑以下代码:
$result = array();
while ($row = array_shift($array)) {
// $row will contain one nested array at a time
$result[] = $row['foo'];
}
print_r($result);
使用语句$result[] = $row['foo'];
,我们将值 $row['foo']
推送到$result
数组。在循环迭代结束时,$result
将包含foo
行值的数组。
这将输出:
Array
(
[0] => value1
[1] => value2
)
要修复原始代码,您可以这样修改:
$medias[] = $data['media_idMedia'];
答案 1 :(得分:0)
参数 PDO::FETCH_ASSOC
告诉PDO将结果作为关联数组返回。
PDO :: FETCH_ASSOC将返回一个数组,如代码所示。除了如果有多个具有相同名称的列,该键引用的值将是所有值的数组。具有该列名称的行
我认为这行代码
while ($data = $req -> fetch (PDO::FETCH_ASSOC)){ }
$data = $req -> fetch (PDO::FETCH_ASSOC)
`$data`, itself is returned as an array.
这意味着您不需要使用$ data
来定义另一个数组像
这样的东西 $req = $this -> _db -> query ('SELECT media_idMedia FROM mObject_has_media WHERE mObject_idmObject = ' . $object -> id ());
while ($data = $req -> fetch (PDO::FETCH_ASSOC)) {
$data['media_idMedia']; //for media id.
}