2016-12-17 5 views
0

私は、あなたが投稿を作成して、それに(ただ一つの)画像を持っているウェブアプリケーションを開発しようとしていますが、テキストポストだけでも構いません。これは、個人的なプロジェクトで、PHPとAJAXを使いこなすためのものです。私はこれを間違っているかもしれません...私がやろうとしているのは、フォームデータをアップロードするかどうかを決定するphp関数に送信することですそうでなければ、私はそれが成功した場合は、データベースに投稿を挿入するために別の関数に画像の名前を送信するが、画像のアップロードが成功しない場合、エラーを表示します。また、それは成功していませんが、エラーは '画像がアップロードされていません'、と進み、とにかく投稿を作成します。ここで画像がアップロードされたかどうかを確認するには? AJAX PHP

これまでのところ、私が持っているものである

jQueryの

$(".new-post").submit(function (e) { 

    e.preventDefault(); 

    $.ajax({ 
     type: "post", 
     url: "includes/image-upload.php", 
     data: new FormData(this), 
     processData: false, 
     contentType: false, 
     error: function (response) { 
      console.log(response); 
     }, 
     success: function (response) { 
      var body = $("#post-body").val(); 
      $.ajax({ 
       type: "post", 
       url: "create-post-feed.php", 
       data: { 
        body: body, 
        image: response 
       }, 
       error: function (response) { 
        console.log(response); 
       }, 
       success: function (response) { 
        //      console.log(response); 
        $('section.feed').prepend(response); 
        $('article.post p').each(function() { 
         $(this).html(linkHashtags($(this).html())); 
        }); 
        $('article.post p').each(function() { 
         $(this).html(linkatsymbols($(this).html())); 
        }); 
        revealPosts(); 
       } 
      }); 
     } 
    }); 

}); 

PHP は、いくつかの研究の後、私はそれが誤りである場合、私はJSONとしてそれを返送して、チェックする必要があることが分かりましたjQueryの結果しかし、私は...

<?php 

require_once('../dbconnect.php'); 
include_once(INCLUDES_PATH .'functions.php'); 

function uploadFile ($file_field = null, $check_image = false, $random_name = false) { 

//Config Section 
$user_id = $_SESSION['user_id']; 
//check if directory exist if not create it 
if (!file_exists(HOME_PATH ."users/user_".$user_id)) { 
    mkdir(HOME_PATH ."users/user_".$user_id, 0777, true); 
} 
if (!file_exists(HOME_PATH ."users/user_".$user_id."/posts")) { 
    mkdir(HOME_PATH ."users/user_".$user_id."/posts", 0777, true); 
} 
//Set file upload path 
$path = "../users/user_".$user_id."/posts/"; //with trailing slash 
//Set max file size in bytes 
$max_size = 1000000; 
//Set default file extension whitelist 
$whitelist_ext = array('jpeg','jpg','png','gif'); 
//Set default file type whitelist 
$whitelist_type = array('image/jpeg', 'image/jpg', 'image/png','image/gif'); 

//The Validation 
// Create an array to hold any output 
$out = array('error'=>null); 

if (!$file_field) { 
    $out['error'][] = "Please specify a valid form field name";   
} 

if (!$path) { 
    $out['error'][] = "Please specify a valid upload path";    
} 

if (count($out['error'])>0) { 
    return $out; 
} 

//Make sure that there is a file 
if((!empty($_FILES[$file_field])) && ($_FILES[$file_field]['error'] == 0)) { 

    // Get filename 
    $file_info = pathinfo($_FILES[$file_field]['name']); 
    $name = $file_info['filename']; 
    $ext = $file_info['extension']; 

    //Check file has the right extension   
    if (!in_array($ext, $whitelist_ext)) { 
     $out['error'][] = "Invalid file Extension"; 
    } 

    //Check that the file is of the right type 
    if (!in_array($_FILES[$file_field]["type"], $whitelist_type)) { 
     $out['error'][] = "Invalid file Type"; 
    } 

    //Check that the file is not too big 
    if ($_FILES[$file_field]["size"] > $max_size) { 
     $out['error'][] = "File is too big"; 
    } 

    //If $check image is set as true 
    if ($check_image) { 
     if (!getimagesize($_FILES[$file_field]['tmp_name'])) { 
      $out['error'][] = "Uploaded file is not a valid image"; 
     } 
    } 

    //Create full filename including path 
    if ($random_name) { 
     // Generate random filename 
     $tmp = str_replace(array('.',' '), array('',''), microtime()); 

    if (!$tmp || $tmp == '') { 
     $out['error'][] = "File must have a name"; 
    }  
     $newname = $tmp.'.'.$ext;         
    } else { 
     $newname = $name.'.'.$ext; 
    } 

    //Check if file already exists on server 
    if (file_exists($path.$newname)) { 
     $out['error'][] = "A file with this name already exists"; 
    } 

    if (count($out['error'])>0) { 
     //The file has not correctly validated 
     return $out; 
    } 
    if (move_uploaded_file($_FILES[$file_field]['tmp_name'], $path.$newname)) { 
     echo $newname; 
    } else { 
     $out['error'][] = "Server Error!"; 
    } 
} else { 
    $out['error'][] = "No file uploaded"; 
    return $out; 
}  
} 

