# jQuery (ajax) + php Datenbankeintrag/auslesen



## sonicks (3. März 2010)

Hallo

Ich habe erst ein mal eine allgemeine Verständnisfrage an die Leute die sich mit den Ajax Funktionen im jQuery Framework auskennen.

Beispiel Twitter:

Ich schreibe einen Text in das Formular und das ganze wird direkt und ohne Seitenreload unten an die bisher ausgelesenen "Tweets" angereiht. Das ganze läuft über eine MySQL Datenbank

So, jetzt zum Verständnis:

Ich hab also das Formular und den jQuery Code allá:


```
# $.ajax({  
#   type: "POST",  
#   url: "ausführen.php",  
#   data: dataString,  
#   success: function() { 
....
```

Was mache ich dann in der ausführen.php ? Ich INSERT die Daten in die DB und SELECT im nächsten Schritt in der selben Datei wieder alle Daten neu (?). Dann krieg ich durch den jQuery Request die Daten wieder zurück und möchte das Ganze dann wie man es normal macht mit einer for Schleife (?) ausgeben an der Stelle damit es so aussieht, als würde nur der neuste Eintrag hinzugefügt werden.

Ich hoffe ihr könnt nachvoll ziehen, was ich an diesem Vorgang noch nicht so ganz verstehe und wäre dann über Anregungen oder ein paar Codeschnipsel sehr dankbar!

MfG


----------



## Sven Mintel (3. März 2010)

Moin,



> Ich INSERT die Daten in die DB und SELECT im nächsten Schritt in der selben Datei wieder alle Daten neu (?).



Jo, soweit korrekt.
Die neu selektierten Daten musst du dann in irgendeiner Form in der ausführen.php ausgeben, diese Ausgabe wird dann an die success-Funktion übermittelt.

Wie du es machst, da gibt es mehrere Möglichkeiten.

Es kann zum Beispiel ein HTML-Codefragment sein, den du direkt im Dokument an der gewünschten Stelle einfügst, aber auch ein JSON-codierter String, den du dann erst noch verarbeitest(vorteilhafter bei umfangreichen Daten).


----------



## sonicks (3. März 2010)

Ok d.h. ich bau in der PHP Datei alles ein sowie eine Ausgabe ungefähr so:


```
while($data = mysql_fetch_array(..)){
      $return_data = "<div>".$data['name']."</div><br />
                      <div>".$data['text']."</div>";
}
```

Und kann dann per jQuery die $return_data ausgeben? Geht das bei jQuery auch über das "success" ?


----------



## sonicks (7. März 2010)

Hallo, ich nochmal.

Ich habe jetzt etwas rumprobiert und bin zu einem ganz akzeptablen Ergebnis gekommen. Hier der Code:


```
<html>
  <head>
      
    <script type="text/javascript" src="js/jquery-1.4.2.min.js"></script>    

  </head>

  <body>

  <div id="content">
  	<h2>Kommentare:</h2>
    <div class="kommentar"></div>
  </div>

  <div id="formular">
      <form method="" action="">
        <label for="name">Name:</label><input type="text" name="name" id="name" /><br clear="both" />
        <label for="email">E-Mail:</label><input type="text" name="email" id="email" /><br clear="both" />
        <label for="text">Text:</label><textarea name="text" id="text"></textarea><br clear="both" />
        <label for="submit"></label><input type="submit" name="submit" id="submit" value="Senden" /><br clear="both" />
      </form>
  </div>

<script type="text/javascript">
	$(function() {
		$('.kommentar').load('includes/process.php');
		$("#submit").click(function() {
			
			// Loading GIF im Div Containter "Kommentar" anzeigen
			$('.kommentar').append('<img src="images/ajax-loader.gif" alt="loading..." id="loading" />');
			
			var name = $('#name').val();
			var email = $('#email').val();
			var text = $('#text').val();
			
			$.ajax({
			   type: 'POST',
			   url: 'includes/process.php',
			   data: 'name=' + name + '&email=' + email + '&text=' + text,
			   
			   success: function(response){
				 $('#response').remove();  
				 $('.kommentar').append('<div id="response">' + response + '</div>');
				 $('#loading').fadeOut(500, function() {
					$(this).remove();								 
					});
			   }
			   
			});
			return false;     
			});
			
	});
</script>

  </body>
</html>
```


