簡體   English   中英

使用python將數據添加到sqlite3,然后使用php5在python,php5,sqlite3中動態檢索apache2服務器上的數據

[英]Using python to add data to sqlite3, then php5 to retrieve data on apache2 server dynamically using python, php5, sqlite3

*更新我正在嘗試為我的兒子做一個游戲,它有2個振動傳感器,分別代表Balls and Strikes(用於棒球)。 當傳感器被擊中時,我有一個循環,可在擊球或球上增加一個刻度。 當傳感器被擊中時,我還希望它也進入我的sqlite數據庫。 然后我有一個php文件,該文件讀取sqlite db並顯示實時發生的球和打擊。 我正在使用php5,sqlite3和apache2服務器。 我已經安裝了服務器,python腳本正確地檢測了傳感器並更新了2個變量,球和打擊。 我似乎無法將py文件鏈接到php文件,因此當我導航到basesloaded.php時,它將執行sensor.py。 如果我先在空閑狀態下運行py腳本,然后導航到php頁面,它將正確更新,只是不會從php文件運行py腳本。

#sensor.py file
#!/usr/bin/env python
import RPi.GPIO as GPIO
import time
import sqlite3

KnockPin = 12 
ShockPin = 13 

BtnPin = 15

inning = 1
runs = 0
strikes = 0
balls = 0

print ("Welcome to Bases Loaded!")

def setstr():
    global strikes
    strikes = 0
    global balls
    balls = 0

def setup():
    GPIO.setmode(GPIO.BOARD)         
    GPIO.setup(KnockPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    GPIO.setup(ShockPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)   

def knock(ev=None):

    with sqlite3.connect('basesLoaded.db') as conn;

        global strikes
        strikes += 1

        if strikes ==0:
            pass
        elif strikes == 1:            
            conn.execute("UPDATE bl set STRIKE = 1 WHERE ID =1");
            print ("Strike 1 :", conn.total_changes);

        elif strikes == 2:
            conn.execute("UPDATE bl set STRIKE = 2 WHERE ID=1");
            print ("Strike 2 :", conn.total_changes);

        elif strikes == 3:
            conn.execute("UPDATE bl set STRIKE = 0 WHERE ID=1");
            print ("Strike 3 Your Out :", conn.total_changes);

            global inning
            inning +=1
            conn.execute("UPDATE bl set INNING = inning WHERE ID=1");
            setstr()
            print ("Inning Number :", inning);

def shock(ev=None):
    with sqlite3.connect('basesLoaded.db') as conn;
        print ("Opened database successfully");
        global balls
        balls += 1

        if balls ==0:
            pass
        elif balls == 1:          
            conn.execute("UPDATE bl set BALL = 1 WHERE ID=1");
            print ("Ball 1 :", conn.total_changes);

        elif balls == 2:
            conn.execute("UPDATE bl set BALL = 2 WHERE ID=1");
            print ("Ball 2 :", conn.total_changes); 

        elif balls == 3:
            conn.execute("UPDATE bl set BALL = 3 WHERE ID=1");
            print ("Ball 3 :", conn.total_changes);

        elif balls == 4:

            global runs
            runs += 1
            conn.execute("UPDATE bl set BALL = 0 WHERE ID=1");
            conn.execute("UPDATE bl set RUN = 'runs' WHERE ID=1");
            print ("Run Scored! score is :", runs); 
            setstr()

def loop():

    GPIO.add_event_detect(ShockPin, GPIO.FALLING, callback=shock, bouncetime=2500)

    GPIO.add_event_detect(KnockPin, GPIO.FALLING, callback=knock, bouncetime=2500) 

if __name__ == '__main__':     # Program start from here
    setup()
    try:
        loop()

    except KeyboardInterrupt: 
        destroy()

這是我的PHP腳本,用於檢索sqlite數據-

#basesLoaded.php file
<?php
$try = exec('python sensor.py');
print_r ($try);
$db = new SQLite3('basesLoaded.db');

echo '<br>';
echo '<br>';
$strikes = ($db->querySingle('SELECT STRIKE FROM bl WHERE ID = 1'));
$balls = ($db->querySingle('SELECT BALL FROM bl WHERE ID = 1'));
$outs = ($db->querySingle('SELECT OUT FROM bl WHERE ID = 1'));
$runs = ($db->querySingle('SELECT RUN FROM bl WHERE ID = 1'));
$inning = ($db->querySingle('SELECT INNING FROM bl WHERE ID = 1'));


echo 'Strikes: ' . $strikes . '<br>';
echo 'Balls: ' . $balls . '<br>';
echo 'Outs: ' . $outs . '<br>';
echo 'Runs: ' . $runs . '<br>';
echo 'Inning: ' . $inning . '<br>';
?>

如@Parfait的評論中所述,您需要提交更新以使其持久化。 您的PHP代碼未看到更新,因為未提交。

您可以在代碼中調用conn.commit() ,但是,一種確保提交更新(或在發生錯誤時回滾)的簡便方法是使用上下文管理器打開數據庫,即使用with語句,例如:

def knock(ev=None):
    with sqlite3.connect('basesLoaded.db') as conn:
        conn.execute("UPDATE bl set STRIKE = 1 WHERE ID =1")

現在,在with語句終止時(在這種情況下,函數knock()返回時knock()將自動提交更新,或者在發生異常時回滾更新。


更新資料

如評論中所討論,事件處理似乎存在問題。 我懷疑您的代碼需要顯式保持運行,否則,一旦主線程終止,整個程序將終止。 您可以這樣做:

WAIT_PIN = 14

def register_callbacks():
    GPIO.add_event_detect(ShockPin, GPIO.FALLING, callback=shock, bouncetime=2500)
    GPIO.add_event_detect(KnockPin, GPIO.FALLING, callback=knock, bouncetime=2500) 

def wait():
    GPIO.wait_for_edge(WAIT_PIN, GPIO.BOTH)    # wait for level change

#    # Or wait in a while loop        
#    while True:
#        time.sleep(0.1)

#    # Or wait for keyboard input
#    input('Press <ENTER> to quit: ')

if __name__ == '__main__':
    try:
        setup()
        register_callbacks()
        wait()    # block the main thread
    except KeyboardInterrupt: 
        destroy()  

您需要一直運行此Python腳本。 它獨立於僅通過Web服務器響應HTTP請求而運行的PHP腳本。 您可以將Python腳本作為后台進程運行:

$ python sensor.py &

另外,從您的PHP腳本中刪除exec()調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM