1

私はいたるところを見て、すべてを試したようですが、これを機能させることができません。どんな助けも大歓迎です! Blueimp の jQuery File Upload を使用しています。システム内の複数のレコードと場所でこのアップロードが機能するように、次の方法で UploadHandler.php を変更しました。PHPとMySQLを使用しています。

ファイル パス、ファイル名、ファイル タイプ、ファイル サイズ、レコード タイプ、および「ジョブ番号」が、異なるファイルごとに MySQL で作成したテーブルにアップロードされるように、handle_file_upload 関数に追加されました。

$file->upload_to_db = $this->add_file($job_num, $recordtype, $file_path, $filename, $type, $file_size);

このジョブ番号は、get 変数として (ファイルのアップロードと共に) ページに送信され、ファイルを追加するときに Handler に送信される非表示のフォーム フィールドとしても送信されます。追加した add_file 関数は次のとおりです。

function add_file($job_num, $recordtype, $filepath, $filename, $filetype, $filesize)
{
    $filepath = addslashes($filepath);
    $insert_query = $this->query("INSERT INTO fileupload (job_num, recordtype, file_path, file_name, file_type, file_size) VALUES ('".$job_num."','".$recordtype."','".$filepath."','".$filename."','".$filetype."','".$filesize."')");
    return $insert_query;
}

クエリ機能:

protected function query($query) {
    $database = $this->options['database'];
    $host = $this->options['host'];
    $username = $this->options['username']; 
    $password = $this->options['password'];
    $Link = mysql_connect($host, $username, $password);
    if (!$Link){
        die( mysql_error() );
    }
    $db_selected = mysql_select_db($database);
    if (!$db_selected){
        die( mysql_error() );
    }
    $result = mysql_query($query);
    mysql_close($Link);
    return $result;
}

削除する機能もあります。これで、すべて正常に動作します。追加したすべてのファイルが保存され、パスがデータベースに保存されます。ここから、すべてのレコードのすべてのファイルを表示するのではなく、そのレコードにアップロードされたファイルのみを表示する方法を見つける必要がありました。get 関数を次のように変更しました。

public function get($print_response = true) {
      if ($print_response && isset($_GET['download'])) {
        return $this->download();
    }
    $uploads = $this->query_db();
    return $this->generate_response($uploads, $print_response);
}

query_db 関数:

public function query_db() {
    $uploads_array = array();
    // error_log("Job Num: ".$this->job_num."\n\n",3,"error_log.txt");
    $select_result = $this->query("SELECT * FROM fileupload WHERE job_num=423424");
    while($query_results = mysql_fetch_object($select_result))
    {   
        $file = new stdClass();
        $file->id = $query_results->id;
        $file->name = $query_results->file_name;
        $file->size = $query_results->file_size;
        $file->type = $query_results->file_type;
        $file->url = "filepath_to_url/".$query_results->file_name;
        $file->thumbnail_url = "filepath_to_thumbnail/".$query_results->file_name;
        $file->delete_url = "";
        $file->delete_type = "DELETE";
        array_push($uploads_array,$file);
    }
    return $uploads_array;
}

私のシステムでファイルパスが正しい場所。これもまた、問題なく動作します。しかし、query_db 関数のクエリからわかるように、job_num がハードコードされています。最初のページが読み込まれたときにこれを取得する方法が必要です。これを行う方法を探しましたが、何も機能しませんでした。他のファイルを送信/追加するときは、 $_REQUEST['job_num'] を使用して取得できますが、ページが読み込まれたときはできません。私は OOP PHP にあまり詳しくないので、これのいくつかは私にとって初めてのことです。

4

2 に答える 2

0

多分これは役に立つかもしれません

protected function get_file_objects() {

    $user_id = $this->options['session_id'];
    $files = $this->query("SELECT yourname FROM yourname WHERE yourname='$user_id'");
    $files_array=array();
    while($row = mysql_fetch_assoc($files)){
        array_push($files_array,$row['yourname']);
    }
    return array_values( array_filter( array_map(
        array($this, 'get_file_object'),
        $files_array
    ) ) );
}
于 2013-01-25T18:30:14.947 に答える
0

job_numberあなたのコメントに基づいて、おそらくクラスにプロパティを追加したいと思うでしょう。add_file() このように呼び出すときに、クラスでこの値を設定できます

function add_file($job_num, $recordtype, $filepath, $filename, $filetype, $filesize)
{
    $this->job_number = $job_num;
    $filepath = addslashes($filepath);
    $insert_query = $this->query("INSERT INTO fileupload (job_num, recordtype, file_path, file_name, file_type, file_size) VALUES ('".$job_num."','".$recordtype."','".$filepath."','".$filename."','".$filetype."','".$filesize."')");
    return $insert_query;
}

次に、このジョブ番号をquery_db()メソッドで次のように参照できます。

public function query_db() {
    $uploads_array = array();
    // error_log("Job Num: ".$this->job_num."\n\n",3,"error_log.txt");
    $select_result = $this->query("SELECT * FROM fileupload WHERE job_num=" . $this->job_number);
    while($query_results = mysql_fetch_object($select_result))
    {   
        $file = new stdClass();
        $file->id = $query_results->id;
        $file->name = $query_results->file_name;
        $file->size = $query_results->file_size;
        $file->type = $query_results->file_type;
        $file->url = "filepath_to_url/".$query_results->file_name;
        $file->thumbnail_url = "filepath_to_thumbnail/".$query_results->file_name;
        $file->delete_url = "";
        $file->delete_type = "DELETE";
        array_push($uploads_array,$file);
    }
    return $uploads_array;
}

コード サンプルでは、​​データのサニテーションを考慮していないことに注意してください。SQL インジェクションを防ぐためにも、それを行う必要があります。mysqli_*実際には、関数の使用mysql_*は推奨されていないため、実際に検討する必要があります。また、おそらくデータベース接続をクラスに渡し、クラスのすべての領域で利用できるようにする必要があります(add_fileオブジェクトに設定する前にジョブ番号をエスケープすると便利なメソッドなど)。

于 2012-12-10T18:21:09.810 に答える