```
<?php
	
	$db_host = "localhost";
	$db_user = "root";
	$db_passwort = "";
	$db_name = "jquery";
	
	$db = mysql_connect($db_host, $db_user, $db_passwort);
		if(!$db) {
			header("Location: db_error.php");
		}
	mysql_select_db($db_name);
	
	if(isset($_POST["name"])){
		$sql_insert = 'INSERT INTO test SET
							name = "'.$_POST["name"].'",
							email = "'.$_POST["email"].'",
							text = "'.$_POST["text"].'"
							';
		$result_insert = mysql_query($sql_insert);
	}
	
	$sql = "SELECT * FROM test";
	$result = mysql_query($sql);
	
	while($data = mysql_fetch_array($result)){
	
		echo '<div style="border: 1px solid #000000;">'.$data["name"].'</div><br />
			  <div style="border: 1px solid #000000; margin-bottom: 60px;">'.$data["text"].'</div>';
		
	}



?>
```

Das Problem ist jetzt folgendes:

Ich hol mir per

```
$('.kommentar').load('includes/process.php');
```
die bisher bestehenden Einträge aus der Datenbank. Also bevor man irgendeine Aktion auf der Seite startet.
Das Problem jetzt ist dass bei einem Eintrag über das Formular, die gesamten Einträge nochmal geholt werden + dem neuen. D.h. die bisher bestehenden werden zwei mal angezeigt.

Weiß dazu jemand eine sinnvolle Lösung?
Und was gibt es für Möglichkeiten die bestehenden Einträge auch schon anzeigen zu lassen wenn JS deaktiviert ist.

Danke

MfG


----------



## rd4eva (7. März 2010)

> D.h. die bisher bestehenden werden zwei mal angezeigt.



Eine Möglichkeit wäre ganz einfach nicht alle zu "Selecten" sondern nur jeweils den letzten Eintrag und diesen ganz einfach an die ja eh schon bestehenden anzuhängen.



> Und was gibt es für Möglichkeiten die bestehenden Einträge auch schon anzeigen zu lassen wenn JS deaktiviert ist.


Du bist doch beim ersten Anzeigen garnicht auf JavaScript angewiesen. Beim ersten Aufruf der Seite kannst du alle bisher bestehenden Einträge per PHP ausgeben lassen.


----------



## sonicks (7. März 2010)

Hallo,

Danke für die Antwort! Ich hab jetzt die Inhalte per PHP von Anfang an ausgeben lassen und eine extra PHP Datei für den Eintrag & Selektieren des letzten Eintrages. Dieser wird dann genauso wie im letzten Post beschrieben an die bestehenden angehängt.
Soweit, so gut!
Funktioniert auch einwandfrei.

Nur wenn ich einen Eintrag schreibe, dieser wird angehängt, und gleich nochmal einen schreibe, dann wird der vorletzte nicht mehr angezeigt sondern nur der letzte. Jetzt stellt sich für mich die Frage wie und ob ich das lösen soll. Das ganze soll später mal auf eine Kommetarfunktion von einem Blogeintrag angewandt werden. Da kommt es ja in der Regel nicht vor, dass man zwei Kommentare direkt hintereinander schreibt ohne die Seite zu refreshen. D.h. ich könnte evtl. eine Cookie Eintragsperre für eine Minute o.ä. erstellen oder das Problem einfach ignorieren und hoffen, dass niemand zweimal hintereinander einen Kommentar schreibt.

Weiß jemand wie man das in der Regel löst? 

Danke 

Grüße


----------

