他の機能の中でも特に、ユーザーが単一の「データセット」にファイルをアップロードできる Web サイトを開発しました。この機能のために、ユーザーがこのデータセットの名前を定義してファイルをアップロードできる特定の php ページ ('update.php') を作成しました。次に、これらのファイルはディレクトリに保存され、単純な MySQL DB を関連データ (データセットの名前、アップロードしたすべてのファイルのフラグなど) で更新します。Windows 8 の XAMPP で Web サイトを開発およびテストしました。問題は、プロジェクト全体を Apache (Ubuntu 10.04 LTS 上) に移行したことです。データセットの作成とアップロードで奇妙な問題に直面しています。ファイルの。最も奇妙な問題は、データセットのフォーム テキスト フィールドを PHP 変数に POST すると、毎回デフォルト値があるにもかかわらず、常に空になることです。さらに重要なことは、フォルダーと Web サイトに適切な権限を与えているにもかかわらず、ファイルがディレクトリにアップロードされないことです (chmod 0777、ログインしているユーザーを「www-data」グループなどに追加しました)。この奇妙な動作について Google を検索しましたが、役立つページはありません。また、これは PHP のエラーではないと確信していますが、参考までに、「update.php」の簡単なコード スニペットを次に示します。
if($submit == "data") {
$old_ds_name = $_GET['name'];
$type = $_GET['type'];
$ds_name = $_POST['ds-name'];
$connect = mysql_connect("localhost", "user", "password");
if(!$connect) {
die('Connection error: ' . mysql_error());
}
$select = mysql_select_db("db", $connect);
if(!$select) {
die('Invalid DB: ' . mysql_error());
}
//Check names
if($old_ds_name != $ds_name) {
$query1 = "SELECT name FROM datasets WHERE name='$ds_name'";
$result1 = mysql_query($query1);
$do_name_check = mysql_num_rows($result1);
if($do_name_check > 0) {
?>
<script type="text/javascript">
var ds2 = '<?php echo $ds_name; ?>';
alert('Dataset '+ds2+' already exists. Please choose a different name.');
<?php
mysql_close();
?>
window.history.back();
</script>
<?php
}
}
$query2 = "SELECT * FROM datasets WHERE name='$old_ds_name'";
$result2 = mysql_query($query2);
$dir_name = mysql_result($result2,0, "dir_name");
if($type == 0) { //Normal dataset
$neo4j_f = mysql_result($result2,0, "neo4j");
if(isset($_POST['mentions']) && $_POST['mentions'] == "Yes") {
$mentions = "1";
}
mysql_close();
if($_FILES["neo4j"]["name"]) {
$filename = $_FILES["neo4j"]["name"];
$source = $_FILES["neo4j"]["tmp_name"];
$type = $_FILES["neo4j"]["type"];
$neo4j_f = uploadNeo4j($filename, $source, $type, $dir_name, $neo4j_f);
if($neo4j_f == -1) {
die('<script type="text/javascript">
alert("The Neo4j DB file you are trying to upload is not a .zip file.");
window.history.back();
</script>');
}
elseif($neo4j_f == -2) {
die('<script type="text/javascript">
alert("An error occured while uploading youe Neo4j DB file. Please try again.");
window.history.back();
</script>');
}
else {
$neo4j_f = "1";
}
}
$ds_name1 = mysql_real_escape_string($ds_name);
$old_ds_name1 = mysql_real_escape_string($old_ds_name);
if($old_ds_name1 != $ds_name1) {
$query = "UPDATE datasets SET name='$ds_name1', neo4j='$neo4j_f', mentions='$mentions' WHERE name='$old_ds_name1'";
} else {
$query = "UPDATE datasets SET neo4j='$neo4j_f', mentions='$mentions' WHERE name='$old_ds_name1'";
}
}
$connect = mysql_connect("localhost", "user", "password");
if(!$connect) {
die('Connection error: ' . mysql_error());
}
$select = mysql_select_db("evo_com", $connect);
if(!$select) {
die('Invalid DB: ' . mysql_error());
}
$result = mysql_query($query);
if(!$result) {
die('Invalid query 1: ' . mysql_error());
}
mysql_close();
}
「uploadNeo4j()」PHP 関数:
function uploadNeo4j($filename, $source, $type, $dir_name, $neo4j_f) {
include 'filepaths.php';
$name = explode(".", $filename);
$accepted_types = array('application/zip', 'application/x-zip-compressed', 'multipart/x-zip', 'application/x-compressed');
$okay = false;
foreach($accepted_types as $mime_type) {
if($mime_type == $type) {
$okay = true;
break;
}
}
$continue = strtolower($name[1]) == 'zip' ? true : false;
if(!$continue) {
return -1;
}
$target_path = "uploads/".$filename;
if(move_uploaded_file($source, $target_path)) {
$zip = new ZipArchive();
$x = $zip->open($target_path);
if ($x === true) {
$dir = $DEFAULT_ROOT_PATH.$DATA_PARENT_FOLDER.$DBs.$dir_name.$NEO_ROOT.$NEO_FOLDER;
rrmdir($dir);
$zip->extractTo($DEFAULT_ROOT_PATH.$DATA_PARENT_FOLDER.$DBs.$dir_name.$NEO_ROOT.$NEO_FOLDER);
$zip->close();
$lucene_neo = $DEFAULT_ROOT_PATH.$DATA_PARENT_FOLDER.$DBs.$dir_name.$NEO_ROOT.$NEO_FOR_LUCENE_FOLDER;
recursive_copy($dir, $lucene_neo);
unlink($target_path);
$neo4j_f = 1;
return $neo4j_f;
}
} else {
return -2;
}
}
および関連する HTML コード:
<form id="editdata" enctype="multipart/form-data" action="update.php&action=edit&submit=data&name=<?php echo $_GET['name']; ?>&type=<?php echo $_GET['type']; ?>" method="post">
<table style="margin:inherit" cellspacing="15px">
<tr>
<td><div id="text-label">Name of dataset:</div></td>
<td><input type="text" id="ds-name" name="ds-name" value="<?php echo $_GET['name']; ?>" required="required"/></td>
</tr>
<tr>
<td><div id="text-label">Date of creation:</div></td>
<td class="desc"><?php $date = new DateTime($_GET['date']); echo $date->format('d.m.Y H:i:s');?></td>
</tr>
<?php
if($_GET['type'] != 1) {
?>
<tr>
<td><div id="text-label">Type of dataset:</div></td>
<td class="desc">Type 1</td>
</tr>
<tr>
<td><div id="text-label">Neo4j Graph DB:</div></td>
<?php
if($_GET['neo4j'] == "1") {
?>
<td><div id="text-label-exists">UPLOADED</div></td>
<?php
}else {
?>
<td><div id="text-label-not-exists">DOESN'T EXIST</div></td>
<?php
}
?>
<td><input type="file" id="neo4j" name="neo4j"/></td>
</tr>
<tr>
<td class="text-label">Relationships:</td>
<td>
<div class="desc"><input name="mentions" type="checkbox" <?php if(isset($_GET['mentions']) && $_GET['mentions'] == "1") { echo "checked"; }?> value="Yes"/>Mentions
</td>
</tr>
</table>
<br/>
<input style="margin-left: 15px;" id="saveChanges" class="button_text" type="submit" name="submit" value="Save changes"/>
</form>
より大きなファイルを受け入れ、より長い実行時間を許可するように Apache を構成しました。MySQL ユーザーに完全な権限を付与しましたが、問題は修正されませんでした。私が参照しているテキスト フィールドは、$_POST['ds-name]
ご覧のようにデフォルト値を持つ場所ですが、PHP では空です。また、echo
PHP の実行が入ったif($_FILES['neo4j']['name'])
が表示されなかったときの関数を含めました。前もって感謝します。