我有一个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) { # <---
在你用$j
的for
循环中,你不能在这里使用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
将数据存储为对象(。最后,你对数组端进行编码,以回显它。
编辑:
我看到之前的答案几乎与我的答案相同......顺便说一句,我离开我的是因为我花了很多时间来解释各种错误......