Zur Navigation

Preis per Ajax aus Datenbank ermitteln

1 Peter

Hallo an alle,

habe versucht per ajax einen Preis aus einer Datenbank auszulesen,
leider ohne Erfolg.

Vielleich kann mir jemand helfen, danke schon mal im voraus.

Hier die Eingabeseite, nach Eingabe einer Zahl zwischen 400 und 5200, solte der richtige Preis in das zweite Feld geschrieben werden.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
    
    <meta name="keyword" content="" />
    <meta name="description" content="" />
    <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" />
    
    <script type="text/javascript">
    <!--
        var xhttp;
    
        function createXMLHttpRequest() {
           if (window.ActiveXObject) { 
                try { 
                   // IE 6 and higher
                   xhttp = new ActiveXObject("MSXML2.XMLHTTP");
                } catch (e) {
                    try {
                        // IE 5
                        xhttp = new ActiveXObject("Microsoft.XMLHTTP");
                    } catch (e) {
                        xhttp=false;
                    }
                }
            }
            else if (window.XMLHttpRequest) {
                try {
                    // Mozilla, Opera, Safari ...
                    xhttp = new XMLHttpRequest();
                } catch (e) {
                    xhttp=false;
                }
            }
        }

        function sendRequest() {
            
            if (!xhttp) {
                alert("An Error occured when trying to initialize XMLHttpRequest!");
                return; // exit
            }

            var breite = document.getElementById("breite").value;
            breite = encodeURIComponent(breite);
            xhttp.open("GET","http://www.windeko.de/shop/test002.php?breite="+breite,true);
            xhttp.onreadystatechange=sendRequest_callback;
            xhttp.send(null);

        }
        
        function sendRequest_callback() {
            alert ( xhttp.readyState);
            
            if (xhttp.readyState==4 && xhttp.status==200)
                alert ( xhttp.responseText );
        }
        
        function init() {
            createXMLHttpRequest();
        }
        window.onload=init;
    // -->
    </script>
    
    </head>
    
    
    <body>
    
        <form method="get" action="<?php echo basename(__FILE__);?>">
        
            Breite min.    400 [mm]<br />
            Breite max. 5200 [mm]<br />
            <input onkeyup="javascript:sendRequest();" type="text" id="breite" name="breite" size="20" /> Breite in [mm]<br />
            <input onkeyup="javascript:sendRequest();" type="text" id="preis" name="preis" size="20" /> Preis der Schiene<br />

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


Heir folgt die PHP-Datei
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
  <title>Profil 100</title>
  <?php
  include "connect.inc.php";
  ?>

</head>
<body>

<?php 
$output = ""; 
$preis = isset ($_GET['breite']) ? trim($_GET['breite']) : ''; 
$preis = preg_replace("~^[^a-z0-9]$~i","",$preis); 


$q = mysql_real_escape_string($breite); 
if ($result = mysql_query("select breite, preis from Profil100 where breite ='{$breite}'")) { 
    while ($line = mysql_fetch_row($result)) { 
        $output .= $line[0]; 
    } 
} 

header("Content-Type: text/plain;charset=iso-8859-1"); 
echo htmlentities($output,ENT_QUOTES,'iso-8859-1'); 
?> 
 

</body>
</html>


Was habe vergessen bzw. falsch gemacht?

Viele Grüße
Peter

Edit: hier der Link zur Seitehttp://www.windeko.de/shop/ajaxtest.html

11.12.2008 23:23 | geändert: 12.12.2008 01:10

2 Jörg

Hallo Peter,

das HTML-Gerüst in der PHP-Datei ist überflüssig - das Script erwartet ja nur eine Textdatei mit der entsprechenden Ausgabe als Antwort

12.12.2008 09:53

3 Peter

Hallo Jörg,
Danke für die Antwort.

Es ist immer noch der Wurm drin.

Ich muß noch mal von Vorne anfangen.

Es soll, wenn die "Breite" eingetragen ist und das Feld verlassen wird (habe "onkeyup" schon gegen "onblur"getauscht) der Preis für die Breite der Schiene im Feld "Preis" erscheinen.

Ich denke, ich muß noch Hausaufgabe in der Sache machen.

Viele Grüße
Peter

12.12.2008 17:58

4 Peter

So habe jetzt zwei neue Seiten erstellt:

