运行通过AJAX传递的Python脚本的PHP命令按钮不起作用

时间:2017-03-29 13:07:55

标签: javascript php jquery python ajax

我仍在努力学习AJAX和各种实施方法。我的网站上有一个DIV标签,我通过将status.php文件重新加载到DIV标签中,使用AJAX在5秒后动态更新(定时更新是出于无关的原因)。

我遇到的问题是当我直接浏览status.php时,命令按钮正常工作,但是当我通过index.php使用它们时,它们没有响应。

我试图了解为什么他们以这种方式失败以及我能以“ELI5”的方式在工作中做出什么。

命令按钮运行Python脚本,打开/关闭车库门。下次运行状态Python脚本(在status.php顶部)时,它将具有门的新状态,并在AJAX更新该部分页面时最终显示在DIV标签中。

当我单击按钮时,现在index.php会一直显示在其中,但DIV标记完全重新加载status.php。但是,当发生这种情况时,Python脚本似乎不会被触发。

我怀疑命令按钮需要以更多的AJAX / Java-ey方式运行,而不是通过PHP运行,但我甚至不知道从哪里开始。

哦,还有一件事:我还有一个CGI脚本(e.h。http://example.com/cgi-bin/myq-cgi.py?username=user&pass=pass&command=open),我也可以用来打开/关闭门。我不会将它用于状态,因为它没有像完整的Python脚本那样包含状态上次更改的时间/日期。这可能是更好地打开/关闭门的潜在方式。

的index.php:

<html>
    <head>
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
        <script type="text/javascript">
        $(function(){ 
            setInterval(function(){
                $.ajax({
                    url: "status.php",
                    type: "POST",
                    dataType: "text",
                    success: function(data){
                        $("#status_div").html('The Garage Door Status is: ' + data);
                    }
                })

            }, 5000);
        });
        </script>
    </head>
    <body>
        Somethign on the web page.  Normally this would be the main website while the DIV tag waits to load.
        <div id="status_div"></div>
    </body>
</html>

status.php:

<?php

// Call Python script which gives me the status of my garage door in a text string.
$output = shell_exec('python /home/blah/garage_door/myq-garage.py status');

//I am NOT including lots of parsing of the $output.  Eventually I get the $output trimmed down to the to the $status PHP variable.
$status[1] = "Closed"   //values here can be either 'Closed' or 'Open'

?>

<!-- // Style info for table(s) -->
<style type="text/css">
.tg  {border-collapse:collapse;border-spacing:0;}
.tg td{font-family:Arial, sans-serif;font-size:14px;padding:7px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;}
.tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:7px 7px;border-style:solid;border-width:1px;overflow:hidden;wor$
.tg .tg-baqh{text-align:center;vertical-align:top}
.tg .tg-yw4l{vertical-align:center;text-align:left}
</style>

<!-- // HTML table to display garage door status info.  Display the image of the door and door status in left cell, time/date and options in right -->
<center>
<table class="tg">
<tr>
    <th class="tg-baqh">
        <div class="garage_status">
            <?php
                //Stuff unrelated to OP question here.  Dynamically displaying an image based on garage door status.
             ?>
        </div>
    </th>
    <th class="tg-yw4l">
        <?php
            // Command button to open door.
            if (isset($_POST['button_open'])){
                if ($status[1] = "Closed"){
                    shell_exec('python /home/blah/garage_door/myq-garage.py open "Garage Door"');
                }
            }

            // Command button to close door.
                if (isset($_POST['button_close'])){
                    if ($status[1] = "Open"){
                        shell_exec('python /home/blah/garage_door/myq-garage.py close "Garage Door"');
                        echo "<script>alert (\"cmd button works\")</script>";
                    }
                }

        ?>
        <form method="post">
            <p>
                <button name="button_open">Open Door</button>
                <button name="button_close">Close Door</button>
            </p>
        </form>
    </th>
</tr>
</table>
</center>

1 个答案:

答案 0 :(得分:0)

@hassan让我思考,所以我努力在index.php上构建我的命令按钮,以便它们不在ajax响应中。

我让他们工作。车库门打开/关闭。 index.php重新加载ajax足够快,用户可以看到状态,例如从Closed更改 - &gt;开幕 - &gt;打开 - &gt;结束 - &gt;关闭。更重要的是,该页面不会像旧的PHP按钮那样进行整体重新加载。

这次我用HTML / javascript中的按钮而不是PHP。另外,我没有运行Python脚本,而是使用了一个不同的基于python的CGI脚本,正如我提到的那样,我可以在我的OP中使用。

一旦这个工作在index.php中,只是为了它,我把它复制到status.php,当它加载了ajax时,它仍然在那里正常工作并将执行!

这是首先在index.html中的javascipt,但最终转移到status.php:

<script>
function open_door() {
    jQuery(function($) {
        $.ajax( {
            url : "http://example.com/cgi-bin/myq-cgi.py?user=somethibng@hotmail.com&pass=dfgsdfgsdfg&cmd=open",
            type : "GET",
            success : function(data) {
                alert ("Opening Door..."); //or use data string to show something else
                }
            });
        });
    }
</script>

<script>
function close_door() {
    jQuery(function($) {
        $.ajax( {
            url : "http://example.com/cgi-bin/myq-cgi.py?user=something@hotmail.com&pass=dfgdfgsdfg&cmd=close",
            type : "GET",
            success : function(data) {
                alert ("Closing Door..."); //or use data string to show something else
                }
            });
        });
    }
</script>


<form>
<input type="button" value="open" onClick="open_door()"
</form><form>
<input type="button" value="close" onClick="close_door()"
</form>