2017-06-26 3 views
0

Zuerst möchte ich beschreiben, was ich tun möchte.behandeln mehr als eine Ajax-Antwort

Ich habe eine Tabelle und eine Spalte hat Tasten. Jeder Button repräsentiert eine ID. Wenn die Schaltfläche angeklickt wird, speichere ich die ID in einer Variablen in Javascript. Ich möchte diese ID in einer MySQL-Anweisung verwenden, um einige Informationen zu erhalten, die sich in mehr als einer Zeile befinden und eine PDF-Datei mit diesen Daten erstellen.

Ich möchte Ajax verwenden, um die empfangenen Daten zu verarbeiten, aber ich weiß nicht genau, wie.

Bis jetzt ist es das, was ich habe:

<script> 
    $("#grid-table").bootgrid({   
     formatters: { 
     "buttonID": function(column, row){ 
      return "<button type=\"button\" id=\"edit\" class=\"btn btn-xs btn-default print-pdf\" + data-row-id1=\"" + row.ID + "\" ><span class=\"fa fa-file-pdf-o\"></span></button> "; 
     } 
    }).on("click", function(e){     
     var id = $(this).data("row-id1"); // id is a string 
     var recv_data1[]; 
     var recv_data2[]; 
     var recv_data3[]; 
     var recv_data4[]; 
     var i = 0; 

     if(id != ""){ 
     xmlhttp = new XMLHttpRequest(); 

     xmlhttp.onreadystatechange = function(){ 
      if (this.readyState == 4 && this.status == 200) { 
      // how to get all datas and store them here? 
      // and get the count of $i 

      var doc = new jsPDF();  // pdf object   
      mainPage(doc);    // my function to create a pdf background 

      var xPos = 25; 
      var yPos = 60; 

      while(i){ 
       doc.setFontSize(12); 
       doc.setFontType('normal');   
       doc.text(70, 55, recv_data1[i]);  // here I want to use some of the data 

       doc.setFontSize(11); 
       doc.setFontType('bold'); 
       doc.text(xPos+10, yPos+10, recv_data2[i]); // some more data I got from the mysql-statement 
       doc.text(xPos+55, yPos+10, recv_data3[i]); 
       doc.text(xPos+80, yPos+10, recv_data4[i]); 

       i--; 
      } 

      doc.save(recv_data1 + '.pdf'); // save pdf file 
      } 
     }; 
     xmlhttp.open("GET","get_data.php?id="+ id, true); 
     xmlhttp.send(); 
     }   
    }); 
</script> 

PHP-Teil von get_data.php:

<?php 
    include "dbconnect.php";  

    $revc_id = htmlspecialchars_decode($_GET['id']); 

    $result = mysqli_query($db, "SELECT  * 
           FROM  table 
           WHERE  table.id = 'revc_id';"); 

    $i = 1; 
    while($row = mysqli_fetch_array($result)) { 
    // how to handle the fetched array and alle the data to 
    // more than one variable for the js like 
    // echo $row['name'] for recv_data1[] 
    // echo $row['city'] for recv_data2[] 
    // echo $row['street'] for recv_data3[] 
    // echo $row['country'] for recv_data4[] 
    // echo $i    to know how many datas are in there 
    $i++; 
    } 

    mysqli_close($db); 
?>    

Dies ist nur ein allgemeines Beispiel dafür, was ich tun möchte, und nicht die Originalcode. Also was ich will ist, dass die Antwort, die ich von get_data.php erhalten habe, was in den meisten Fällen mehr als eine Zeile ist, in das Array gespeichert werden soll.

Ich hoffe, Sie wissen, was ich meine, wenn nicht frei, bitte zu fragen.

+0

Sie haben definieren keine Wähler auf jquery 'auf („Klick“, function (e) {' –

+0

es ist nur ein Beispiel. ich bootgrid verwenden, um damit zu umgehen .. ich bearbeitet meinen Beitrag – Alex

+0

prüfen dieses Beispiel das kann dir helfen https://www.phpflow.com/php/addedit-delete-record-using-bootgrid-php-mysql/ –

Antwort

1

Trickig zu antworten, wenn der angezeigte Code nicht der eigentliche Code ist, aber im Allgemeinen könnte man so etwas versuchen.

php 
--- 

$data=array(); 
while($row = mysqli_fetch_object($result)) { 
    $data[]=array(
     'name'  => $row->name, 
     'city'  => $row->city, 
     'street' => $row->street, 
     'country' => $row->country 
    ); 
} 
echo json_encode($data); 



/* javascript */ 

document.getElementById('BTTN_ID_ETC').onclick = function(e){ 
    e.preventDefault(); 

    var id = $(this).data("row-id1"); 

    if(id != ""){ 
     xmlhttp = new XMLHttpRequest(); 

     xmlhttp.onreadystatechange = function(){ 
     if(this.readyState == 4 && this.status == 200) { 

      var json=JSON.parse(this.response); 

      var doc = new jsPDF(); 
      mainPage(doc); 
      var xPos = 25; 
      var yPos = 60; 

      for(var n in json){ 
       try{ 
        var obj=json[ n ]; 

        if(typeof(obj)=='object'){ 
         var name=obj.hasOwnProperty('name') ? obj.name : false; 
         var city=obj.hasOwnProperty('city') ? obj.city : false; 
         var street=obj.hasOwnProperty('street') ? obj.street : false; 
         var country=obj.hasOwnProperty('country') ? obj.country : false; 

         if(name && city && street && country){ 
          doc.setFontSize(12); 
          doc.setFontType('normal'); 

          doc.text(70, 55, name); 

          doc.setFontSize(11); 
          doc.setFontType('bold');     

          doc.text(xPos+10, yPos+10, city); 
          doc.text(xPos+55, yPos+10, street); 
          doc.text(xPos+80, yPos+10, country); 
         } 
        } 
       } catch(err){ 
        console.log(err); 
        continue; 
       } 
      } 

      doc.save(json[0].name + '.pdf'); 
     } 
     }; 
     xmlhttp.open('GET', 'get_data.php?id='+ id, true); 
     xmlhttp.send(); 
    }   
}; 
+0

Es wäre schön, wenn du deinen Code bearbeiten und ein paar Kommentare hinzufügen kannst :) Danke für die schnelle Antwort Ich werde es versuchen – Alex

+0

Ich erhalte einen Fehler in der for-Schleife nach dem letzten Index von n, die sagt .. Uncaught Error: Typ des Textes muss String oder Array sein. "undefined" wird nicht erkannt. Das liegt daran, dass der letzte Wert von n dies ist: n = "zuerst", json = (2) [Objekt, Objekt] ..... weißt du warum? – Alex