【问题标题】:Php pdo foreachphp 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 元素,其他没有......

【问题讨论】:

    标签: php mysql json pdo


    【解决方案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']); 
    
            }
    

    【讨论】:

      猜你喜欢
      • 2012-03-17
      • 2017-05-18
      • 2012-08-14
      • 2023-03-15
      • 2015-03-14
      • 2015-07-31
      • 2015-10-29
      • 2013-03-05
      • 2013-03-01
      相关资源
      最近更新 更多