Python从PHP调用但SQLite3无效

时间:2013-04-20 11:25:43

标签: 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);
        $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文件。不仅如此,当我通过添加print语句调试我的程序时,我意识到我的程序运行到conn = sqlite3.connect('arts.db')然后在语句执行之前退出。

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

1 个答案:

答案 0 :(得分:1)

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

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

......类似......

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

如果您正在尝试创建新的arts.db,则很有可能在PHP脚本运行时,Web服务器进程无权在当前目录中创建该文件。

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

<强>更新

  

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

问题是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中完成所有这些。