Variable aus javascript an php übergeben


0k63

Grünschnabel
#1
Hallo

Ich möchte eine ganz gewöhnliche javascript-Variable an php übergeben, um sie dort via Mail versenden zu können. Leider kommt der Variableninhalt nicht im php an. Was mache ich falsch.

Der javascript-Code sieht folgendermassen aus:

<script>
var anzaufgaben;
var anzrichtig;
var minuten;
var sekunden;
var test;

anzaufgaben = localStorage.getItem ("AnzahlAufgaben");
document.getElementById("anzaufgaben").innerHTML = "Gelöste Aufgaben: " + anzaufgaben;

anzrichtig = localStorage.getItem ("AnzahlRichtig");
document.getElementById("richtig").innerHTML = "Davon richtig: " + anzrichtig;

minuten = localStorage.getItem ("Minuten");
sekunden = localStorage.getItem ("Sekunden");
document.getElementById("zeit").innerHTML = "Zeit: " + minuten + ":" + sekunden + " min";

var ergebnis = anzaufgaben + anzrichtig + minuten + sekunden;

var request = new XMLHttpRequest();
request.open("POST", "einmaleinsdiplomMail.php", true);
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.send(ergebnis);

request.onreadystatechange = function()
{
if (this.readyState == 4 && this.status == 200)
{ergebnis = this.responseText;}
};
</script>

Der php-Code sieht so aus:

<?php
$ergebnis = $_POST["ergebnis"];

/* Hier wird das Mail mit der Variable $ergebnis verschickt. */

echo $ergebnis;
?>

Das mit dem Mail hat übrigens bereits funktioniert, aber leider ist die Variable $ergebnis immer leer.

Für eure Hilfe bin ich sehr dankbar.
 

Sempervivum

Erfahrenes Mitglied
#2
Kommt mir bekannt vor. Hast Du das früher schon mal irgend wo gepostet?
Für Ajax empfehle ich jQuery zu verwenden, dann ist alles, auch die Parameterübergabe, viel einfacher.
 
#3
Du musst ihm auch sagen das du die Werte in die Variable ergebnis speichern willst.

Code:
<script>
var anzaufgaben;
var anzrichtig;
var minuten;
var sekunden;
var test;

anzaufgaben = localStorage.getItem ("AnzahlAufgaben");
document.getElementById("anzaufgaben").innerHTML = "Gelöste Aufgaben: " + anzaufgaben;

anzrichtig = localStorage.getItem ("AnzahlRichtig");
document.getElementById("richtig").innerHTML = "Davon richtig: " + anzrichtig;

minuten = localStorage.getItem ("Minuten");
sekunden = localStorage.getItem ("Sekunden");
document.getElementById("zeit").innerHTML = "Zeit: " + minuten + ":" + sekunden + " min";

var ergebnis = "ergbnis=" + anzaufgaben + anzrichtig + minuten + sekunden;

var request = new XMLHttpRequest();
request.open("POST", "test1.php", true);
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.send(ergebnis);

request.onreadystatechange = function(){
    if (this.readyState == 4 && this.status == 200){
        ergebnis = this.responseText;
        console.log(ergebnis); 
    }
};
</script>
var ergebnis = "ergbnis=" + anzaufgaben + anzrichtig + minuten + sekunden;

Diese Zeile ist dies.
Dann habe ich noch eben ein console.log eingebaut, damit du siehst, das er ein Ergebnis zurück gibt.
 

0k63

Grünschnabel
#4
Hallo Heiko

Danke für deine Antwort. Das mit der Variable ergebnis habe ich bereits mit einem alert getestet. Funktioniert wunderbar. Das Problem ist, dass die Daten nicht im php-Teil sind. Das php-Skript wird aufgerufen und die mail-Funktion klappt ebenfalls. Aber die Variable $ergebnis ist leider immer leer.
 

Sempervivum

Erfahrenes Mitglied
#5
Schreibfehler?
Code:
var ergebnis = "ergbnis="
Code:
$ergebnis = $_POST["ergebnis"];
Dies funktioniert bei mir:
Code:
        var data = "anzaufgaben=" + anzaufgaben + "&anzrichtig=" + anzrichtig + "&minuten=" + minuten + "&sekunden=" + sekunden;
        var xhr = new XMLHttpRequest();
        var url = "testpost.php";
        xhr.open("POST", url, true);
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
                console.log(xhr.responseText);
            }
        };

        xhr.send(data);
testpost.php:
Code:
<?php
        foreach ($_POST as $key => $value) {
            echo $key . ": " . $value . " ";
       }
?>
Ergebnis:
anzaufgaben: 5 anzrichtig: 3 minuten: 5 sekunden: 30
 

