2017-09-06 1 views
0

Ich habe ein Formular, das Formular hat Textfelder und eine Leinwand, die als Signature Pad Preforms.XMLHttpRequest Aktion nach Erfolg

link to the form

Ich benutze ajax, um das Formular zu senden. Was ich habe Probleme, ist zu bestätigen, dass das Formular in die Datenbank eingefügt wird.

Ich denke, dass es eine Kollision zwischen dem Ajax und dem PHP gibt, den ich benutze, um die Formulardaten in die mysql db einzufügen, wie kann ich es tun?

Dies ist der Inhalt der js

Datei
   var fd = new FormData(document.forms["form1"]); 

       var xhr = new XMLHttpRequest(); 
       xhr.open('POST', 'upload_data.php', true); 

       xhr.upload.onprogress = function(e) { 

        if (e.lengthComputable) { 
         var percentComplete = (e.loaded/e.total) * 100; 
         alert(percentComplete + '% uploaded'); 
        } 
       }; 


       xhr.onload = function() { 
       }; 


       xhr.send(fd); 

Dies ist der Inhalt der upload_data.php Datei:

<?php 

    require 'inc/inc.php'; 

    $upload_dir = "upload/"; 
    $img = $_POST['hidden_data']; 
    $idNo = $_POST['idno']; 
    $name = $_POST['fname']; 
    $img = str_replace('data:image/png;base64,', '', $img); 
    $img = str_replace(' ', '+', $img); 
    $data = base64_decode($img); 
    $file = $upload_dir . mktime() ."-" . $idNo . ".png"; 
    $success = file_put_contents($file, $data); 
    print $success ? $file : 'Unable to save the file.'; 


    $suc = new Form; 
    $suc->insert_data($name, $file, $idNo); 
    ?> 

Dies ist die insert_data() PHP-Funktion Inhalt

public function insert_data($name, $file, $idNo){ 
      $query = $this->dbh->prepare("INSERT INTO signitures (name, file, idno) VALUES(?, ?, ?)"); 
      $query->bindparam(1, $name); 
      $query->bindparam(2, $file); 
      $query->bindparam(3, $idNo); 



      try { 

      $query->execute(); 
       if ($query) { 
        echo "success!! "; 
       } else { 
        echo "Failure conncting db!"; 
       } 
      } 
      catch (PDOException $e) { 
       die($e->getMessage()); 
      } 
     } 

I wissen, dass wenn $query->execute();zurückgibtals die Daten eingefügt wurden. Wie kann ich den Benutzer darüber informieren, dass die Daten wirklich in die Datenbank eingefügt wurden? Selbst übergeben Sie den Benutzer auf eine neue Seite ist eine Option. Aktual, umleiten Sie den Benutzer auf eine neue Seite wird großartig!

+0

Mögliche Duplikat [wie Sie herausfinden, ob XMLHttpRequest.send() gearbeitet] (https://stackoverflow.com/questions/10876123/how-to-find-out-if -xmlhttprequest-send-arbeitete) –

+0

Ich weiß nicht PHP, also kann ich Ihnen nicht die Implementierungsdetails geben, aber das Konzept ist einfach. Sobald PHP die Datenbank abgefragt hat, muss er eine Antwort an den Client senden, der die Einfügung angefordert hat. Sie könnten einfach HTTP-Statuscodes verwenden, z. 200 wenn erfolgreich eingefügt. Lesen Sie dann die Antwortheader von JavaScript. –

Antwort

2

Hallo, Sie müssen hinzufügen, in der Funktion insert_data auf dem try {am Ende} ein Echo von Ihrem Erfolg an ajax Skript als Antwort senden, so einfach.

$success['success'] = "You request just sending to the server ..."; 
echo json_encode($success); 

In Ihrem fonction Ajax

  xhr.onload = function(data) { 
       console.log(data); 
       console.log(data.success); 
      }; 

Sie müssen sich anpassen, diese Methode zeigen Ihnen, wie JS Bezug auf Daten, PHP senden.

+0

danke, ich habe versucht, was Sie vorgeschlagen haben, aus irgendeinem Grund wird die Seite nach dem Drücken der Schaltfläche "Senden" aktualisiert, und ich bekomme nicht die Daten auf der Konsole zu sehen.Was kann dazu führen? – DavSev

+0

auch während der Überprüfung der js-Datei in Quellen Registerkarte, der Lauf nicht in die 'xhr.onload' Block, so dass ich nicht die' console.log (Daten); 'Objekt Daten. was kann dazu führen? – DavSev

+0

Warum verwende ich diesen Code nicht, um eine Ajax-Anfrage zu machen? Weil das ein alter Code ist und kein Cross Browser. Ich schlug vor, Ajax lib von jquery zu verwenden oder ... zum Beispiel gab Ihnen die beste Wahl für Cross Browser Ajax Anfrage. –

1

Sie können auch die Reaktion in einem „Körper“ Schlüssel-Wert-Paar senden, und setzen Sie den Erfolg/Fehleranzeige innerhalb des HTTP-Statuscode:

$success["body"] = "You request just sending to the server ..."; 
header("HTTP/1.1 200 OK", true, 200); 

Und erhalten sie in js:

xhr.onload = function(data) { 
    console.log(data.status); 
    console.log(data.body); 
}; 

sehen: Set Response Status Code

oder: http://php.net/manual/de/function.http-response-code.php

Erklärung von Codes: https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

+1

Danke. Versuchte es so 'try { $ query-> execute(); \t if (! $ Query) { \t echo "Fehler beim Verbinden db!"; \t} else { \t \t \t $ success ["body"] = "Sie möchten nur zum Server senden ..."; \t \t \t \t \t Header ("HTTP/1.1 200 OK", wahr, 200); \t \t \t \t} \t} 'aber aus irgendeinem Grund kann ich nicht verstehen. der Lauf geht nicht in den Block xhr.onload, so dass ich die console.log (data) nicht bekommen kann; Objektdaten. was kann dazu führen? – DavSev

+0

Hmmm, wenn das Backend abstürzt, würde es schließlich einen Statuscode wie 500 interner Serverfehler senden. Wenn die Anforderung im Status "Anstehend" bleibt, ist das Back-End möglicherweise in einer Schleife oder einem anderen Prozess ... – Guntram