Ajax -> php -> db -> php -> ajax/js

STFNJNG

New member
Hallo Leute,

ich bastel gerade an etwas herum und trete leider auf der Stelle. Vielleicht hat jemand eine Idee?
Code:
$(document).ready(function(){
	$.ajax({
		type:"Post",
		url:"db_titel.php",
		success:function(data_titel){
			$(document.body).append('<div id=\"schritt_1\" class=\"maincontainer_auswahl\"></div>');
			$('#schritt_1').append('<div id=\"schritt_1_head\" class=\"schritt_head\"></div>');
			$('#schritt_1').append('<div id=\"schritt_1_content\" class=\"schritt_content\"></div>');
			titel=data_titel;
			$('#schritt_1_head').html(titel);
			$.ajax({
				type:"Post",
				url:"db_verbindung.php",
				data:{var:next},
				success:function(data){
					var obj=$.parseJSON(data);
					$.each(obj,function(){
						$('#schritt_1_content').append('<div id=\"auswahl_'+obj['id']+'\" class=\"auswahl\"></div>'); 
						$('#auswahl_'+obj['id']).append('<div id=\"name'+obj['id']+'\" class=\"auswahl_name\">'+obj['name']+'</div>');
						$('#auswahl_'+obj['id']).append('<div id=\"bild'+obj['id']+'\" class=\"auswahl_bild\"><img src=\"'+obj['bild']+'\" width=\"100\" height=\"100\" \/></div>');
						$('#auswahl_'+obj['id']).append('<div class=\"hidden\" data-id=\"'+obj['id']+'\" data-next=\"'+obj['next_table']+'\" data-preis=\"'+obj['preis']+'\" data-name=\"'+obj['name']+'\"></div>');
						$('#auswahl_'+obj['id']).click(function(){
							// auswahl in vars schreiben
							s1titel=titel;
							s1id=obj['id'];
							s1name=obj['name'];
							s1preis=obj['preis'];
							s1next=obj['next_table'];
							$('#schritt_'+obj['id']+'_content').toggle("slow", function(){
								schritt_id++;
								alert('Nächster Schritt: '+schritt_id);
								schritt_2();
							}); // ende toggle function
						}); // ende click
					}); // ende each function
				} // ende success
			}); // ende ajax
		} // ende success
	}); // ende ajax			
}); // ende ready



PHP:
$dbConnection = mysqli_connect('localhost', 'root', '', 'pricocal');
$query="SELECT * FROM `pcc_start` WHERE `aktiv` = '1'";
$result=mysqli_query($dbConnection, $query);
if(mysqli_num_rows($result) > 0){
	$row=mysqli_fetch_array($result, MYSQLI_ASSOC);
	echo json_encode($row);
}else{
	echo "Keine (aktiven) Elemente";
}

Ich bekomme leider 6 Ergebnisse angezeigt, alle samt nicht in dem Container, wo sie hin sollen.
Nehme ich als Variante das JSON gedöns aus der PHP-Datei raus und rufe die Datei direkt im Browser auf erhalte ich die richtigen Datensätze. 2 an der Zahl.

Nehme ich das JSON wieder rein und rufe es direkt auf erhalte ich:
{"id":"1","name":"Jutebeutel lang","bild":"images\/start\/jutebeutel_lang.png","next_table":"pcc_jutebeutel_lang","preis":"0.00","aktiv":"1"}

Jemand eine Idee woran es liegt?

Vielen Dank vorab für eure Mühen und eure Zeit.

Liebe Grüße, Stefan
 
Hi,

Dein Fehler wird hier liegen:
PHP:
if(mysqli_num_rows($result) > 0){ 
    $row=mysqli_fetch_array($result, MYSQLI_ASSOC); 
    echo json_encode($row); 
}