einmal http://www.windeko.de/shop/profil_eingabe.html
und http://www.windeko.de/shop/profil_ausgabe.php desweiteren ist noch folgende Datei wichtig http://www.windeko.de/shop/http.js

Leide funktioniert die "automatisch" Preisausgabe nicht, wenn für die Breite ein Wert eingegeben wurde.

Hier der Code für die Html-Seite:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html>

	<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Flachschleuderschiene Profil 100</title>
    <script type="text/javascript" src="http.js"></script>
    <script type="text/javascript">
    var xhr;
    window.onload = function() {
      xhr = http();
      xhr.open("POST", "profil_ausgabe.php", true);
      xhr.onreadystatechange = datenAusgeben;
      xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      xhr.send("preis" };
    
    function datenAusgeben() {
      if (xhr.readyState == 4) {
        var rueckgabe = xhr.responseText;
        document.getElementById("preis").innerHTML = rueckgabe;
      }
    }
    
    </script>
<script type="text/javascript"> 
<!-- 
var retab=0; 
document.onkeydown=function(e){ 
txt=document.garnitur; 
if(!e)e=window.event; 
code=(e.keyCode)?e.keyCode:e.which; 
el=(e.srcElement)?e.srcElement:e.target; 
if(el.tabIndex){ 
tab=Number(el.tabIndex); 
} 
if(code==13){ 
if(tab==txt.length-1){ 
alert('Bitte Tab statt Enter'); 
} 
else{ 
for (var i=0;i<txt.length;i++){ 
if(Number(txt[i].tabIndex)==(tab+1)){ 
txt[i].focus(); 
} 
} 
} 
retab=1 
return false; 
} 
else retab=0; 
} 
//--> 
</script>


</head>

<b><font size="+2">Profil 100   1-Lauf [Gleiter]</font></b>
		<form name="garnitur" action="profil_ausgabe.php" method="post" onsubmit="if(retab==1)return false;">
			<p>Breite min. &nbsp;&nbsp;&nbsp;400 [mm]<br>
				Breite max. 5200 [mm]<br>
			</p>
			<p><input type="hidden" name="sender" value="profil-ausgabe.php"> Breite in [mm]<input type="text" size="5" name="EinB" tabindex="2" onblur="anz(this.value,this.name),teilung(),checkBreite()" value=''/><input type="hidden" name="breite" size="5" value='' readonly><br></p>

      <p><input type="text" id="preis" name="preis" value="Preis noch nicht ermittelt ..."  </p>
			<p>&nbsp;Teilung der Garnitur, ab 2600 [mm] L&auml;nge, bei <input type="text" size="3" name="EinT" tabindex="3" value=''/>[mm] oder mittig wenn Sie <u>nichts</u> angeben, bei <input type="text" size="3" name="teil" readonly tabindex="4" onblur="checkTeil()" value=''/>[mm]</p>
			<p><input type="submit" value="Grundpreis berechnen" tabindex="4" onmousedown="retab=0;"><br>
				
			
			<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;
}

function checkTeil(){
var T = doc.EinT.value;
var B = doc.EinB.value;
var R = B-T;

if (T == "")
{
return true;
}
else if (R < 0 || R > 2601)
    { alert("Die Teilnung ist nicht kleiner 2600 [mm]!\nBitte neu eingeben!\nWenn Sie nichts eintragen, wird der Transportschnitt mittig gesetzt!");
      doc.EinT.focus();
      doc.EinT.value = "";
      return(false);       
}
return true;
}

  </script>
			
		</form>

	</body>

</html> 


Hier der Code für die PHP-Seite:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html>

	<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Flachschleuderschiene Profil 100</title>

 <?php
   include "connect.inc.php";
   ?>
</head>

		<?php
  // lokale Variablen setzen
  $vars = array("breite");
  foreach ($vars as $var)
$$var =  isset($_POST[$var]) ? $_POST[$var] : NULL;

  // 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 Datensätze gefunden". "<br>";

   while ($dsatz = mysql_fetch_assoc($res))
   {
      $gleiter = $dsatz['gleiter'];
      $halter = $dsatz['halter'];  
      $preis = $dsatz['preis']; 
         }      
?>
<?php
  if (isset($_POST['preis']) && is_string($_POST['preis'])) {
    echo htmlspecialchars($_POST['preis']);
  }
