[英]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.