Dein PHP spuckt ja in dem Fall - sollte das Ergebnis 5 ergeben, 5 mal ein JSON Ergebnis aus. Das macht nicht wirklich Sinn. Besser ist es, alles zuerst in ein Array zu schreiben und dann das Ergebnis via Echo auszugeben. Den Rest erledigst du dann in JQuery.
PHP:
$finish = "";
$result=mysqli_query($dbConnection, $query);
  if(mysqli_num_rows($result) > 0){ 
    while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){ 
      $finish = array(
        "RESULT" => "success",
        "ID" => $row['id'],
        "NAME" => $row['name'],
        "BILD" => $row['bild'],
        "NEXT_TABLE" => $row['next_table'],
        "PREIS" => $row['preis'],
        "AKTIV" => $row['aktiv']
      ); 
    }
  }else{ 
    $finish = array(
      "RESULT" => "denied",
      "INFO" => utf8_encode("Keine (aktiven) Elemente"); 
    );
  }
echo json_encode($finish);
}

Ungetestet, sollte aber auf jeden Fall in etwa so funktionieren.

PS: Bitte auch demnächst JS-Code in PHP darstellen lassen. einfach der Übersicht halber. ;)

Gruß,
Terra
 
Zuletzt bearbeitet:
AW: Ajax -&gt; php -&gt; db -&gt; php -&gt; ajax/js

Guten Abend zusammen,

vielen Dank erstmal für eure Mühen. Jetzt erhalte ich 7 Container, und die Variablen die ausgegeben werden sollen sind alle undefined. Ich habe im PHP-Skript von Terra auch das komplette ELSE entfernen müssen weil mein Dreamweaver das sonst so nicht akzeptiert hätte.

Funktionieren tut es leider noch nicht.

Ich teste es heute Abend mal händisch ohne Datenbankabfrage und schaue ob ich es vernünftig zusammen gepuzzelt bekomme. Melde mich dann später nochmals.

Wie gesagt, vielen Dank schonmal für eure Mühen.

Stefan

- - - Aktualisiert - - -

Hallo und guten Abend. Ich habe es jetzt folgendermaßen umgebaut:
Meine js
PHP:
// los geht's
$(document).ready(function(){
	$.ajax({
		type:"Post",
		url:"db_titel.php",
		success:function(data_titel){
			$(document.body).append('<div id=\"schritt_1\" class=\"maincontainer_auswahl\"></div>');
			$('#schritt_1').append('<div id=\"schritt_1_head\" class=\"schritt_head\"></div>');
			$('#schritt_1').append('<div id=\"schritt_1_content\" class=\"schritt_content\"></div>');
			titel=data_titel;
			$('#schritt_1_head').html(titel);
			$.ajax({
				type:"Post",
				url:"db_verbindung.php",
				data:{var:next},
				success:function(data){
					var obj=$.parseJSON(data);
					$.each(obj,function(){
						$('#schritt_1_content').append('<div id=\"auswahl_'+obj['ID']+'\" class=\"auswahl\"></div>'); 
						$('#auswahl_'+obj['ID']).append('<div id=\"name'+obj['ID']+'\" class=\"auswahl_name\">'+obj['NAME']+'</div>');
						$('#auswahl_'+obj['ID']).append('<div id=\"bild'+obj['ID']+'\" class=\"auswahl_bild\"><img src=\"'+obj['BILD']+'\" width=\"100\" height=\"100\" \/></div>');
						$('#auswahl_'+obj['ID']).append('<div class=\"hidden\" data-id=\"'+obj['ID']+'\" data-next=\"'+obj['NEXT']+'\" data-preis=\"'+obj['PREIS']+'\" data-name=\"'+obj['NAME']+'\"></div>');
						$('#auswahl_'+obj['ID']).click(function(){
							$('#schritt_'+obj['ID']+'_content').toggle("slow", function(){
								schritt_id++;
								// weitere aktionen
							}); // ende toggle function
						}); // ende click
					}); // ende each function
				} // ende success
			}); // ende ajax
		} // ende success
	}); // ende ajax			
}); // ende ready

Meine php
PHP:
<?php
$dbConnection= mysqli_connect('localhost', 'root', '', 'pricocal');
$query="SELECT * FROM `pcc_start` WHERE `aktiv` = '1'";
$finish="";
$result=mysqli_query($dbConnection, $query);
	if(mysqli_num_rows($result) > 0){ 
		while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){ 
			$finish = array(
			"RESULT" => "success",
			"ID" => $row['id'],
			"NAME" => $row['name'],
			"BILD" => $row['bild'],
			"NEXT_TABLE" => $row['next_table'],
			"PREIS" => $row['preis'],
			"AKTIV" => $row['aktiv']
		);
		}
	}