0k63

Grünschnabel
#6
Hallo Sempervivum

Danke für deine Antwort. Mit deiner Hilfe scheint's voranzugehen. Jetzt habe ich in der Konsole das gleiche Ergebnis, wie du es oben beschrieben hast. Aber der echo-Befehl in der php-Datei macht gar nichts. Jedenfalls erscheint nichts auf dem Bildschirm. Wie erhalte ich die Werte im php-File, damit ich dort z.B. ein Mail mit dem Inhalt verschicken kann?
 

Sempervivum

Erfahrenes Mitglied
#7
Aber der echo-Befehl in der php-Datei macht gar nichts. Jedenfalls erscheint nichts auf dem Bildschirm.
Das ist deshalb der Fall, weil die Seite nicht direkt im Browser aufgerufen wird, sondern durch Ajax. Alles was in testpost.php mit echo oder sonst wie ausgegeben wird, steht in der Variablen xhr.responseText zur Verfügung und Du musst selber dafür sorgen, dass es auf dem Bildschirm ausgegeben wird. Z. B. so:
Code:
    <div id="ausgabe1"></div>
    <script>
        var anzaufgaben = 5,
            anzrichtig = 3,
            minuten = 5,
            sekunden = 30;
        var data = "anzaufgaben=" + anzaufgaben + "&anzrichtig=" + anzrichtig + "&minuten=" + minuten + "&sekunden=" + sekunden;
        var xhr = new XMLHttpRequest();
        var url = "testpost.php";
        xhr.open("POST", url, true);
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
                console.log(xhr.responseText);
                ausgabe1.innerHTML = xhr.responseText;
            }
        };

        xhr.send(data);
    </script>
 

0k63

Grünschnabel
#8
Vielen Dank, aber irgendwie scheine ich da was nicht zu kapieren. Ich brauche ja den responseText gar nicht, weil ich die Variablen schon in javascript habe. Was ich will, ist die Übergabe an php, damit ich dort ein Mail verschicken kann. Den echo-Befehl hatte ich nur drin, um mir den Inhalt der Variablen anschauen zu können, was aber eben auch nicht geklappt hat.

<?php
$ergebnis = $_POST["ergebnis"];

mail ("test@gmail.com", "Test", $ergebnis , "From: test@gmail.com");
?>

Das Mail kommt auch tatsächlich an, aber im $ergebnis ist eben nichts drin. Das Mail ist "leer". Das ist die Krux, die mich zum Verzweifeln bringt ;-)
 

Sempervivum

Erfahrenes Mitglied
#9
Wenn Du meinen Code verwendet hast, gibt es die POST-Variable $_POST["ergebnis"] auch nicht, sondern statt dessen:
$_POST["anzaufgaben"], $_POST["anzrichtig"], $_POST["minuten"], $_POST["sekunden"]
Daraus musst Du deinen Text zusammen bauen, etwa so:
Code:
$ergebnis = 'Anzahl Aufgaben: ' . $_POST["anzaufgaben"] . ' davon richtig: ' . $_POST["anzrichtig"] . ' ' . $_POST["minuten"] . ' Minuten ' . $_POST["sekunden"] . ' Sekunden.';
Natürlich kannst Du den kompletten Text auch clientseitig aufbauen und mit nur einer POST-Variablen an send() übergeben.
 
#11
Hallo Profis,
habe versucht das Script von Sempervivum nach meinen ervordernissen anzupassen, leider ohne Erfolg.
Der obere Teil funktioniert.
Mein angepasstest Script:
Code:
<script type="text/javascript">
            <!--
            var sBestellSumme = new cSMPrice();
            sBestellSumme.decode(SMShop.basket.getAttribute(_SMAFinalSum));
            var sBestelldaten = ''
              + 'Firma: ' + SMShop.getFormValue("BILLTO", "BILLTO_COMPANY") + '<br>'
                + 'Titel: ' + SMShop.getFormValue("BILLTO", "BILLTO_TITLE") + '<br>'
                + 'Email: ' + SMShop.getFormValue("BILLTO", "BILLTO_EMAIL") + '<br>'
                + 'Vorname: ' + SMShop.getFormValue("BILLTO", "BILLTO_FIRSTNAME") +
'<br>'
                + 'Nachname: ' + SMShop.getFormValue("BILLTO", "BILLTO_LASTNAME") +
'<br>'
                + 'Strasse:  ' + SMShop.getFormValue("BILLTO", "BILLTO_STREET_1") +
