2016-12-26 2 views
1

私はajaxとphpを使って、画像をテキストと共にアップロードできる「投稿を作成する」に使っています。現在のところ、投稿にコンテンツがあるかどうか、画像があるかどうかを確認したり、すべてを検証したりするPHPがあります。しかし、問題は私が投稿フィードに先行している応答を得るときですが、これにより、エラーがあったときにフィードに前もって追加されるようになります。私がしたいのは、エラーと呼ばれる別のdivにエラーを追加することです。 は、ここに私のPHP(私はPHPで始まり、何かが間違っているか、以下の作業をより簡単に行われていることができれば、私に知らせてくださいよ。)ここで エラーリストのAjaxレスポンスを確認する方法

<?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(); 

は私のAJAX呼び出しである

$.ajax({ 
     type: "post", 
     url: "includes/create-post.php", 
     data: new FormData(this), 
     processData: false, 
     contentType: false, 
     error: function (response) { 
      console.log(response); 
     }, 
     success: function (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(); 

     } 
    }); 
+0

サーバーからの応答にフラグを設定し、js success関数のフラグを確認します。おそらく簡単な方法です。 – Ayan

+0

プラス 'foreach'を見て、エラー配列に複数のエラーが含まれている場合に1つのエラーだけを表示した後に終了するか' die'します。 – Ayan

+0

@Ayan申し訳ありませんが、これは私がフラッグを設定するのが初めてです。私にその例を教えてもらえますか? die()に関しては、残りの関数が実行を停止するために何をすべきですか?私はすべてのエラーを表示し、その部分に到達すると、残りの関数が実行されないようにしたいと考えています。 –

答えて

1

die()のためには、単にこのようforeachのうちの声明dieを置くことができます。

if($imageError == 1){ 
    foreach($errors as $error) { 
     echo '<li>'.$error.'</li>'; 
    } 
    die(); 
} 
. 
. 
. 
. 
. 
. 
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(); 
} 

しかし、Y以来の他の要素にエラーを表示したい場合は、受信した出力がエラーであるかどうかを確認する方法が必要です。だから、これであなたのコードを交換してください:あなたの設計からコードを分ける場合

ところで
success: function (response) { 
     var obj = JSON.parse(response); 
     var errorCode = obj.responseCode; 
     var errorSet = obj.items; 
     if(errorCode == 0) { 
       $.each(errorSet, function(i, v) { 
         console.log('<li>'+v+'</li>'); 
       } 
     } 
     //Your rest of the code 

、そのよりよい:

// if no errors: 

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

    $ret_data = ['items' => $errors, 'responseCode' => 0]; 
    //content in $items must be in UTF-8 
    echo json_encode($ret_data); 

    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; 

     $ret_data = ['items' => $errors, 'responseCode' => 0]; 
     //content in $items must be in UTF-8 
     echo json_encode($ret_data); 

     die(); 
    } 
    if (move_uploaded_file($_FILES[$image]['tmp_name'], $path.$newname)) { 

     $uploadSuccesfull = 1; 

    } 
    else { 
     $errors[] = "Server Error!"; 

     $ret_data = ['items' => $errors, 'responseCode' => 0]; 
     //content in $items must be in UTF-8 
     echo json_encode($ret_data); 

     die(); 
    } 

    } 
} 

そして、あなたのAJAXの成功の呼び出しでは、このような何かを行います。

+0

次のエラーが発生しましたSyntaxError:JSON.parse:JSONデータの2行目の9行目に予期しない文字があります[詳細情報] –

+0

'contentType'を削除してみてください。 – Ayan

+0

にはまだ同じエラーがあります: –

関連する問題