输入提交后生成并下载xml文件(php和mysql)-JPK

时间:2018-12-27 15:58:26

标签: php mysql xml

我想用以下形式创建一个页面:两个输入(开始和结束日期)和两种要生成的报告类型。一种报告是使用一个文件生成的,另一种报告是使用另一个文件生成的。要生成这些报告之一,您必须完成两个日期。输入两个日期后,单击生成XML文件并自动将其作为XML文件下载到磁盘的按钮。

XML是使用PHP生成的,该PHP从MySQL数据库提取数据。

不幸的是,我在创建此表单时遇到了问题,在输入两个日期之后,该表单将生成并保存一个XML文件,其中将包含给定期间数据库中的那些行。

我还希望能够在此XML文件中插入三个日期:第一个输入的日期,第二个输入的日期以及XML文件的创建日期。这些日期的位置在PHP中存储为:filecreateddate,startdate和enddate。

我的PHP文件:

<?php

/** create XML file */ 
$mysqli = new mysqli("localhost", "XXX", "XXX", "XXX");

/* check connection */
if ($mysqli->connect_errno) {

    echo "Connect failed ".$mysqli->connect_error;

    exit();
}

$query = "SELECT id, firma, ulica, nr, data_wystawienia, data_sprzedazy FROM FA";

$booksArray = array();

if ($result = $mysqli->query($query)) {

    /* fetch associative array */
    while ($row = $result->fetch_assoc()) {

        array_push($booksArray, $row);
    }

    if(count($booksArray)){

        createXMLfile($booksArray);

    }

    /* free result set */
    $result->free();
}

/* close connection */
$mysqli->close();

function createXMLfile($booksArray){

    $filePath = 'jpk.xml';

    $dom     = new DOMDocument('1.0', 'utf-8'); 

    $root      = $dom->createElement('JPK');

    $naglowek = $dom->createElement('Naglowek');
    $root->appendChild($naglowek);

    $naglowek->appendChild( $dom->createElement('KodFormularza', 'JPK_FA') );
    $naglowek->appendChild( $dom->createElement('WariantFormularza', '1') );
    $naglowek->appendChild( $dom->createElement('CelZlozenia', '1') );
    $naglowek->appendChild( $dom->createElement('DataWytworzeniaJPK', filecreateddate) );
    $naglowek->appendChild( $dom->createElement('DataOd', startdate) );
    $naglowek->appendChild( $dom->createElement('DataDo', enddate) );

    for($i=0; $i<count($booksArray); $i++){ 


        $bookid                     =  $booksArray[$i]['id'];  

        $bookNazwaKontrahenta       =  $booksArray[$i]['firma']; 
        $bookAdresKontrahenta       =  $booksArray[$i]['ulica']; 
        $bookDowodSprzedazy         =  $booksArray[$i]['nr']; 
        $bookDataWystawienia        =  $booksArray[$i]['data_wystawienia']; 
        $bookDataSprzedazy          =  $booksArray[$i]['data_sprzedazy'];   


        $book = $dom->createElement('FA');

        $book->setAttribute('id', $bookid);
        $book->appendChild($NazwaKontrahenta     = $dom->createElement('firma', $bookNazwaKontrahenta));
        $book->appendChild($AdresKontrahenta     = $dom->createElement('ulica', $bookAdresKontrahenta)); 
        $book->appendChild($DowodSprzedazy       = $dom->createElement('nr', $bookDowodSprzedazy)); 
        $book->appendChild($DataWystawienia      = $dom->createElement('data_wystawienia', $bookDataWystawienia)); 
        $book->appendChild($DataSprzedazy        = $dom->createElement('data_sprzedazy', $bookDataSprzedazy));

        $root->appendChild($book);

    }

    $dom->appendChild($root); 

    $dom->save($filePath); 

}
?>

带有按钮的表单必须如下所示: click

1 个答案:

答案 0 :(得分:0)

只需从$_POST$_GET数组中检索日期字段,然后将它们作为SQL中的参数和XML中的节点值传递。 Web表单数组的类型取决于您不发布的HTML表单method。假设采用以下形式,请考虑使用以下PHP:

HTML

<form action="/action_page.php" method="post">
  Start Date: <input type="text" name="start_date"><br>
  End Date: <input type="text" name="end_date"><br>
  <input type="submit" value="Submit">
</form>

PHP

if (!empty($_POST["start_date"]) && !empty($_POST["end_date"]) ) {

   $start_date = $_POST["start_date"];
   $end_date = $_POST["end_date"];
   $file_created_date = date("Y-m-d");

   $mysqli = new mysqli("localhost", "XXX", "XXX", "XXX");
   $booksArray = array();

   // PREPARED STATEMENT
   $query = "SELECT id, firma, ulica, nr, data_wystawienia, data_sprzedazy 
             FROM FA
             WHERE mydate BETWEEN ? AND ?";

   // BIND PARAMS
   $stmt = $mysqli->prepare($query);
   $stmt->bind_param('ss', $start_date, $end_date);

   // RUN QUERY
   if ($stmt->execute()) {
      $result = $stmt->get_result();
      while ($row = $result->fetch_assoc()) {
         array_push($booksArray, $row);
      }

      if(count($booksArray)){
         createXMLfile($booksArray);
      } 

      $result->free();
   }

   $mysqli->close();    
}

请务必通过在变量前加上$来更新函数:

...
$naglowek->appendChild( $dom->createElement('DataWytworzeniaJPK', $file_created_date) );
$naglowek->appendChild( $dom->createElement('DataOd', $start_date) );
$naglowek->appendChild( $dom->createElement('DataDo', $end_date) );
...

请确保为实际日期字段更新上面的SQL(即替换 mydate ):

SELECT id, firma, ulica, nr, data_wystawienia, data_sprzedazy 
FROM FA
WHERE mydate BETWEEN ? AND ?;