'<br>'
                + 'PLZ: ' + SMShop.getFormValue("BILLTO", "BILLTO_POSTCODE") + '<br>'
                + 'Stadt: ' + SMShop.getFormValue("BILLTO", "BILLTO_CITY") + '<br>'
                + 'Land: ' + SMShop.getFormValue("BILLTO", "BILLTO_COUNTRY") + '<br>'
                + 'Telefon: ' + SMShop.getFormValue("BILLTO", "BILLTO_PHONE_NUMBER") +
'<br>'
                + 'Fax: ' + SMShop.getFormValue("BILLTO", "BILLTO_FAX_NUMBER") + '<br>'
                + 'Summe: ' + cprimary.format(sBestellSumme.gross, SM_CNOFORMAT) +
'<br>'
                + 'Bestellnummer: ' + SMShop.getAttribute(_SMAMailOrderID) + '<br>';
                document.write(sBestelldaten);
                //-->
            </script>
           
                <script>

        var data = "firma=" + SMShop.getFormValue("BILLTO", "BILLTO_COMPANY") + "&nachname=" + SMShop.getFormValue("BILLTO", "BILLTO_LASTNAME");
        var xhr = new XMLHttpRequest();
        var url = "brokerdatei/testpost.php";
        xhr.open("POST", url, true);
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
                console.log(xhr.responseText);
                ausgabe1.innerHTML = xhr.responseText;
            }
        };
        xhr.send(data);
    </script>
   
   


<?PHP
echo 'includierte testpost.php<br>';
include $_SERVER['DOCUMENT_ROOT']."/brokerdatei/testpost.php";
?>
So sieht die testpost.php aus:
Code:
<?php

        foreach ($_POST as $key => $value) {
            echo $key . ": " . $value . " ";
       }

echo 'Firma: ' . $_POST["firma"] . '<br>' . 'Nachname: ' . $_POST["nachname"];
?>
Was mache ich falsch?
Besten Dank im voraus
Gruss André
 

Sempervivum

Erfahrenes Mitglied
#12
Mögliche Gründe, warum es nicht funktioniert:
Du includierst am Ende die Datei testpost.php. Dort sind aber die POST-Variablen nicht gesetzt, d. h. das Skript wird hier keine Ausgabe liefern. Gesetzt werden sie beim Ajax-Request und Du bekommst die Ausgabe des Skripts in dessen Callback, hier:
Code:
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
                console.log(xhr.responseText);
                ausgabe1.innerHTML = xhr.responseText;
            }
        };
Die Ausgabe steht in xhr.responseText und sie wird in das HTML-Element ausgabe1 eingetragen. Hast Du dieses Element überhaupt definiert?
 

Sempervivum

Erfahrenes Mitglied
#14
HTML:
Code:
<span id="ausgabe1"></span>
dort einfügen, wo die Ausgabe angezeigt werden soll. Und das Javascript so ändern:
Code:
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
                console.log(xhr.responseText);
                document.getElementById("ausgabe1").innerHTML = xhr.responseText;
            }
        };
 
#15
Hallo,
so sieht das Script jetzt aus, eine Ausgabe erfolgt nicht.
Brauche ich das include?
Code:
<script type="text/javascript">
            <!--
            var sBestellSumme = new cSMPrice();
            sBestellSumme.decode(SMShop.basket.getAttribute(_SMAFinalSum));
            var sBestelldaten = ''
              + 'Firma: ' + SMShop.getFormValue("BILLTO", "BILLTO_COMPANY") + '<br>'
                + 'Titel: ' + SMShop.getFormValue("BILLTO", "BILLTO_TITLE") + '<br>'
                + 'Email: ' + SMShop.getFormValue("BILLTO", "BILLTO_EMAIL") + '<br>'
                + 'Vorname: ' + SMShop.getFormValue("BILLTO", "BILLTO_FIRSTNAME") +
'<br>'
                + 'Nachname: ' + SMShop.getFormValue("BILLTO", "BILLTO_LASTNAME") +
'<br>'
                + 'Strasse:  ' + SMShop.getFormValue("BILLTO", "BILLTO_STREET_1") +
'<br>'
                + 'PLZ: ' + SMShop.getFormValue("BILLTO", "BILLTO_POSTCODE") + '<br>'
                + 'Stadt: ' + SMShop.getFormValue("BILLTO", "BILLTO_CITY") + '<br>'
                + 'Land: ' + SMShop.getFormValue("BILLTO", "BILLTO_COUNTRY") + '<br>'
                + 'Telefon: ' + SMShop.getFormValue("BILLTO", "BILLTO_PHONE_NUMBER") +
