Zur Navigation

Preis per Ajax aus Datenbank ermitteln [2]

11 Peter

Hier der Aktuelle Stand:

http://www.windeko.de/ajax/post01.html
http://www.windeko.de/ajax/post.php

Das ganze noch ohne Datenbankabfrage, da noch immer der Wert für die Feld "breite" nicht zurückgegeben wird.

Hier der Code für die HTML-Datei
<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
  <head>
    <title>Test ajax</title>
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
    <script type="text/javascript" src="http.js"></script>
    <script type="text/javascript">
    
    var xhr;
    function datenEingabe(){
      window.onload = function() {
      xhr = http();
      xhr.open("POST", "post.php", true);
      xhr.onreadystatechange = datenAusgeben;
      xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      xhr.send("preis=breite");
    };
       
    function datenAusgeben() {
      if (xhr.readyState == 4) {
        var rueckgabe = xhr.responseText;
        document.getElementById("preis").innerHTML = rueckgabe;
      }
    }
   } 
    </script>
  </head>
  <body>
		<form name="garnitur">
			<p>Breite min. &nbsp;&nbsp;&nbsp;400 [mm]<br>
				Breite max. 5200 [mm]<br>
			</p>      Eingabe:<br />
      Breite in [mm]<input type="text" size="5" name="EinB" tabindex="2" onblur="anz(this.value,this.name),checkBreite(),datenEingabe()" value=''/>
<input type="text" id="breite" name="breite" size="5" value=''><br></p>

			<script type="text/javascript">
var doc = document.garnitur;

function anz(a,c){
d = c;
r = 200 //rapport
a = parseFloat(a.replace(/,/gi,'.'));
b = Math.ceil(a/r)*r/10;
if (b<=100){
     b=100;}
if (doc.EinB.getAttribute("name", 0) == d){
doc.breite.value = b;}
}
function teilung (){
var B = doc.EinB.value;
var t = B/2;
doc.teil.value = t;
}

function checkBreite(){
var B = doc.EinB.value;
 if(B < 400 || B > 5200)
    {alert("Die Breite liegt nicht zwischen 400 und 5200 mm!\n Bitte neu eingeben!");
      doc.EinB.focus();
      doc.EinB.value = "";
      return(false);
}
return true;
}

  </script>
	</form>
    
    <p id="preis">lade Daten ... </p>
  </body>
</html>


Hier der Code für die PHP-Datei
<?php
  if (isset($_POST['breite']) && is_string($_POST['breite'])) {
    echo htmlspecialchars($_POST['preis']);
  }
?>

Hier der Code für die JavaScript-Datei
function http() {
  var http;
  if (window.XMLHttpRequest) { 
    http = new XMLHttpRequest();
  } else if (window.ActiveXObject) {
    http = new ActiveXObject("Microsoft.XMLHTTP");
  }
  return http;
}

16.12.2008 22:13 | geändert: 16.12.2008 22:23

12 Jörg Kruse

Die Verschachtelung von Funktionen geht so nicht - zumal du das "window.onload" innerhalb der Funktion stehen hast, so dass es gar nicht erst zum Tragen kommt. So wär's schon sinnvoller:

    var xhr;
    window.onload = function datenEingabe(){
      xhr = http();
      xhr.open("POST", "post.php", true);
      xhr.onreadystatechange = datenAusgeben;
      xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      xhr.send("preis=breite");
    };
       
    function datenAusgeben() {
      if (xhr.readyState == 4) {
        var rueckgabe = xhr.responseText;
        document.getElementById("preis").innerHTML = rueckgabe;
      }
    }

Der Name der Variable, die du übermittelst, ist "preis", nicht "breite":

<?php
  if (isset($_POST['preis']) && is_string($_POST['preis'])) {
    echo htmlspecialchars($_POST['preis']);
  }
?>

17.12.2008 09:39

13 Peter

