如何使用jquery处理$ GET方法来查看xml文件?

时间:2017-12-21 13:28:46

标签: php jquery fopen

我正在使用此问题jQuery Ajax POST example with PHP来了解如何在表单提交之前处理数据。

我有一个没有GUI的应用程序,我围绕它构建了一个数据库和一个webapp。 此应用程序使用fopen()打开xml文件。 我正在使用$ GET方法从数据库中的列获取xml文件及其路径。

<?php
$sql = pg_query($conn, "select link, identification from tbl_xml where date='$today';"));
?>
<form id="xmlform" name="xmlform" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="GET">
<?php
while ($row = pg_fetch_row($sql)) {
echo "<button type='submit' name='xml' value='$row[0]' class='btn-as-link'>$row[1]</button>"
}
?>
</form>

我们在 index.php

[...]
ELSE IF( isset($_GET['xml'] )){
    include_once("showXml.php");
    }
[...]

showXml.php

$url = filter_var($_GET['xml'], FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH);
[...]
// $url contains a really long path and the file. Each folder of the path creates exception on how to open the xml file, but in the end i simply open like this:
    // Opening the file
    $myfile = fopen("$xml", "r");
    $xml =  fread($myfile,filesize("$xml"));
    $dom = new DOMDocument;
    $dom->preserveWhiteSpace = TRUE;

    // IF the file has XML format we will arrange it, if not we will print it raw
    IF ( $dom->loadXML($xml) ) {
      $dom->formatOutput = TRUE;
      $xml_out = $dom->saveXML();
      echo "<pre><code class='language-markup'>";
      echo htmlspecialchars($xml_out);
      echo "</code></pre>";
    } ELSE {
      $xml = str_replace('\'','\''.PHP_EOL,$xml);
      echo "<pre><code class='language-markup'>";
      echo htmlspecialchars($xml);
      echo "</code></pre>";
    }

    fclose($myfile);

我想使用$ GET方法,因为webapp有一个时钟,每隔X分钟页面刷新一次。如果我使用$ POST,我会看到那个窗口告诉我“重新发送数据”。我不希望这样。

我面临的问题是路径在URL中是否可见,并且因为webapp将很快收到更新,它也将在其他服务器中打开XML文件,我正在寻找一种方法来维护{ {1}}但是将表单从使用$ GET方法转换为jquery / ajax或者以任何其他方式将showXml.php转换为xml_file_path。

我从其他问题中添加了代码,我可以阅读“Hooray,它有效!”在控制台上。 我的变量echo "<button type='submit' name='xml' value='$row[0]' class='btn-as-link'>$row[1]</button>"位于$xml内。

form.php的

form.php

从这里开始,我不清楚如何触发:

if (isset($_POST['xml']){
    $xml = isset($_POST['xml']) ? $_POST['xml'] : null;
}
ELSE IF( isset($_GET['xml'] )){ include_once("showXml.php"); }

,打开变量index.php而不是$xml方法,而不是$GET内使用的$POST

2 个答案:

答案 0 :(得分:1)

我不是100%确信我已经掌握了这个问题,但是如果你想使用ajax发送请求(使用GET),也许以下内容可能提供一些指导。

使用ajax时,标准按钮不是使用提交按钮,而是工作正常 - xml文件的详细信息保存在按钮data-value属性中,并作为ajax网址的一部分发送。

使用回调函数处理您需要的响应 - 这只会弹出一个包含响应数据的警报。

<?php
    $sql = pg_query( $conn, "select `link`, `identification` from `tbl_xml` where `date`='$today';"));
    $bttns = array();
    while( $row = pg_fetch_row( $sql ) )$bttns[]="<input type='button' data-value='{$row[0]}' value='{$row[1]}' />";



    echo "<!-- render basic form with all buttons -->
        <form name='xmlform'>
        " . implode( PHP_EOL, $bttns ) . "
        </form>";
?>




<script>
    var url='showxml.php';
    var evtcallback=function(xml){
        alert(xml)
    };

    function ajax( url, callback, payload ){
        var xhr=new XMLHttpRequest();
            xhr.onreadystatechange=function(){
                if( this.status==200 && this.readyState==4 )callback.call( this, this.response );
            };
            xhr.open('GET', url + '?xml='+payload, true );
            xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
            xhr.send(null);
    }

    var col=Array.prototype.slice.call( document.forms.xmlform.querySelectorAll('input[type="button"]') );
        col.forEach(function( bttn ){
            bttn.addEventListener('click', function(event){
                ajax.call( url, evtcallback, this.dataset.value );
            }.bind( bttn ),false );
        });
</script>

答案 1 :(得分:0)

不是最好的方式,但它正在发挥作用。

我将表单转换为$_POST。将$_POST['xml']的值分配给$_SESSION['xml']并使用此值打开文件。文件打开后清空$_SESSION['xml']。网址很干净。