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 ファイルがありません。それだけでなく、あちこちに print ステートメントを追加してプログラムをデバッグすると、プログラムが実行されるまでconn = sqlite3.connect('arts.db')実行され、ステートメントが実行される前に終了することに気付きました。

ターミナルでpythonエディターを使用したため(Ubuntuを使用)、プログラムにエラーはありません。このプログラムを正常に実行できましたが、PHPスクリプトからこれを実行すると発生しません。

4

1 に答える 1

1

PHPスクリプトの実行時に現在のディレクトリにない既存のファイルを参照しようとしている場合はarts.db、ファイルをフルパスで参照するのがおそらく最も簡単です。つまり、行を変更します...

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

...みたいな...

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

新しいarts.db.

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 に答える