0

他の機能の中でも特に、ユーザーが単一の「データセット」にファイルをアップロードできる 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 では空です。また、echoPHP の実行が入ったif($_FILES['neo4j']['name'])が表示されなかったときの関数を含めました。前もって感謝します。

4

2 に答える 2