php pdo foreach
Posted
技术标签:
【中文标题】php pdo foreach【英文标题】:Php pdo foreach 【发布时间】:2014-04-30 02:59:33 【问题描述】:这里我有 php pdo 函数来从数据库中获取 json
try
$conn = new PDO("mysql:host=localhost;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$result = $conn->prepare("SELECT id_tabele,naziv FROM track_aktivnosti WHERE prvi=:prvi AND id_akt=:id_akt AND tabela=:tabela");
$result->execute(array(':prvi' => $_POST['prvi'], ':id_akt' => $_POST['id_akt'], ':tabela' => $_POST['tabela']));
$result = $result->fetchAll();
foreach($result as $r)
$temp = array();
$temp[] = array('id' => (int) $r['id_tabele'], 'ime_prezime' => (string) $r['naziv']);
$table = $temp;
$jsonTable = json_encode($table);
catch(PDOException $e)
echo 'ERROR: ' . $e->getMessage();
echo $jsonTable;
但我只得到一个结果,json 中的一个元素等。
["id":1,"ime_prezime":"Pera Peric"]
我无法获得的其他元素。为什么?
我必须得到这样的 json:
["id":1,"ime_prezime":"Pera Peric",["id":2,"ime_prezime":"Laza Lazic"] ]
但我只得到 1.st 元素,其他没有......
【问题讨论】:
【参考方案1】:你正在做很多无用的操作。难怪你迷路了。
$conn = new PDO("mysql:host=localhost;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
$sql = "SELECT id_tabele id, naziv ime_prezime FROM track_aktivnosti
WHERE prvi=? AND id_akt=? AND tabela=?";
$stmt = $conn->prepare($sql);
$stmt->execute(array($_POST['prvi'], $_POST['id_akt'], $_POST['tabela']));
echo json_encode($result->fetchAll());
【讨论】:
不知道是谁投了反对票,但这是一个很好的解决方案。使用 SQL 别名进行命名,防止出现额外的循环。 -.5 没有回答提出的问题:“其他我无法获得的元素。为什么?”和另一个 -.5 因为我们不能给一半投票。【参考方案2】:您将在每次迭代时覆盖 foreach
内的数组。这实质上意味着每次迭代都会清空数组。该数组将仅包含上次迭代的值。将$temp = array();
声明移到循环外来解决这个问题:
$temp = array(); // intialize the array
foreach($result as $r)
$temp[] = array(
'id' => (int) $r['id_tabele'],
'ime_prezime' => (string) $r['naziv']
);
上述修复将使您的代码正常工作,但我建议使用使用 SQL 别名的方法,如下面的@YourCommonSense's answer 所示。
【讨论】:
这对我来说是更好的解决方案,因为我需要不同的列名和 json 中的名称【参考方案3】:声明
$temp = array();
在循环之外,因为你在循环内有这个,并且在每次迭代时,它都被声明为新数组,并且以前的条目被擦除。
即
$temp = array();
foreach($result as $r)
$temp[] = array('id' => (int) $r['id_tabele'], 'ime_prezime' => (string) $r['naziv']);
【讨论】:
以上是关于php pdo foreach的主要内容,如果未能解决你的问题,请参考以下文章