$file = uploadFile('file', true, true); 

if (is_array($file['error'])) { 
echo json_encode($file['error']); 
} 

die(); 

を作業が本当にところでこれは、現在動作します それを改善する方法についての任意のヘルプやコメントに感謝することを取得するには至っていない、唯一の問題は、ポストは、常に画像をアップロードするかどうかに作成されていることですか否か。

通常、私は少なくとも同じ日に回答を得るでしょう...この質問は悪いですか? XD編集が「質問をバンプする」のに役立つと聞きました

答えて

0

あなたがしたいことは、実際に行ったこととは異なります。コードでは、(1)画像をアップロードし、(2)投稿を保存するという2つのAJAX呼び出しを試みています。

1回のコールで両方のことを同時に行うのはなぜですか?この方法では、新しい投稿を作成するために画像をアップロードする(または送信しない)レスポンスを待つ必要はありません。

$(".new-post").submit(function (e) { 
    e.preventDefault(); 
    $.ajax({ 
     type: "post", 
     url: "create-post-feed.php", 
     data: new FormData(this), // send post information including selected file 
     processData: false, 
     contentType: false, 
     error: function (response) { 
      console.log(response); 
     }, 
     success: function (response) { 
      // etc 
     } 
    }); 
}); 

は、その後、あなたのcreate-post-feed.phpに、あなたは現在のコードとimage-upload.phpで持っているロジックをマージします。私は通常このようにします:

// validate post 

// validate image (if any) 

// if no errors: 

    // upload image (if any) and retrieve filename 

// if no errors: 

    // save post (with filename if any); if it fails, delete image (if any) 

// send response 
+0

オハイオウわかりました。私は複雑なものを作っていました...うーん、どうもありがとう! –

+0

私はどのようにPHPのFormData()から本文の内容を取得するのですか? @Mikey –

+0

AJAXで送信したデータを取得する方法を尋ねていますか?あなたが '$ _POST'と' $ _FILES'配列を見るのと同じように普通に行います。フォーム内のすべての入力に 'name'属性があることを確認してください。 – Mikey

0

@Mikeyこれは私の新しいPHPファイルのようです。今私の問題は、jQueryを使ってうまくいけばフィードに新しい投稿を追加し、そうでなければseparete divにエラーを表示するにはどうすればいいですか?

<?php 
require_once('../dbconnect.php'); 
include_once(INCLUDES_PATH .'functions.php'); 

$body = $_POST["body"]; 
$image = 'image'; 
$user_id = $_SESSION['user_id']; 

if(empty($_FILES[$image]['name'])){ 
    $has_image = 0; 
}else{ 
    $has_image = 1; 
} 

$postEmpty = 0; 

if(empty($_FILES[$image]['name']) && empty($body)){ 
$postEmpty = 1; 
die(); 
} 

// validate post 

if($postEmpty == 0 && !empty($body)){ 

    $cleanBody = clean_input($body); 

} 

// validate image (if any) 

if($has_image == 1){ 

    //check if directory exist if not create it 
    if (!file_exists(HOME_PATH ."users/user_".$user_id)) { 
     mkdir(HOME_PATH ."users/user_".$user_id, 0777, true); 
    } 
    if (!file_exists(HOME_PATH ."users/user_".$user_id."/posts")) { 
     mkdir(HOME_PATH ."users/user_".$user_id."/posts", 0777, true); 
    } 
    //Set file upload path 
    $path = "../users/user_".$user_id."/posts/"; //with trailing slash 
    //Set max file size in bytes 
    $max_size = 2000000; 
    //Set default file extension whitelist 
    $whitelist_ext = array('jpeg','jpg','png','gif'); 
    //Set default file type whitelist 
    $whitelist_type = array('image/jpeg', 'image/jpg', 'image/png','image/gif'); 

    // Create an array to hold any output 
    $errors = array(); 

    // Get filename 
    $file_info = pathinfo($_FILES[$image]['name']); 
    $name = $file_info['filename']; 
    $ext = $file_info['extension']; 

    //Check file has the right extension   
    if (!in_array($ext, $whitelist_ext)) { 
     $errors[] = "Invalid file Extension"; 
    } 

    //Check that the file is of the right type 
    if (!in_array($_FILES[$image]["type"], $whitelist_type)) { 
     $errors[] = "Invalid file Type"; 
    } 

    //Check that the file is not too big 
    if ($_FILES[$image]["size"] > $max_size) { 
     $errors[] = "File is too big"; 
    } 

    //If $check image is set as true 
    if (!getimagesize($_FILES[$image]['tmp_name'])) { 
     $errors[] = "Uploaded file is not a valid image"; 
    } 

    //Create full filename including path 
    if ($random_name) { 
    // Generate random filename 
     $tmp = str_replace(array('.',' '), array('',''), microtime()); 

    if (!$tmp || $tmp == '') { 
     $errors[] = "File must have a name"; 
    }  
     $newname = $tmp.'.'.$ext;         
    } else { 
     $newname = $name.'.'.$ext; 
    } 

    //Check if file already exists on server 
    if (file_exists($path.$newname)) { 
     $errors[] = "A file with this name already exists"; 
    } 

    if (count($errors)>0) { 
    //The file has not correctly validated 
     $imageError = 1; 
    } 

// if no errors: 

    // upload image (if any) and retrieve filename 
    if($imageError == 1){ 

     foreach($errors as $error) { 
      echo '<li>'.$error.'</li>'; 
      die(); 
     } 

    }else{ 

     //Create full filename including path 
     // Generate random filename 
     $tmp = str_replace(array('.',' '), array('',''), microtime()); 

     if (!$tmp || $tmp == '') { 
      $errors[] = "File must have a name"; 
     }  

     $newname = $tmp.'.'.$ext;         

     //Check if file already exists on server 
     if (file_exists($path.$newname)) { 
      $errors[] = "A file with this name already exists"; 
     } 

     if (count($errors)>0) { 
     //The file has not correctly validated 
      $imageError = 1; 
      foreach($errors as $error) { 
       echo '<li>'.$error.'</li>'; 
       die(); 
      } 
     } 
     if (move_uploaded_file($_FILES[$image]['tmp_name'], $path.$newname)) { 

      $uploadSuccesfull = 1; 

     }else { 
      $errors[] = "Server Error!"; 
      foreach($errors as $error) { 
       echo '<li>'.$error.'</li>'; 
       die(); 
      } 
     } 

    } 
} 


// if no errors: 

// save post (with filename if any); if it fails, delete image (if any) 
if($has_image == 1){ 

$query = "INSERT INTO posts 
     (user_id, body, image, has_image, date) 
     VALUES 
     ('$user_id', '$body', '$newname', '$has_image', now())"; 

}else{ 

    $query = "INSERT INTO posts 
     (user_id, body, has_image, date) 
     VALUES 
     ('$user_id', '$body', '$has_image', now())"; 

} 

$result = $db->query($query); 

// send response 

//check to make sure the user was added 
if($db->affected_rows == 1){ 

    $user_id = $_SESSION['user_id']; 

    $post_id = $db->insert_id; 

    $query = "SELECT post_id, body, image, has_image 
      FROM posts 
      WHERE post_id = $post_id 
      LIMIT 1"; 
    $result = $db->query($query); 

    if($result->num_rows == 1){ 
     $row = $result->fetch_assoc(); 
    } 

    $queryuser = "SELECT * 
       FROM users 
       WHERE user_id = $user_id 
       LIMIT 1"; 
    $resultuser = $db->query($queryuser); 
    if($resultuser->num_rows == 1){ 
     $rowuser = $resultuser->fetch_assoc(); 
    } 


if(!empty($row['avatar'])){ $userpic = $row['avatar']; }else{ $userpic = HOME_URL . 'img/avatar.jpg'; } 

    if($row['has_image'] == 1){ 

?> 
<article class="post"> 
    <div class="post-head cf"> 
     <a class="userpic" href=""><img src="<?php echo $userpic ?>" alt="<?php echo $rowuser['username'] ?>"></a> 
     <a href="" class="username"> 
      <?php echo $rowuser['username']; ?> 
     </a> 
    </div> 
    <img src="users/user_<?php echo $rowuser['user_id'] ?>/posts/<?php echo $row['image']; ?>" alt=""> 
    <div class="post-body"> 
     <div class="post-options"> 
      <a class="likes" href="">156 likes</a> 
     </div> 
     <p> 
      <a class="username" href=""> 
       <?php echo $rowuser['username'] ?> 
      </a> 
      <?php echo $row['body'] ?> 
     </p> 
     <hr /> 
     <div class="cf"> 
      <a class="like hide-text" href="javascript:;">Like This Post</a> 
      <form action="" class="comment"> 
       <input type="text" placeholder="Add a comment"> 
      </form> 
     </div> 
    </div> 
</article> 
<?php }else{ ?> 

    <article class="post no-img"> 
     <div class="post-head cf"> 
      <a class="userpic" href=""><img src="<?php echo $userpic ?>" alt="<?php echo $rowuser['username'] ?>"></a> 
      <a href="" class="username"> 
       <?php echo $rowuser['username'] ?> 
      </a> 
     </div> 
     <div class="post-body"> 
      <p> 
       <a class="username" href=""> 
        <?php echo $rowuser['username'] ?> 
       </a> 
       <?php echo $row['body'] ?> 
      </p> 
      <div class="post-options"> 
       <a class="likes" href="">1 like</a> 
      </div> 
      <hr /> 
      <div class="cf"> 
       <a class="like hide-text" href="javascript:;">Like This Post</a> 
       <form action="" class="comment"> 
        <input type="text" placeholder="Add a comment"> 
       </form> 
      </div> 
     </div> 
    </article> 

    <?php } 
    }else{ 

     echo 'There was a database error'; 

    } 

die(); 
関連する問題