0

SQL データベースにデータを挿入する Python アプリを作成しようとしています。これを達成するために、私はPythonアプリがGETリクエストでパラメーターを送信するようにし、それらを取得してSQLリクエストを行うことになっているphpスクリプトを作成しました

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>

「bliss」データベースは次のとおりです。

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 スクリプトが機能することを検証したり、コードのどこで問題が発生したかについての手がかりを教えてもらえますか?

-O フラグ付きの wget:

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 の基礎を読んでください。これは複雑なプロトコルではなく、どこを見る必要があるかを知っていれば非常に役立ちます。

    (ヒント: ステータス行、ヘッダー、本文の 3 つの部分があります)。

  • デバッグ時には、応答ステータスだけでなく、応答の本文も常に調べてください。

    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] を選択します)

  • また、ブルーノが指摘しているように、データの保存には 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 に答える