Habe die Fehler beseitigt. Jetzt wird auch das übertragen, was unter
xhr.send("breite=breite.value" steht.

Wie kann ich es anstellen, das jetzt auch das Ergebnis der Function "anz" übertragen wird?

Ist die Methode "POST" überhaupt richtig / sinnvoll, oder wäre hier "GET" besser / einfacher?

17.12.2008 20:56

14 Jörg Kruse

GET ist hier nicht besser als POST

Hier sendest du den String "breite.value", nicht den Inhalt der Variable:

xhr.send("breite=breite.value");

Das sollte vielleicht eher so ausschauen:

xhr.send("breite=" + document.garnitur.breite.value);

17.12.2008 22:14

15 Peter

Super Jörg es funktioniert.

Jetzt muss ich die PHP-Seite anpassen, damit dann auch der Preis für die Breite der Garnitur erhalte.

Muss ich eigendlich bei der "POST"-Methode den Datenbankzugriff beenden?

Edit: Hier die geänderte PHP-Seite
<?php
   include "connect.inc.php";
   ?>
	
  <?php
  // lokale Variablen setzen
  $vars = array("breite", "preis", "gleiter", "halter");
  foreach ($vars as $var)
$$var =  isset($_POST[$var]) ? $_POST[$var] : NULL;
   if (!isset($breite))
     $breite = '100'; 
  // Datenbankabfrage
   $sqlab= "select breite, gleiter, halter, preis from Profil100 where breite = '$breite'";
   $res = mysql_query($sqlab) OR die(mysql_error());
   $num = mysql_num_rows($res);

   if ($num==0) echo "keine passenden Datensaetze gefunden". "<br>";

   while ($dsatz = mysql_fetch_assoc($res))
   {
     
      $gleiter = $dsatz['gleiter'];
      $halter = $dsatz['halter'];  
      $preis = $dsatz['preis']; 
    echo "Garniturpreis: ";     
    echo htmlspecialchars($preis);
    echo " &euro;<br>Tr&auml;geranzahl: ";
    echo htmlspecialchars($halter);
    echo " St&uuml;ck<br>Gleiteranzahl: ";
    echo htmlspecialchars($gleiter);
    echo " St&uuml;ck<br>Preislistenbreite: ";
    echo htmlspecialchars($breite);
    echo " cm";
}
?>

17.12.2008 23:08 | geändert: 17.12.2008 23:56

16 Jörg Kruse

Muss ich eigendlich bei der "POST"-Methode den Datenbankzugriff beenden?

Im allgemeinen beendet PHP nach Abarbeitung eines Scripts alle offenen Datenbankverbindungen. Wenn man sauber programmieren möchte, kann man dies auch selber machen. Das hat aber nichts damit zu tun, ob vorher Daten über "POST" hineingekommen sind oder nicht.

18.12.2008 12:50

17 Peter

Erstmal noch ein sehr grosses DANKE für die Hilfe.

Eine andere Frage, kann ich die gelieferten Werte von "preis", "gleiter" und "halter" in Felder einfügen, damit ich diese weiter verwenden kann, oder benötige ich einen andere Anfrageart?

18.12.2008 20:55

18 Jörg Kruse

Meinst du die Ajax-Abfrage? Weitere Paramater kannst du durch ein "&" anhängen - also in etwas so:

xhr.send("breite=" + document.garnitur.breite.value + "&preis="  + document.garnitur.preis.value);

18.12.2008 22:07

19 Peter

Nein, durch die Abfrage nach der "breite" werden noch andere Werte durch die PHP-Seite zurückgegeben die vorher nicht bekann sind, da keine Breite der Garnitur vorliegt. Es sind quasi neue Werte für "gleiter", "halter" und den "preis".

Wenn jetzt der Kunde die Möglichkeit hat zwischen zwei Halter bzw. Träger zu wählen, muß der evtl. Mehrpreis mit dem Wert für "halter" multipieziert werden usw.

D.H. ich muß die Werte mit der "Rückgabe" auf die Felder verteilen.
    function datenAusgeben() {
      if (xhr.readyState == 4) {
        var rueckgabe = xhr.responseText;
        document.getElementById("P").innerHTML = rueckgabe;
      }
Ich werde es mal Versuchen, den "string" aufzuteilen.

18.12.2008 22:35

20 Peter

So habe es fast geschaft, bis auf einen kleinen Fehler, der erste Teil des "string" wird nicht getrennt bzw. in das Feld eingetragen.

Achtung neue HTML-Seite http://www.windeko.de/ajax/post02.html
und PHP-Seite http://www.windeko.de/ajax/post2.php

Hier der CODE für die HTML-Seite
<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
  <head>
    <title>Test ajax</title>
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
    <script type="text/javascript" src="http.js"></script>
    <script type="text/javascript">
    
    var xhr;
    //window.onload = 
    function datenEingabe() {
      xhr = http();
      xhr.open("POST", "post2.php", true);
      xhr.onreadystatechange = datenAusgeben;
      xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      xhr.send("breite=" + document.garnitur.breite.value);
    };
       
    function datenAusgeben() {
      if (xhr.readyState == 4) {
        var rueckgabe = xhr.responseText;
        document.getElementById("P").innerHTML = rueckgabe;
        var platzhalter= rueckgabe.split("%%");
        var Preis = platzhalter[0];
        var Halter = platzhalter[1];
        var Gleiter = platzhalter[2];
        document.garnitur.preis.value = Preis;
        document.garnitur.halter.value = Halter;
        document.garnitur.gleiter.value = Gleiter;
      }
    }
    
    </script>
  </head>
  <body>
		<form name="garnitur">
			<p>Breite min. &nbsp;&nbsp;&nbsp;400 [mm]<br>
				Breite max. 5200 [mm]<br>
        <a href="http://www.windeko.de/Profil100_all.php" target="blank">Preisliste</a>
			</p>      Eingabe:<br />
      Breite in [mm]<input type="text" size="5" name="EinB" onblur="anz(this.value,this.name),checkBreite(),datenEingabe()" value=''/>
Tab.breite&nbsp;<input type="text" id="breite" name="breite" size="5" value=''><br>
Preis&nbsp;<input type="text" name="preis" size="5" value=''><br>
Halter&nbsp;<input type="text" name="halter" size="5" value=''><br>
Gleiter&nbsp;<input type="text" name="gleiter" size="5" value=''><br>
    "string" von der Datenbank<div id="P">lade Daten ... </div>
			<script type="text/javascript">
var doc = document.garnitur;

function anz(a,c){
d = c;
r = 200 //rapport
a = parseFloat(a.replace(/,/gi,'.'));
b = Math.ceil(a/r)*r/10;
if (b<=100){
     b=100;}
if (doc.EinB.getAttribute("name", 0) == d){
doc.breite.value = b;}
}

function checkBreite(){
var B = doc.EinB.value;
 if(B < 400 || B > 5200)
    {alert("Die Breite liegt nicht zwischen 400 und 5200 mm!\n Bitte neu eingeben!");
      doc.EinB.focus();
      doc.EinB.value = "";
      return(false);
}
return true;
}

  </script>
	</form>
  </body>
</html>

CODE für die PHP-Seite
 <?php
   include "connect.inc.php";
   ?>
	
  <?php
  // lokale Variablen setzen
  $vars = array("breite", "preis", "gleiter", "halter");
  foreach ($vars as $var)
$$var =  isset($_POST[$var]) ? $_POST[$var] : NULL;
   if (!isset($breite))
     $breite = '100'; 
  // Datenbankabfrage
   $sqlab= "select breite, gleiter, halter, preis from Profil100 where breite = '$breite'";
   $res = mysql_query($sqlab) OR die(mysql_error());
   $num = mysql_num_rows($res);

   if ($num==0) echo "keine passenden Datensaetze gefunden". "<br>";

   while ($dsatz = mysql_fetch_assoc($res))
   {
     
      $gleiter = $dsatz['gleiter'];
      $halter = $dsatz['halter'];  
      $preis = $dsatz['preis']; 

     echo htmlspecialchars("$preis%%$halter%%$gleiter");

}
?>

Was habe ich übersehen?

19.12.2008 00:11 | geändert: 19.12.2008 00:28