0

我正在尝试制作一个 python 应用程序,它将在 SQL 数据库中插入数据。为了实现这一点,我让 python 应用程序在 GET 请求中发送参数,并编写了一个 php 脚本来获取它们并发出 SQL 请求

Python 脚本是(缩短的):

import httplib
import time

dd = time.time().__str__()[:-3]
d = time.time().__str__()[:-3]

link = str('?id_machine=1,type_erreur=ping,description_erreur=test,date_detection=' + dd + ',date=' + d)
print link

conn = httplib.HTTPConnection('localhost')

conn.request('GET','/test/erreur.php' + link)
res = conn.getresponse()
print res.status
print res.reason

执行打印时:

drakasan@debian:~$ python Ingesup/Web/AgentS.py 
?id_machine=1,type_erreur=ping,description_erreur=test,date_detection=1381245779,date=1381245779
200
OK

这是php脚本:

<?php
    $page ='Ajoutsalle';
    require_once ('connect.php');

    $id_machine=htmlspecialchars(trim($_GET['id_machine']));
    $type_machine=htmlspecialchars(trim($_GET['type_machine']));
    $description_erreur=htmlspecialchars(trim($_GET['description_erreur']));
    $date_detection=htmlspecialchars(trim($_GET['date_detection']));
    $date=htmlspecialchars(trim($_GET['date']));

    if($nom_machine && $id_salle && $ip && $systeme)
    {
        $query = $connect->query("SELECT * FROM erreur WHERE id='".$id."'");
        $rows=$query->rowCount();
        if($rows==1)
        {
            echo" <div id='error'>Ip existe deja </div>";
        } else {
            $req = $connect->prepare('INSERT INTO     erreur(id_machine,type_erreur,description_erreur,date_detection,date) VALUES(:id_machine,:type_erreur,:description_erreur,:date_detection,:date)');
            $req->execute(array(
                'id_machine'         => $id_machine,
                'type_machine'       => $type_machine,
                'description_erreur' => $description_erreur,
                'date_detection'     => $date_detection,
                'date'               => $date,
            ));
        }

    } else echo "vous devez renseigner tous les champs";
?>
<html>
    <form method='GET' action='#'>
    </form>
</html>

“极乐”数据库如下:

erreur (TABLE)
    -id (PRIMARY, AUTO INDENT, INT)
    -id_machine (INT, FOREIGN KEY)
    -type_erreur (VARCHAR[50])
    -description_erreur (VARCHAR[200])
    -date_detection (TIMESTAMP)
    -date (TIMESTAMP)

我正在使用 Xampp 将我的服务器和数据库放在 localhost/test 中。所以看起来脚本确实收到了 GET 请求,但没有执行。

问题是,我还是python的初学者,php的完全新手,所以我不知道在哪里搜索代码。

最终目标是:

agent.py --GET--> erreur.php --SQL--> bliss.erreur

由于会有很多代理,因此从 Python 脚本发送 SQL 请求不是解决方案。

任何人都可以验证 Python 脚本是否有效,和/或给我一个线索,让我知道我在代码中哪里出错了?

wget 与 -O 标志:

drakasan@debian:~$ wget -O - http://localhost/test/erreur.php?id_machine=1,type_erreur=ping,description_erreur=test,date_detection=1381241491,date=1381241491
--2013-10-08 16:19:31--  http://localhost/test/erreur.php?id_machine=1,type_erreur=ping,description_erreur=test,date_detection=1381241491,date=1381241491
Resolving localhost (localhost)... ::1, 127.0.0.1
Connecting to localhost (localhost)|::1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 826 [text/html]
Saving to: `STDOUT'

 0% [                                                                                                             ] 0           --.-K/s              <br />
<b>Notice</b>:  Undefined index: type_machine in <b>/opt/lampp/htdocs/test/erreur.php</b> on line <b>6</b><br />
<br />
<b>Notice</b>:  Undefined index: description_erreur in <b>/opt/lampp/htdocs/test/erreur.php</b> on line <b>7</b><br />
<br />
<b>Notice</b>:  Undefined index: date_detection in <b>/opt/lampp/htdocs/test/erreur.php</b> on line <b>8</b><br />
<br />
<b>Notice</b>:  Undefined index: date in <b>/opt/lampp/htdocs/test/erreur.php</b> on line <b>9</b><br />
<br />
<b>Notice</b>:  Undefined index: id in <b>/opt/lampp/htdocs/test/erreur.php</b> on line <b>11</b><br />
<b>Notice</b>:  Undefined variable: nom_machine in <b>/opt/lampp/htdocs/test/erreur.php</b> on line <b>13</b><br />
vous devez renseigner tous les champs
<html>
    <form method='GET' action='#'>
    </form>
</html>
100%[============================================================================================================>] 826         --.-K/s   in 0s      

2013-10-08 16:19:31 (69.1 MB/s) - written to stdout [826/826]
4

2 回答 2

1

除此之外,您没有正确遵循 HTTP URL 语法。一个例子说明了一切:

http://my.host/some/path?foo=1&bar=2

要点是论点除以&,而不是,


其他提示:

  • 阅读 HTTP 的基础知识。这不是一个复杂的协议,如果您知道需要查看的位置,它会很有帮助。

    (提示:共有三个部分:状态行、标题和正文)。

  • 调试时,还要检查响应的主体,而不仅仅是响应状态。

    在 Python 中,您可以通过打印response.read()方法的输出来做到这一点。其他选项是使用带有适当开关的命令行工具,如 wget 或 curl:

    $ wget -O - 'http://my.host/some/path?foo=1&bar=2'
    ...
    $ curl -v 'http://my.host/some/path?foo=1&bar=2'
    ... 
    $
    
  • 也许更好的选择是使用像 Wireshark 这样的数据包嗅探器,您可以在其中看到整个请求和响应。如果您想将协议纳入您的血液系统,这也是一个好习惯。

    (提示:在 Wireshark 中,右键单击一个数据包并选择“Follow TCP stream”)

  • 同样正如 bruno 指出的那样,GET 不应该用于存储数据,而应该使用 POST(我认为它存储$_POST在 PHP 中)。

    顾名思义:GET 表示获取,POST 表示发布。

  • 最后但同样重要的是,您的 PHP 代码不太可能生成有效的 HTML。该<? ... >部分被它打印的任何内容(回声)替换,因此您的实际输出将如下所示:

    vous devez renseigner tous les champs
    <html>
        <form method='GET' action='#'>
        </form>
    </html>
    

    这绝对不是有效的 HTML。

于 2013-10-09T09:55:17.197 回答
0

如果您在 PHP 中有未定义的变量警告,您需要立即处理。在这种情况下,您有$nom_machine &&,因为$nom_machine未定义,所以基本上等同于if(FALSE &&。这意味着其中的代码if永远不会运行。

在 Python 方面,您应该阅读输出,而不仅仅是标题。(例如。print res.read())。PHP 通常会在发送标头显示错误,这意味着您可能会遇到致命错误或带有200标头的空响应。

于 2013-10-08T14:30:15.600 回答