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的主要内容,如果未能解决你的问题,请参考以下文章

如何在PHP下开启PDO MySQL的扩展

PDO

PHP的PDO

PHP PDO学习小结

如何开启PDO,PDO_MYSQL扩展

关于安装PHP补装PDO与PDO_MYSQL操作