1

我有这个 PHP 脚本:

<?php
    if($_GET["name"] != null && $_GET["name"] != ""){
        $name = urlencode($_GET["name"]);
        $name = htmlentities($name);
        $title = urlencode($_GET["title"]);
        $title = htmlentities($title);
        $art = urlencode($_GET["art"]);
        $art = htmlentities($art);
        $output = array();
        exec("python add.py $name $title $art",$output);            
    }
?>

这是 add.py 文件:

import sys
import sqlite3

name = sys.argv[1]
title = sys.argv[2]
art = sys.argv[3]
tup = (name,title,art)

conn = sqlite3.connect('arts.db')
c = conn.cursor()

c.execute('CREATE TABLE IF NOT EXISTS arts(name,title,art)')
c.execute('INSERT INTO arts VALUES(?,?,?)',tup)

conn.commit()
conn.close()

当文件运行时,我的当前目录中没有 Arts.db 文件。不仅如此,当我通过到处添加打印语句来调试我的程序时,我意识到我的程序一直运行到conn = sqlite3.connect('arts.db')然后在语句执行之前退出。

我的程序没有错误,因为我在终端中使用了 python 编辑器(我使用 Ubuntu),然后我可以成功执行这个程序,但是当我从 PHP 脚本执行它时不会发生这种情况。

4

1 回答 1

1

如果您尝试引用一个现有arts.db文件,而该文件在 PHP 脚本运行时不在当前目录中,那么通过完整路径引用该文件可能是最简单的方法,即更改行...

conn = sqlite3.connect('arts.db')

......像......

conn = sqlite3.connect('/the/full/path/to/arts.db')

如果您正在尝试创建一个新arts.db的 ,则很有可能当 PHP 脚本运行时,webserver 进程没有在当前目录中创建文件的权限。

不授予 PHP 写入包含 PHP 脚本的目录的权限可能更安全,因此在其他地方创建一个目录来存储文件,为其授予适当的权限,并在脚本中使用该目录的完整路径。

更新

我发现我没有写权限,因此我使用另一个程序创建了一个数据库并在其中创建了一个表,但仍然要向其中插入值我需要权限,你能告诉我该怎么做吗?

问题是 PHP 脚本生成的任何进程都将继承父进程的权限,并且具有相同的限制。

在最新版本的 Ubuntu 上,该/var/tmp目录始终可以由任何用户写入,因此您可以将其放在...

conn = sqlite3.connect('/var/tmp/arts.db')

...或者您可以通过修改权限将其放在其他任何位置,...

$ sudo chgrp www-data /the/full/path/to/directory
$ sudo chmod g+ws /the/full/path/to/directory

当然,这意味着使用单独的 Python 脚本没有多大意义,因此您不妨全部使用 PHP。

于 2013-04-20T11:32:09.493 回答