JSON aus mehrdimensionalem Array (PHP) => scheinbar fehlerhaft?

pyretta

Mitglied
Hallo,

ich versuche eine Web-App zu programmieren die von verschiedenen CMS mit Daten versorgt wird. Den Datenaustausch wollte ich über eine JSON-Datei managen, die ich mittels PHP und einer MySQL-Abfrage erstelle. Bin noch recht frisch in PHP, und habe dementsprechend wohl einige Verständisprobleme die ich bisher durch google noch nicht lösen konnte.

Ich habe 4 MySQL-Abfragen die ich in jeweils 1 Array packe.
Bspw. so:

PHP:
//INHALTE AUS DB IN 1 ARRAY SPEICHERN
$array1 = array();
$abfrage1 = mysql_query("SELECT id,pid,type,text,headline,html FROM `tl_content` WHERE `invisible`='' AND `type` = 'text' OR `type` = 'html' OR `type` = 'headline';") or die("Anfrage für 'tl_content' war nicht erfolgreich");
while($obj_array1 = mysql_fetch_object($abfrage1)) {
	$array1[] = $obj_array1;
}

Die 4 Arrays wollte ich in ein einziges Array zusammenfassen, in etwa so:

PHP:
//ALLE ARRAYS IN MEHRDIMENSIONALES ARRAY ZUSAMMENFASSEN
$array_gesamt = array("array1" => $array1, "array2" => $array2, "array3" => $array3, "array4" => $array4);

Und dann dieses nun mehrdimensionale Array in eine JSON-Datei überführen, in etwa so:

PHP:
//ARRAY ALS JSON FORMATIEREN
$json_inhalt = '{"JSON-Inhalte":'.json_encode($array_gesamt).'}';

Dann erstelle ich eine JSON-Datei mit eben diesem Inhalt durch ein kleines Formular:

HTML:
<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>">
<input type="submit" name="sent" value="aktualisieren">
</form>

PHP:
/**
* ------------------------ FORMULAR ACTION ------------------------
* WENN AKTUALISIEREN BUTTON GEDRÜCKT, DANN SCHREIBE NEUE JSON-DATEI
*/
if(isset($_POST['sent'])){
	// Pfad festlegen:
	$path = "./json/";
	// Datei festlegen:
	$filename = "json_datei.json";
	// prüfen, ob es diesen Pfad schon gibt:
	if(!dirname($path)!= $path) 
	{
	 // wenn es den Ordner noch nicht gibt, wird er angelegt
	 echo "Der Pfad existiert noch nicht.<br>";
	 $pfadangelegt = mkdir($path);
	 if (dirname($path)) 
	 { echo "Der Pfad wurde angelegt<br>"; }
	 else
	 { die("Der Pfad konnte nicht angelegt werden."); }
	}
	
	// prüfen, ob es die Datei schon gibt
	if(file_exists($path.$filename)) 
	{ echo "Die Datei existiert schon.<br>"; }
	else 
	{ echo "Die Datei existiert noch nicht.<br>"; }
	
	// Datei neu anlegen bzw. öffnen
	$file = fopen($path.$filename, "w");
	// in die Datei schreiben
	$geschrieben = fwrite($file, $json_inhalt);
	// Datei schliessen
	fclose($file);
}

Im Prinzip funktioniert das auch, die JSON-Datei wird erstellt. Kopiere ich aber den Inhalt der Datei in http://jsonlint.com/, kann der Code nicht validiert werden. Kopiere ich es in http://jsonformatter.curiousconcept.com/ dann sagt es mir "JSON DATA INACCESSIBLE".

Jetzt stelle ich mir eben folgende Fragen:

  • Ist nun meine Vorgehensweise fehlerhaft?
  • Habe ich das Array, das mehrdimensional werden sollte, syntaktisch falsch aufgebaut?
  • Oder Muss ich, wenn ich ein mehrdimensionales Array in JSON encodiere, dann noch Parameter beim encodieren hinzufügen?
  • Oder ist die Datei zum validieren einfach nur zu groß (606kb)? Weil wenn ich den Code bei http://www.jsonformatter.de/index.php formatieren und überprüfen lasse, geht es scheinbar ohne Probleme... ?!

Auf was soll ich nun gehen? Was ist zuverlässiger?

Freue mich, wenn Ihr mir helfen könnt. Vielen Dank.

Liebe Grüße,
pyretta
 
Zuletzt bearbeitet:
Mach doch mal ein var_dump() auf $json_inhalt und poste das JSON
PHP:
<!-- am besten innerhalb von pre-Tags ausgeben damit man die Struktur erkennt -->
<pre><?php var_dump($json_inhalt); ?> </pre>
Ev. die SQL-Ausgabemenge reduzieren damit es nciht allzugroos und somit noch lesbar ist
 
Hallo Yaslaw,

vielen Dank für deine Antwort.

hier mal der Inhalt meiner JSON-Datei (inhaltlich stark gekürzt und mit Blindtext gefüllt aber in der Struktur identisch mit dem Original):

Code:
{"JSON-Inhalte": {
    "array1": [
      {
        "id": "66",
        "pid": "59",
        "tstamp": "1350563136",
        "title": "irgend ein Titel",
        "author": "4",
        "teaser": "<ul class=\"eine_liste\">
<li><img title=\"Titel\" src=\"url/images/bild.png\" alt=\"ALT\"></li>
<li><img title=\"Titel\" src=\"url/images/bild.png\" alt=\"ALT\"></li>
</ul>
<ul class=\"eine_liste\">
<li><img title=\"Titel\" src=\"url/images/bild.png\" alt=\"ALT\"></li>
<li><img title=\"Titel\" src=\"url/images/bild.png\" alt=\"ALT\"></li>
</ul>
<ul class=\"eine_liste\">
<li><img title=\"Titel\" src=\"url/images/bild.png\" alt=\"ALT\"></li>
<li><img title=\"Titel\" src=\"url/images/bild.png\" alt=\"ALT\"></li>
</ul>",
        "af_criteria": "a:11:{i:0;s:1:\"1\";i:1;s:1:\"2\";i:2;s:1:\"3\";i:3;s:1:\"4\";i:4;s:1:\"5\";i:5;s:1:\"6\";i:6;s:1:\"8\";i:7;s:2:\"10\";i:8;s:2:\"14\";i:9;s:2:\"31\";i:10;s:2:\"20\";}",
        "createdate": "1349879820"
      }, 
	  {
        "id": "66",
        "pid": "59",
        "tstamp": "1350563136",
        "title": "irgend ein Titel",
        "author": "4",
        "teaser": "<ul class=\"eine_liste\">
<li><img title=\"Titel\" src=\"url/images/bild.png\" alt=\"ALT\"></li>
<li><img title=\"Titel\" src=\"url/images/bild.png\" alt=\"ALT\"></li>
</ul>
<ul class=\"eine_liste\">
<li><img title=\"Titel\" src=\"url/images/bild.png\" alt=\"ALT\"></li>
<li><img title=\"Titel\" src=\"url/images/bild.png\" alt=\"ALT\"></li>
</ul>
<ul class=\"eine_liste\">
<li><img title=\"Titel\" src=\"url/images/bild.png\" alt=\"ALT\"></li>
<li><img title=\"Titel\" src=\"url/images/bild.png\" alt=\"ALT\"></li>
</ul>",
        "af_criteria": "a:11:{i:0;s:1:\"1\";i:1;s:1:\"2\";i:2;s:1:\"3\";i:3;s:1:\"4\";i:4;s:1:\"5\";i:5;s:1:\"6\";i:6;s:1:\"8\";i:7;s:2:\"10\";i:8;s:2:\"14\";i:9;s:2:\"31\";i:10;s:2:\"20\";}",
        "createdate": "1349879820"
      }, 
	  {
        "id": "66",
        "pid": "59",
        "tstamp": "1350563136",
        "title": "irgend ein Titel",
        "author": "4",
        "teaser": "<ul class=\"eine_liste\">
<li><img title=\"Titel\" src=\"url/images/bild.png\" alt=\"ALT\"></li>
<li><img title=\"Titel\" src=\"url/images/bild.png\" alt=\"ALT\"></li>
</ul>
<ul class=\"eine_liste\">
<li><img title=\"Titel\" src=\"url/images/bild.png\" alt=\"ALT\"></li>
<li><img title=\"Titel\" src=\"url/images/bild.png\" alt=\"ALT\"></li>
</ul>
<ul class=\"eine_liste\">
<li><img title=\"Titel\" src=\"url/images/bild.png\" alt=\"ALT\"></li>
<li><img title=\"Titel\" src=\"url/images/bild.png\" alt=\"ALT\"></li>
</ul>",
        "af_criteria": "a:11:{i:0;s:1:\"1\";i:1;s:1:\"2\";i:2;s:1:\"3\";i:3;s:1:\"4\";i:4;s:1:\"5\";i:5;s:1:\"6\";i:6;s:1:\"8\";i:7;s:2:\"10\";i:8;s:2:\"14\";i:9;s:2:\"31\";i:10;s:2:\"20\";}",
        "createdate": "1349879820"
      }
    ],
    "array2": [
      {
        "id": "1",
        "pid": "1",
        "title": "Lorem Ipsum"
      },
      {
        "id": "2",
        "pid": "1",
        "title": "Lorem Ipsum"
      },
      {
        "id": "3",
        "pid": "1",
        "title": "Lorem Ipsum"
      },
      {
        "id": "4",
        "pid": "1",
        "title": "Lorem Ipsum"
      },
      {
        "id": "5",
        "pid": "1",
        "title": "Lorem Ipsum"
      }
    ],
    "array3": [
      {
        "id": "1",
        "title": "Lorem Ipsum"
      },
      {
        "id": "2",
        "title": "Lorem Ipsum"
      },
      {
        "id": "3",
        "title": "Lorem Ipsum"
      },
      {
        "id": "4",
        "title": "Lorem Ipsum"
      }
    ],
    "array4": [
      {
        "id": "2",
        "pid": "2",
        "type": "text",
        "text": "<h1>Lorem ipsum dolor sit amet</h1>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim.</p>",
        "headline": "a:2:{s:4:\"unit\";s:2:\"h1\";s:5:\"value\";s:17:\"Lorem Ipsum\";}",
        "html": ""
      },
      
      {
        "id": "84",
        "pid": "32",
        "type": "text",
        "text": "<h1>Lorem ipsum dolor sit amet</h1>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim.</p>",
        "headline": "a:2:{s:4:\"unit\";s:2:\"h1\";s:5:\"value\";s:0:\"\";}",
        "html": null
      },
      {
        "id": "85",
        "pid": "32",
        "type": "html",
        "text": null,
        "headline": "",
        "html": "<table><tbody><tr id=\"feedback\">
<td>Feedback</td>
<td>{{form::feedback}}</td>
</tr>
<tr id=\"feedback2\">
<td>Feedback2</td>
<td>{{form::feedback2}}</td>
</tr>
<tr id=\"feedback3\">
<td>Feedback3</td>
<td>{{form::feedback3}}</td>
</tr>
</tbody>
</table>"
      },
      
      {
        "id": "191",
        "pid": "69",
        "type": "headline",
        "text": null,
        "headline": "a:2:{s:4:\"unit\";s:2:\"h1\";s:5:\"value\";s:32:\"Headline Text\";}",
        "html": null
      }      
    ]
  }}

Das "array1" hat derzeit 57 Elemente, das "array2" hat 37 Elemente, "array3" hat 4 Elemente und "array4" hat 366 Elemente. Und das var_dump für "$json_inhalt" gibt mir den JSON-Inhalt wie oben wieder und noch folgende Info: "$json_inhalt: string(620135)", falls dir das auch noch was bringt.
 
Zuletzt bearbeitet:
Haben die Testseiten ev. Probleme mit den Arrays die keine Keys haben? Das seht man an den Bereichen mit den [].
 
Naja, ich muss zugeben ich habe es bisher nur mit einem eindimensionalen Array getestet.

HTML:
<script type="text/javascript">	
	$('#seite1').on("pageshow", function(){
		var path = "http://www.domain.de/images/";	
		$('#liste').empty();
		$.getJSON('json/json-datei.json', function(data) {
			$.each(data.JSON-Inhalte, function(i,item) {
				$('<li><a href="details.html" data-transition="slide" onClick="javascript:sessionStorage.item=\''+item.title+'\';"><h3>'+item.title+'</h3>'+item.teaser+'</a></li>').appendTo('#liste');
				
			});
			$('#liste').listview('refresh');			
			$('#liste img').attr('src',function(index,attr){
          		return attr.replace('images/', path);
    			});
		});
	});	
</script>

Und das hat so auch funktioniert.

Mit dem mehrdimensionalen habe ich noch meine Probleme...
HTML:
<script type="text/javascript">	
	$('#seite1').on("pageshow", function(){
		var path = "http://www.domain.de/images/";		
		$('#liste').empty();		
		$.getJSON('json/json-datei.json', function(data) {												
			$.each(data.JSON-Inhalte.array1, function() {
				var teaser = this.teaser;
				var title = this.title;														   
				$('<li><a href="details.html" data-transition="slide" onClick="javascript:sessionStorage.item=\''+title+'\';"><h3>'+title+'</h3>'+teaser+'</a></li>').appendTo('#liste');				
			});
			$('#liste').listview('refresh');			
			$('#liste img').attr('src',function(index,attr){
          		return attr.replace('images/', path);
    			});
		});
	});	
</script>
Das funktioniert leider noch nicht... Aber ich glaub das ist eine andere Baustelle.

Und bei den CMS-Seiten selbst gab es eigentlich nie Probleme, falls du das gemeint hast?

Denkst du denn dass die JSON-Datei so richtig ist?
Oder liegt der Fehler bei meiner PHP-Programmierung, also bei der Erzeugung der JSON-Datei?
 
Zuletzt bearbeitet:
Ich glaube, ich habs nun hinbekommen.

In der PHP-Datei, mit der ich die JSON-Datei erstelle habe ich einfach beim encodier-Vorgang noch einen Parameter hinzugefügt.

PHP:
$json_inhalt = '{"JSON-Inhalte":'.json_encode($array_gesamt, JSON_FORCE_OBJECT).'}';

Und den jQuery-code habe ich wie folgt abgeändert, so kann ich auf die einzelnen Arrays zugreifen:

HTML:
<script type="text/javascript">	
	$('#startseite').on("pageshow", function(){
		var path = "http://www.domain.de/images/";
		
		$('#liste').empty();
		
		$.getJSON('json-datei.json', function(data) {
			$.each(data.JSON-Inhalte.array1, function(i,item) {
					var title = item.title;
					var teaser = item.teaser;
					var id = item.id;
				
					$('<li><a href="details.html" rel="external" data-transition="slide" onClick="javascript:sessionStorage.id=\''+id+'\';"><h3>'+title+'</h3>'+teaser+'</a></li>').appendTo('#liste');		   
								   
			});
			$('#liste').listview('refresh');
			
			$('#liste img').attr('src',function(index,attr){
          		return attr.replace(images/', path);
    			});
		});
	});
</script>

So hat es funktioniert und ich kann in der Datei "details.html" so auf die Details zugreifen:

HTML:
<script type="text/javascript">	
	$('#startseite').on("pageshow", function(){		
		$('#inhalt').empty();		
		var id = sessionStorage.id;
		
		$.getJSON('json-datei.json', function(data) {
			$.each(data.JSON-Inhalte.array4, function(i,item) {
					var headline = item.headline;
					var html = item.html;
					var text = item.text;					
				if(item.pid == id) {
					$('<h3>'+headline+'</h3>'+html+text).appendTo('#inhalt');
				}	
				
			});
		});
	});	
</script>

Funktioniert soweit ganz gut.

Nochmal vielen Dank an Yaslaw. :)
Ohne den Hinweis mit dem "Key" wäre ich auf den Parameter "JSON_FORCE_OBJECT" nicht gekommen.
 
Schön das es jetzt funktioniert und danke für das Posten des Resultates. Das wird anderen Programmierern auch helfen.
 

Neue Beiträge

Zurück