我有这个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脚本执行此操作时,这不会发生。
答案 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中完成所有这些。