?>
// Ab hier nur als Kontrolle, wird sp&auml;ter gel&ouml;scht !

<?php
      echo $breite;
?>
<hr>

<?php
      echo $preis;
?>
<hr>
<?php     
      echo $halter; 
?>
<hr>
<?php      
      echo $gleiter;
?>
<hr>
<p><?php
echo "Der Grundpreis der Garnitur betr&auml;gt : " . $preis . " &euro; <br>"; 
 echo "Es sind " . $halter . " Clips und " . $gleiter . " Gleiter, sowie 2 Endkappen, 1 Zwischenfeststeller und 1 Endfeststeller enthalten.";?></p>
	</body>

</html> 
Kann mir jemand helfen? Danke schon mal im voraus

Viele Grüße
Peter

14.12.2008 16:47 | geändert: 14.12.2008 16:47

5 Jörg

Ich weiß nicht, ob der Fhler damit zusammenhängt - aber der input Tag ist nicht geschlossen:

<p><input type="text" id="preis" name="preis" value="Preis noch nicht ermittelt ..."  </p>

14.12.2008 18:21

6 Peter

Hallo Jörg,

habe den Input-Tag geschlossen, leider war das nicht der Fehler.

Wenn ich den Botton "Grundpreis berechnen" drücke, wird die PHP-Datei geladen, merkwürdigerweise wird hier auch der Wert von Feld "preis" (Preis noch nicht ermittelt ... ).

Wie kann ich den Wert des Feldes "breite" an "POST" mit anhängen?

Obwohl der Wert muß richtig übergeben werden, da auch der richtige Wert und Preis für die Breite auf der PHP-Seite ausgegeben wird.

14.12.2008 18:50

7 Jörg

Wenn ich den Botton "Grundpreis berechnen" drücke, wird die PHP-Datei geladen, merkwürdigerweise wird hier auch der Wert von Feld "preis" (Preis noch nicht ermittelt ... ).

Den Satz habe ich nicht verstanden?

Wie kann ich den Wert des Feldes "breite" an "POST" mit anhängen?

Meinst du dieses Feld:

<input type="hidden" id="breite" name="breite" size="5" value='' readonly>

Das überträgt einen leeren String, der wegen "readonly" nicht geändert werden kann. Falls ein Script erfolglos versucht, den Wert zu überschreiben, soltest du das "readonly" herausnehmen.

15.12.2008 07:30 | geändert: 15.12.2008 07:36

8 Peter

zu 1.)

Normal soll sich der Preis ja automatisch berechnen, wenn eine Breite eingetragen wird, ohne, dass die Seite neu geladen wird. Zur Probe habe ich noch den Button gelassen. Wenn mann diesen drück, wird die PHP-Seite geladen,
als Beispiel:
Preis noch nicht ermittelt ...   140
--------------------------------------------------------------------------------
 20.00
--------------------------------------------------------------------------------
 4
--------------------------------------------------------------------------------
 18
--------------------------------------------------------------------------------
 
Der Grundpreis der Garnitur beträgt : 20.00 € 
Es sind 4 Clips und 18 Gleiter, sowie 2 Endkappen, 1 Zwischenfeststeller und 1 Endfeststeller enthalten.

Der Vorgabewert aus dem Feld "preis" = "Preis noch nicht ermittelt ..." dürfte eigendlich garnicht mit versendet werden.

Zu 2)

Werde ich nacher ändern.

15.12.2008 16:45

9 Jörg

Ich blick durch deinen Code noch nicht so ganz durch, was auch damit zusammenhängt, dass der oben angegebene Code nicht mit dem Quelltext der verlinkten Seite übereinstimmt.

xhr.send("preis" };

xhr.send("breite" };

In beiden Fällen fehlt hier übrigens eine runde Klammer - die geschweifte Klammer schließt wohl die Funktion datenAusgeben() ab

16.12.2008 09:19

10 Peter

Sorry, habe den Code nicht aktullesiert. Werde gleich noch weiter machen und den aktuellen Code und Seiten posten.
Das mit der fehlenden Klammer hatte keinen wirklichen Einfluß auf die funktionalität, auch mit der Klammer läuft es nicht.

16.12.2008 21:56 | geändert: 16.12.2008 21:57