繁体   English   中英

从 PHP 执行 Python 脚本并插入 mysql

[英]Executing Python script from PHP and insert in mysql

我有一个 php 脚本,它执行一个 python 脚本并返回数据,它存储在 mysql 中。 它工作正常,但是当数据存储在数据库中时,它会插入一个额外的空白行。 我的问题是,我怎样才能让它只存储我收到的实际数据。

这是python脚本的一部分


##ser.write(sync)
    ser.write(counters)
    a = ser.read(30)
    state = binascii.hexlify(a)
    asd = re.sub(rb'([0-9, a-z, A-Z])(?!$)', rb'\1,', state)
    url = 'http://127.0.0.1/sastest/meters.php'
    x = requests.post(url, data = asd)
    print(asd)

这是来自 PHP


    passthru("meters.py");

    $incomingData = file_get_contents("php://input");


    $qry1 = "INSERT INTO machtest(data)
                values('".$incomingData."')";

    mysqli_query($conn,$qry1);

从评论中我们发现了整个过程:

当我调用meters.php 时,它会激活meters.py meter.py询问设备并将数据发送回meter.php

因为 PHP 的passthru不支持输出返回,但类似的函数exec将每一行作为元素作为数组对象,请改用它,并且不要让 Python 回发响应。 当然,在与数据库交互和传递输入值时始终运行参数化。

Python (meters.py)

ser.write(counters)
a = ser.read(30)
state = binascii.hexlify(a)
asd = re.sub(rb'([0-9, a-z, A-Z])(?!$)', rb'\1,', state)

print(asd)

PHP (meters.php)

// USE output ARG
exec(command = "meters.py", output = $incomingData);

// USE PARAMETERIZATION
$qry = "INSERT INTO machtest (data) VALUES (%s)";
$stmt = mysqli_prepare($qry);
mysqli_stmt_bind_param($stmt, "s", $incomingData[0]);
mysqli_stmt_execute($stmt);

请参阅 mysqli 准备好的语句文档


或者,让 Python 运行所有处理,包括设备和数据库交互。 然后,让 PHP 调用 .py 脚本:

Python (meters.py)

import mysql.connector        # USE ANY MySQL DB-API. THIS IS AN EXAMPLE
...

### INTERROGATE DEVICE
ser.write(counters)
a = ser.read(30)
state = binascii.hexlify(a)
asd = re.sub(rb'([0-9, a-z, A-Z])(?!$)', rb'\1,', state)

### APPEND TO DATABASE
# OPEN CONNECTION AND CURSOR
conn = mysql.connector.connect(host='localhost', database='mydatabase',
                               user='root', password='pwd')
cur = conn.cursor()

# USE PARAMETERIZATION   
qry = "INSERT INTO machtest (data) VALUES (%s)"
cur.execute(qry, (asd,))
conn.commit()

cur.close()
conn.close()

请参阅 MySQL 游标执行文档

PHP (meters.php)

// NO NEED FOR output
passthru(command = "meters.py");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM