从PHP调用Python,但SQLite3不工作

从PHP调用Python,但SQLite3不工作,php,python,sqlite,Php,Python,Sqlite,我有一个PHP脚本: <?php if($_GET["name"] != null && $_GET["name"] != ""){ $name = urlencode($_GET["name"]); $name = htmlentities($name); $title = urlencode($_GET["title"]); $title = htmlentities($title);

我有一个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);            
    }
?>
文件运行时,我的当前目录中没有arts.db文件。不仅如此,当我通过到处添加print语句来调试我的程序时,我意识到我的程序一直运行到
conn=sqlite3.connect('arts.db')
,然后在执行语句之前退出


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

如果您试图引用现有的
arts.db
文件,当PHP脚本运行时,它不在当前目录中,那么可能最容易通过其完整路径引用文件,即更改行

conn = sqlite3.connect('arts.db')
…到类似于

conn = sqlite3.connect('/the/full/path/to/arts.db')
如果您试图创建一个新的
arts.db
,则在PHP脚本运行时,Web服务器进程很可能没有在当前目录中创建文件的权限

不授予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

当然,这意味着使用seprate Python脚本没有多大意义,因此您可以使用PHP来完成所有操作。

如果您试图引用一个现有的
arts.db
文件,而该文件在PHP脚本运行时不在当前目录中,那么通过其完整路径来引用该文件可能是最容易的,也就是说,改变线路

conn = sqlite3.connect('arts.db')
…到类似于

conn = sqlite3.connect('/the/full/path/to/arts.db')
如果您试图创建一个新的
arts.db
,则在PHP脚本运行时,Web服务器进程很可能没有在当前目录中创建文件的权限

不授予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

当然,这意味着使用seprate Python脚本没有多大意义,因此您最好用PHP来完成这一切。

如果找不到数据库文件,Python脚本中还应该有一些错误处理,可以投诉并退出。@halfer实际上,经过调查,看起来,
sqlite3
将尝试创建不存在的文件,这更可能是问题所在。谢谢@Aya,但我发现我没有写入权限,因此我使用另一个程序创建了一个数据库,并在其中创建了一个表,但仍要在其中插入值,我需要权限,你能告诉我怎么做吗?如果找不到数据库文件,Python脚本中还应该有一些错误处理,可以投诉并退出。@哈弗实际上,经过调查,看起来
sqlite3
将尝试创建不存在的文件,这更可能是问题所在。谢谢@Aya,但我发现我没有写的权限,因此我使用另一个程序创建了一个db,并在其中创建了一个表,但仍然要在其中插入值。我需要权限,你能告诉我怎么做吗?