echo json_encode($finish);
?>

Leider habe ich 7 Ergebnisse. Obwohl zum testen nur 2 Datensätze in der Datenbank sind.
Er müsste also 2 anzeigen.

Nur nochmal damit ihr versteht worum es mir geht:
Es wird ein DIV mit der ID "Schritt_1" angelegt.
In diesen werden mittels append 2 weitere angelegt. (schritt_1_head & schritt_1_content)

Jetzt sollte die Schleife für jeden Datensatz einen DIV erzeugen; die ID nutze ich um den DIV's eindeutige ID's zu geben.

Es müsste also in schritt_1 -> schritt_1_content folgendes gelegt werden:
auswahl_1
-> name_1
-> bild_1

auswahl_2
-> name_2
-> bild_2

Stattdessen erhalte ich 7 Container und die DIV's beginnen alle bei ID 2 ...

Ich versuche einen Screenshot anzufügen der die Struktur zeigt.

Liegt es dann nicht am auslesen der Datenbank!?

Liebe Grüße, Stefan

Bildschirmfoto 2015-10-08 um 21.51.24.png
 
PHP:
<?php 
$dbConnection= mysqli_connect('localhost', 'root', '', 'pricocal'); 
$query="SELECT * FROM `pcc_start` WHERE `aktiv` = '1'"; 

$arr = [];
$inc = 0;

$result=mysqli_query($dbConnection, $query); 
    if(mysqli_num_rows($result) > 0){  
        while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){  
            $finish = ( array( 
            "RESULT" => "success", 
            "ID" => $row['id'], 
            "NAME" => $row['name'], 
            "BILD" => $row['bild'], 
            "NEXT_TABLE" => $row['next_table'], 
            "PREIS" => $row['preis'], 
            "AKTIV" => $row['aktiv'] 
        )); 
		
		$arr[$inc] = $finish;
		$inc++;
		
        } 
    } 
echo json_encode($arr); 
?>

So, jetzt spuckt das PHP 2 zusammengefügte Datensätze für JSON aus. Selbst getestet.
Ggf. musst du hier dran noch was machen: $.each(obj,function(){.
Zum anderen macht die Funktion kein Sinn: data:{var:next},

Gruß,
Terra
 
Zuletzt bearbeitet:
AW: Ajax -&gt; php -&gt; db -&gt; php -&gt; ajax/js

Die Zuweisung an das Array ist falsch. Du darfst natürlich $finish nicht in jedem Durchlauf überschreiben:
Code:
 <?php
$dbConnection= mysqli_connect('localhost', 'root', '', 'pricocal');
$query="SELECT * FROM `pcc_start` WHERE `aktiv` = '1'";
$finish=array();
$result=mysqli_query($dbConnection, $query);
    if(mysqli_num_rows($result) > 0){ 
        while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){ 
            $finish[] = array(
            "RESULT" => "success",
            "ID" => $row['id'],
            "NAME" => $row['name'],
            "BILD" => $row['bild'],
            "NEXT_TABLE" => $row['next_table'],
            "PREIS" => $row['preis'],
            "AKTIV" => $row['aktiv']
        );
        }
    }
echo json_encode($finish);
?>
- wobei: wirklich schön ist dieser Code nicht...

- - - Aktualisiert - - -

Mist: hab' terras Post übersehen...
 
Naben zusammen,

jetzt funktioniert die Ausgabe im Browser. Vielen Dank für eure Mühen.
Das ich nun anders auf die einzelnen Vars zugreife habe ich noch so hinbekommen.
Sollte es jemanden interessieren: (Ein Forum sollte auch informieren!)


Vorher:
Schleife: $.each(obj,function(){
Zugriff mit -> obj['ID'];
Jetzt:
Schleife: $.each(obj,function(i){
Zugriff mit -> obj.ID;


Eine Frage habe ich aber doch noch dazu:
PHP:
...
type:"Post",
url:"db_verbindung.php",
data:{var:next},
success:function(data){
...

Wenn der Teil mit data:{var next} keinen Sinn macht, wie Terra schrieb, wie könnte ich das umschreiben?

Ich möchte erzielen, dass meine Variable next an PHP mitgeschickt wird, damit ich diese in die Datenbankabfrage einbauen kann...

Wenn ich z.B. eine Tabelle xyz habe und darin suchen möchte, würde meine next den Wert xyz haben und ich würde die folgend einbinden: (So oder in der Art zumindest)

PHP:
$next=$_POST["next"];
$query="SELECT * FROM $next WHERE `aktiv` = '1'";

Viele Grüße,
Stefan
 
Wenn der Teil mit data:{var next} keinen Sinn macht, wie Terra schrieb, wie könnte ich das umschreiben?

Naja, wenn du etwas mitschicken willst, dann musst du ja bereits vorher die "next" Variable irgendwo befüllt haben.

Dann würde...
PHP:
var status = "irgendwas";
// oder
var status = 1;
.
.
.
data: {"next": status}, 
.
.
bereits ausreichen.

Jetzt kann es aber natürlich sein, das dein Beispielcode etwas ungünstig von dir aufgeschrieben wurde, da ich das "var" gesehen habe, aber dieses var eine Deklaration von JS ist und so nicht gehen sollte.

PS: Sollte dein PHP-Code für die DB so aussehen, wie du es hier geschrieben hast, macht dir bitte Gedanken darüber, das er sehr Anfällig für SQL-Injektion ist.

Gruß,
Terra
 
Danke für die schnelle Antwort, Terra!
Gerade stellt sich das nächste Problem:
Ich erstelle ja mittels jQuery / Javascript die DIVS.
Im ersten Schritt sind die wunderbar da, im zweiten Schritt ist der Content zwar im Quellcode aber nicht sichtbar!? Eine Idee? Ich habe schon versucht mittels $('#DIV_ID').show(); was zu deichseln aber leider ohne Erfolg. :(

Grüße, Stefan
 
Das ist leider schwer zu sagen, da dein Code extrem unübersichtlich ist.
Evtl. hat es was mit doppelt vergebenen ID´s zu tun. Das sieht JS nicht gerne.
Was sagt den deine Entwickler-Konsole?

Ansonsten würde ich dir Vorschlagen alles ein wenig kompakter zu gestalten, so das du mehr Übersicht in dein Code bekommst.

So würde sich das ...
PHP:
$('#schritt_1').append('<div id=\"schritt_1_head\" class=\"schritt_head\"></div>'); 
$('#schritt_1').append('<div id=\"schritt_1_content\" class=\"schritt_content\"></div>');
in das ...
PHP:
var schritt_1 = '<div id="schritt_1_head" class="schritt_head"></div>' +
                '<div id="schritt_1_content" class="schritt_content"></div>';

$('#schritt_1').append(schritt_1);
verpacken.

Ist nur ein Vorschlag. Jeder so, wie er mag. :)

Gruß,
Terra
 
Ich check das mal morgen und melde mich wieder! Ich habe das data-ding in der ajax bereits getauscht... klappt!
Wobei meine Version vorher auch ging. Ich habe der var am Anfang einen wert und dieser wird in jedem nächsten schritt überschrieben mit einem wert der im schritt davor aus der Datenbank kam. so habe ich eine laufvariable ...

Vielen dank erstmal und einen angenehmen Abend noch...

Stefan
 
Guten Tag zusammen,

ich habe jetzt fast alles so am laufen wie ich es geplant hatte, ein Problem was sich komischerweise nun stellt:
Im ersten Durchlauf meiner AJAX-Abfrage mittels PHP funktioniert alles.

Im zweiten Durchlauf erhalte ich einen JSON Error:

JSON.parse: unexpected end of data

Mein AJAX-Teil:
PHP:
$.ajax({
				type:"Post",
				data:{"laufv":next},
				url:"db_verbindung.php",
				success:function(data){
					var obj=$.parseJSON(data);
					$.each(obj,function(i){
...

Meine PHP dazu:
PHP:
$query="SELECT * FROM $laufv WHERE `aktiv` = '1'"; 

$arr = array();
$inc = 0;

$result=mysqli_query($dbConnection, $query); 
    if(mysqli_num_rows($result) > 0){  
        while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){  
            $finish = ( array( 
            "RESULT" => "success", 
            "ID" => $row['id'], 
            "NAME" => $row['name'], 
            "BILD" => $row['bild'], 
            "NEXT_TABLE" => $row['next_table'], 
            "PREIS" => $row['preis'], 
            "AKTIV" => $row['aktiv'] 
        )); 
        
        $arr[$inc] = $finish;
        $inc++;
        
        } 
    } 
echo json_encode($arr);

wieso klappt es beim ersten Durchlauf perfekt und beim zweiten ist ab EACH Feierabend?

Liebe Grüße, Stefan
 
AW: Ajax -&gt; php -&gt; db -&gt; php -&gt; ajax/js

Hallo,

also, aktuell habe ich 5 Datensätze in der Tabelle pcc_start:
Das erzeugte JSON sieht so aus:

Code:
[{"RESULT":"success","ID":"1","NAME":"Jutebeutel lang","BILD":"images\/start\/braun.png","NEXT_TABLE":"pcc_jutebeutel_lang","PREIS":"50.00","AKTIV":"1"},{"RESULT":"success","ID":"2","NAME":"Jutebeutel kurz","BILD":"images\/start\/schwarz.png","NEXT_TABLE":"pcc_jutebeutel_kurz","PREIS":"0.00","AKTIV":"1"},{"RESULT":"success","ID":"3","NAME":"truschi","BILD":"images\/start\/grau.png","NEXT_TABLE":"sdfghjk","PREIS":"77.00","AKTIV":"1"},{"RESULT":"success","ID":"4","NAME":"test","BILD":"images\/start\/gruen.png","NEXT_TABLE":"-","PREIS":"3.00","AKTIV":"1"},{"RESULT":"success","ID":"5","NAME":"Test 2","BILD":"-","NEXT_TABLE":"-","PREIS":"34.00","AKTIV":"1"}]

Was ich mittlerweile rausgefunden habe ist:
Die weiteren Schritte, je nach LAUFVARIABLE sprich TABLE IN DER DB funktionieren nur, wenn ich 1 oder 2 Datensätze habe. Sobald ich 3 und mehr Datensätze habe funktioniert nichts mehr und ich erhalte den Syntax-Error beim JSON-Parse.

Liebe Grüße & einen schönen Abend,
Stefan

- - - Aktualisiert - - -

Ich glaube, ich fall vom Glauben ab ...
Ich habe gerade mal einen Table komplett gelöscht und neu angelegt.
Vorher habe ich die Tables per Excel / CSV angelegt.
Jetzt habe ich es mal per PHPmyAdmin gemacht ... Lief zu 50% ...
Jetzt habe ich noch festgestellt, dass ich ein ö in der Testanlage hatte.
Dieses weggenommen und Taadaaa! Et lüppt.

Einfach mal die Augen aufsperren :)

:-D Liebe Grüße, Stefan
 
Zuletzt bearbeitet von einem Moderator:
Dort, wo du Umlaute hast, kannst du die Ausgabe mit utf8_encode() einklammern. Dann übergibt dir JSON den richtigen Wert und du kannst auch weiterhin mit Umlauten arbeiten.

Beispiel:
PHP:
"NAME" => utf8_encode($row['name']),

Gruß,
Terra
 
Jetzt habe ich noch festgestellt, dass ich ein ö in der Testanlage hatte.
Jaja... der Fluch verschiedener Encodings... und json_encode ist da besonders unpraktisch, da es einen leeren String zurückliefert, wenn irgendein String einen invaliden UTF-8 Character enthält.

Ich würde möglichst nicht mit utf8_encode() arbeiten. Die bessere Lösung ist, auf allen Ebenen deiner Anwendung mit einer einzigen Zeichenkodierung zu arbeiten. Also auch in der Datenbank mit UTF8 arbeiten.
 
Zurück
Oben