'<br>'
                + 'Fax: ' + SMShop.getFormValue("BILLTO", "BILLTO_FAX_NUMBER") + '<br>'
                + 'Summe: ' + cprimary.format(sBestellSumme.gross, SM_CNOFORMAT) +
'<br>'
                + 'Bestellnummer: ' + SMShop.getAttribute(_SMAMailOrderID) + '<br>';
                document.write(sBestelldaten);
                //-->
            </script>
           
                <script>

        var data = "firma=" + SMShop.getFormValue("BILLTO", "BILLTO_COMPANY") + "&nachname=" + SMShop.getFormValue("BILLTO", "BILLTO_LASTNAME");
        var xhr = new XMLHttpRequest();
        var url = "brokerdatei/testpost.php";
        xhr.open("POST", url, true);
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
               xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
                console.log(xhr.responseText);
                document.getElementById("ausgabe1").innerHTML = xhr.responseText;
            }
        };
        xhr.send(data);
    </script>
   
   


<span id="ausgabe1"></span>
 
Zuletzt bearbeitet:

Sempervivum

Erfahrenes Mitglied
#16
Stelle die Definition von #ausgabe1 vor das Skript. Du hast zwar eingestellt, dass es asynchron arbeitet, aber wenn Du lokal testest, kann die Antwort eintreffen, bevor das Element definiert ist.
 
#18
Wie komme ich jetzt per PHP an die Daten?
Es kommt keine Ausgabe

Code:
<script type="text/javascript">
            <!--
            var sBestellSumme = new cSMPrice();
            sBestellSumme.decode(SMShop.basket.getAttribute(_SMAFinalSum));
            var sBestelldaten = ''
              + 'Firma: ' + SMShop.getFormValue("BILLTO", "BILLTO_COMPANY") + '<br>'
                + 'Titel: ' + SMShop.getFormValue("BILLTO", "BILLTO_TITLE") + '<br>'
                + 'Email: ' + SMShop.getFormValue("BILLTO", "BILLTO_EMAIL") + '<br>'
                + 'Vorname: ' + SMShop.getFormValue("BILLTO", "BILLTO_FIRSTNAME") +
'<br>'
                + 'Nachname: ' + SMShop.getFormValue("BILLTO", "BILLTO_LASTNAME") +
'<br>'
                + 'Strasse:  ' + SMShop.getFormValue("BILLTO", "BILLTO_STREET_1") +
'<br>'
                + 'PLZ: ' + SMShop.getFormValue("BILLTO", "BILLTO_POSTCODE") + '<br>'
                + 'Stadt: ' + SMShop.getFormValue("BILLTO", "BILLTO_CITY") + '<br>'
                + 'Land: ' + SMShop.getFormValue("BILLTO", "BILLTO_COUNTRY") + '<br>'
                + 'Telefon: ' + SMShop.getFormValue("BILLTO", "BILLTO_PHONE_NUMBER") +
'<br>'
                + 'Fax: ' + SMShop.getFormValue("BILLTO", "BILLTO_FAX_NUMBER") + '<br>'
                + 'Summe: ' + cprimary.format(sBestellSumme.gross, SM_CNOFORMAT) +
'<br>'
                + 'Bestellnummer: ' + SMShop.getAttribute(_SMAMailOrderID) + '<br>';
                document.write(sBestelldaten);
                //-->
            </script>
    <span id="ausgabe1"></span>       
                <script>

        var data = "firma=" + SMShop.getFormValue("BILLTO", "BILLTO_COMPANY") + "&nachname=" + SMShop.getFormValue("BILLTO", "BILLTO_LASTNAME");
        var xhr = new XMLHttpRequest();
        var url = "brokerdatei/testpost.php";
        xhr.open("POST", url, true);
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
               xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
                console.log(xhr.responseText);
                document.getElementById("ausgabe1").innerHTML = xhr.responseText;
            }
        };
        xhr.send(data);
    </script>
 

Sempervivum

Erfahrenes Mitglied
#19
Wie komme ich jetzt per PHP an die Daten?
Kurz zusammen gefasst: Mit Ajax rufst Du dein PHP-Skript auf dem Server auf und übergibst ihm die Parameter:
Code:
xhr.send(data);
Ist das Skript fertig, so triggert das Event onreadystatechange und die Funktion dort wird aufgerufen; die Ausgabe des Skripts steht dann in xhr.responseText zur Verfügung:
Code:
    xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
                console.log(xhr.responseText);
                document.getElementById("ausgabe1").innerHTML = xhr.responseText;
            }
        }
Ajax und PHP brauchen jedoch einen Webserver. Ich vermute, dass Du lokal testet und diesen nicht hast. Lade beides hoch auf deinen Webspace und schau ob es dann funktioniert.