PHP 循环从 SQLite 读取并写入数组/JSON


PHP loop to read from SQLite and write to arrays/JSON

我有一个SQLite3数据库,其中包含4个表,每个表有9行。我尝试逐个执行每个数组,使用与下面基本相同的代码(foreach 循环中的所有内容(,并且它工作正常。我想我只是犯了一些愚蠢的错误(我并没有真正使用PHP,这几乎是我唯一使用它的项目(。我试图修复它,但不知何故,PHP 今天并不真正友好。目前,下面的代码返回一个包含 4 个空数组的 JSON。

<?php 
  header('Content-type: application/json');
  $db = new PDO('sqlite:whad.db')or die('Could not open database');
$arDaniel = array();
$arAndi = array();
$arDave = array();
$arSimon = array();
for ($j=0; $j < 4; $j++) { 
  $name;
  $arr;
  if (j == 0) {
    $name = 'Daniel';
    $arr = $arDaniel;
  }
  elseif (j == 1) {
    $name = 'Andi';
    $arr = $arAndi;
  }
  elseif (j == 2) {
    $name = 'Dave';
    $arr = $arDave;
  }
  elseif (j == 3) {
    $name = 'Simon';
    $arr = $arSimon;
  }
  $query = "SELECT Datum, ID, RR, RL, KB, BD, SD, KH, Reihenfolge FROM $name ORDER BY date(Datum)";
  $i = 1;
  foreach($res = $db->query($query) as $value) {
    $curr = array();
    array_push($curr["Datum"] = $value[0]);
    array_push($curr["ID"] = $value[1]);
    array_push($curr["RR"] = $value[2]);
    array_push($curr["RL"] = $value[3]);
    array_push($curr["KB"] = $value[4]);
    array_push($curr["BD"] = $value[5]);
    array_push($curr["SD"] = $value[6]);
    array_push($curr["KH"] = $value[7]);
    array_push($curr["Reihenfolge"] = $value[8]);
    array_push($arr[$i] = $curr);
    $i++;
  }
}
$json = array(
    "Daniel" => $arDaniel,
    "Andi" => $arAndi,
    "Dave" => $arDave,
    "Simon" => $arSimon
  );
echo json_encode($json);
$db = NULL;
?>

编辑:删除了$curr周围的引号。

您有许多具有相同数据的不必要变量。您只需执行以下操作即可

<?php
header('Content-type: application/json');
$db = new PDO('sqlite:whad.db')or die('Could not open database');
$json = array(
  "Daniel" => array(),
  "Andi" => array(),
  "Dave" => array(),
  "Simon" => array()
);
foreach($json as $name => &$arr){
  $query = "SELECT Datum, ID, RR, RL, KB, BD, SD, KH, Reihenfolge FROM $name ORDER BY date(Datum)";
  $stmt = $db->query($query);
  //now comes the trick, that you tell pdo to fecth them already as array
  $arr = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
unset($arr);

echo json_encode($json);
?>

请看这里的第一个示例:http://php.net/manual/de/pdostatement.fetchall.php

另请注意 & 之前 $arr,它将处理 $arr 变量作为引用(也是未设置的,因为在最后一次传递之后,它仍然会被设置,这只是清理的好样式(

更新:与另一个答案一样,您必须使用 PDO::FETCH_ASSOC 来获取仅包含索引名称的数组。

代码中有多个错误:

$arDaniel = array();
$arAndi = array();
$arDave = array();
$arSimon = array();
for ($j=0; $j < 4; $j++) { 
    $name;                                              # <---
    $arr;                                               # <---

php 中的这种"声明"是不必要的,您可以删除$name$arr(顺便说一句,这不是错误(;

    if (j == 0) {                                       # <---

在你用$jfor循环中,你不能在这里使用j:用$j替换它(在php中变量前面总是加上$(;

        $name = 'Daniel';
        $arr = $arDaniel;                               # <---
通过这个赋值,

你想改变原始数组,但是通过这个按值赋值,你实际上创建了一个$arDaniel的副本,并且新元素只添加到$arr,而不是$arDaniel;要做到这一点,你必须通过引用&关键字进行赋值:将这一行(以及以下类似(替换为$arr = &$arDaniel;

    }
        elseif (j == 1) {                               # <--- see above
        $name = 'Andi';
        $arr = $arAndi;                                 # <--- see above
    }
        elseif (j == 2) {                               # <--- see above
        $name = 'Dave';
        $arr = $arDave;                                 # <--- see above
    }
        elseif (j == 3) {                               # <--- see above
        $name = 'Simon';
        $arr = $arSimon;                                # <--- see above
    }
    $query = "SELECT Datum, ID, RR, RL, KB, BD, SD, KH, Reihenfolge FROM $name ORDER BY date(Datum)";
    $i = 1;                                             # <--- 

查询在形式上是正确的,但我不知道你的表结构。 $i = 1;是不必要的(见下文(;

    foreach($res = $db->query($query) as $value) {
        $curr = array();
        array_push($curr["Datum"] = $value[0]);         # <---
        array_push($curr["ID"] = $value[1]);            # <---
        array_push($curr["RR"] = $value[2]);            # <---
        array_push($curr["RL"] = $value[3]);            # <---
        array_push($curr["KB"] = $value[4]);            # <---
        array_push($curr["BD"] = $value[5]);            # <---
        array_push($curr["SD"] = $value[6]);            # <---
        array_push($curr["KH"] = $value[7]);            # <---
        array_push($curr["Reihenfolge"] = $value[8]);   # <---
        array_push($arr[$i] = $curr);                   # <---
        $i++;                                           # <---
    }
}

array_push语法不正确(请参阅手册页(:正确的语法是 array_push( $existentArray, $newElement ) 。此外,不能使用 array_push 添加关联值,只能将其用于数字键。只需在$curr['Datum'] = $value[0];等中更改$curr分配...

要将$curr附加到$arr,您必须更改array_push( $arr, $curr )或(更好的是,如果只附加一个元素,则php建议使用($arr[] = $curr;中的行。进行这些更改后,可以删除$i++;行。

$json = array(
    "Daniel" => $arDaniel,
    "Andi" => $arAndi,
    "Dave" => $arDave,
    "Simon" => $arSimon
);
echo json_encode($json);
$db = NULL;

现在你的脚本是干净的(我希望(。

您的脚本仍然有点多余。您可以通过以下方式简化它:

$array = array( 'Daniel'=>array(), 'Andi'=>array(), 'Dave'=>array(), 'Simon'=>array() );
foreach( $array as $key => &$val )
{
    $query = "SELECT Datum, ID, RR, RL, KB, BD, SD, KH, Reihenfolge FROM $key ORDER BY date(Datum)";
    $result = $db->query( $query );
    $val    = $result->fetchAll( PDO::FETCH_ASSOC );
}
$json = json_encode( $array );
echo $json;

通过这种方式,你初始化一个以名称作为键的数组,然后,在按引用(&$val(的foreach循环中,你在表$key中执行SQL查询搜索,并直接在数组中获取所有结果(在本例中,值存储为关联数组,如示例中所示,但您可以使用PDO::FETCH_OBJ将数据存储为对象(。最后,你对数组端进行编码,以回显它。

编辑:

我看到之前的答案几乎与我的答案相同......顺便说一句,我离开我的是因为我花了很多时间来解释各种错误......