papapape
@papapape (ぱぱぱぺ)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

php 古い画像が削除されない

Q&A

解決したいこと

現在phpの参考書を使いブログサイトを作る勉強をしています。
投稿記事の修正画面でブログのトップ画像の入れ替えをしたいのですが、新しい画像は画像フォルダに格納されるのですが古い画像が削除されません。
エラーにはunlinkが拒否されたと出ています。

ファイルは
article_edit.phpで修正内容を書いて
article_edit_check_phpで修正内容を確認
article_done.phpで修正実行←ここでエラー
という感じで作っています。

発生している問題・エラー

Warning: unlink(./gazou/aspara_yama.jpg ): Permission denied in C:\xampp\htdocs\sumoblog\article\article_edit_done.php on line 60

該当するソースコード

article_edit.php
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <!-- 検索時の説明文 -->
    <meta name="description" content="">
    <!-- 古いバージョンのIE向けの最適化 -->
    <meta http-equiv="X-UA-compatible" content="IE=edge"> 
    <!-- スマホに対応させる -->
    <meta name="viewpoint" content="width=device-width, initial-scale=1">
    <!-- SNSシェア時のurl,title,description,imageの指定 -->
    <meta property='og:type' content='website'>
    <meta property="og:url" content="">
    <meta property="og:title" content="">
    <meta property="og:description" content="">
    <meta property="og:image" content="">

    <title></title>
    <link rel="stylesheet" href="/css/stylesheet.css">
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css">

  </head>
  <body>
  <?php
    try{
      $article_code = $_GET['articlecode'];
    // データベースに接続
    $dsn='mysql:dbname=abc;host=localhost;charset=utf8';
    $user='root';
    $password='***';
    $dbh=new PDO($dsn,$user,$password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

    $sql='SELECT name,summary,content,gazou FROM article WHERE code=?';
    $stmt=$dbh->prepare($sql);
    $data[] = $article_code;
    $stmt->execute($data); //sql文で命令を出す

    $rec = $stmt->fetch(PDO::FETCH_ASSOC);
    $article_name = $rec['name'];
    $article_summary = $rec['summary'];
    $article_content = $rec['content'];
    $article_gazou_name_old = $rec['gazou'];

    $dbh = null;

    if($article_gazou_name_old == ''){
      $disp_gazou = '';
    }else{
      $disp_gazou = '<img src="./gazou/'.$article_gazou_name_old.'">';
    }
    }

    catch(Exception $e){
      echo 'ただいま障害により大変ご迷惑おかけしています。';
      exit();
    }
    ?>
    記事修正<br/>
    <br/>
    記事コード<br/>
    <?php echo $article_code;?>
    <br/>
    <br/>
    <form action="article_edit_check.php" method="post" enctype="multipart/form-data">
    <input type="hidden" name="code" value="<?php echo $article_code;?> ">
    <input type="hidden" name="gazou_name_old" value="<?php echo $article_gazou_name_old;?> ">
    記事名<br/>
    <input type="text" name="name" style="width:200px" value="<?php echo $article_name;?>"><br />
    <?php echo $disp_gazou;?>
    <br/>
    画像を選んでください<br/>
    <input type="file" name="gazou" style="width:400px"><br/>
    サマリー<br/>
    <textarea name="summary"cols="30" rows="5"><?php echo $article_summary;?></textarea><br/>
    本文<br/>
    <textarea name="content"cols="30" rows="10"><?php echo $article_content;?></textarea><br/>
    <br/>
      <input type="button" onclick="history.back()" value="戻る">
      <input type="submit" value="OK">
    </form>
  </body>
</html>
article_edit_check.php
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <!-- 検索時の説明文 -->
    <meta name="description" content="">
    <!-- 古いバージョンのIE向けの最適化 -->
    <meta http-equiv="X-UA-compatible" content="IE=edge"> 
    <!-- スマホに対応させる -->
    <meta name="viewpoint" content="width=device-width, initial-scale=1">
    <!-- SNSシェア時のurl,title,description,imageの指定 -->
    <meta property='og:type' content='website'>
    <meta property="og:url" content="">
    <meta property="og:title" content="">
    <meta property="og:description" content="">
    <meta property="og:image" content="">

    <title></title>
    <link rel="stylesheet" href="/css/stylesheet.css">
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css">
  </head>
  <body>
    <?php

    // 前の画面からデータを取得
    $article_code = $_POST['code'];
    $article_name = $_POST['name'];
    $article_summary = $_POST['summary'];
    $article_content = $_POST['content'];
    $article_gazou_name_old = $_POST['gazou_name_old'];
    $article_gazou = $_FILES['gazou'];

    // 安全対策
    $article_code = htmlspecialchars($article_code,ENT_QUOTES,'UTF-8');
    $article_name = htmlspecialchars($article_name,ENT_QUOTES,'UTF-8');
    $article_summary = htmlspecialchars($article_summary,ENT_QUOTES,'UTF-8');
    $article_content = htmlspecialchars($article_content,ENT_QUOTES,'UTF-8');

    if($article_gazou['size']>0){
      if($article_gazou['size']>1000000){
        echo '画像が大きすぎます。';
      }else{
        move_uploaded_file($article_gazou['tmp_name'],'./gazou/'.$article_gazou['name']);
        echo '<img src="./gazou/'.$article_gazou['name'].'">';
        echo '<br/>';
      }
    }

  if($article_name == ''){
      echo '記事名が入力されていません。<br/>';
    }else{
      echo '記事名:';
      echo $article_name;
      echo'<br/>';
    }

    if($article_summary == ''){
      echo 'サマリーが入力されていません。<br/>';
    }

    if($article_content==''){
      echo '本文が入力されていません。<br/>';
    }

    if($article_name == '' || $article_summary == '' || $article_content==''||$article_gazou['size']>1000000){
      echo '<form>';
      echo '<input type="button" onclick="history.back()" value="戻る">';
      echo '</form>';
    }else{
      echo '上記のように変更します。<br/>';
      echo '<form action="article_edit_done.php" method="post">';
      echo '<input type="hidden" name="code" value="'.$article_code.'">';
      echo '<input type="hidden" name="name" value="'.$article_name.'">';
      echo '<input type="hidden" name="summary" value="'.$article_summary.'">';
      echo '<input type="hidden" name="content" value="'.$article_content.'">';
      echo '<input type="hidden" name="gazou_name" value="'.$article_gazou['name'].'">';
      echo '<input type="hidden" name="gazou_name_old" value="'.$article_gazou_name_old.'">';
      echo '<br/>';
      echo '<input type="button" onclick="history.back()" value="戻る">';
      echo '<input type="submit" value="OK">';
      echo '</form>';
    }
    ?>
  </body>
</html>
article_edit_done.php
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <!-- 検索時の説明文 -->
    <meta name="description" content="">
    <!-- 古いバージョンのIE向けの最適化 -->
    <meta http-equiv="X-UA-compatible" content="IE=edge"> 
    <!-- スマホに対応させる -->
    <meta name="viewpoint" content="width=device-width, initial-scale=1">
    <!-- SNSシェア時のurl,title,description,imageの指定 -->
    <meta property='og:type' content='website'>
    <meta property="og:url" content="">
    <meta property="og:title" content="">
    <meta property="og:description" content="">
    <meta property="og:image" content="">

    <title></title>
    <link rel="stylesheet" href="/css/stylesheet.css">
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css">

  </head>
  <body>
    <?php
    try{
    // 前の画面からデータを取得
    $article_code = $_POST['code'];
    $article_name = $_POST['name'];
    $article_summary = $_POST['summary'];
    $article_content = $_POST['content'];
    $article_gazou_name_old = $_POST['gazou_name_old'];
    $article_gazou_name = $_POST['gazou_name'];

    // 安全対策
    $article_code = htmlspecialchars($article_code,ENT_QUOTES,'UTF-8');
    $article_name = htmlspecialchars($article_name,ENT_QUOTES,'UTF-8');
    $article_summary = htmlspecialchars($article_summary,ENT_QUOTES,'UTF-8');
    $article_content = htmlspecialchars($article_content,ENT_QUOTES,'UTF-8');

    // データベースに接続
    $dsn='mysql:dbname=abc;host=localhost;charset=utf8';
    $user='root';
    $password='***';
    $dbh=new PDO($dsn,$user,$password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

    $sql='UPDATE article SET name=?,summary=?,content=?,gazou=? WHERE code=?';
    $stmt=$dbh->prepare($sql);
    $data[]=$article_code;
    $data[]=$article_name;
    $data[]=$article_summary;
    $data[]=$article_content;
    $data[]=$article_gazou_name;
    $stmt->execute($data); //sql文で命令を出す

    $dbh = null;

    // もし古い画像が残っていたら消す
    if($article_gazou_name_old!=''){
      unlink('./gazou/'.$article_gazou_name_old);
    }

    echo $article_name;
    echo 'を修正しました。<br/>';
    echo '<a href="article_list.php">戻る</a>';


    }
    catch(Exception $e){
      echo 'ただいま障害により大変ご迷惑おかけしています。';
      exit();
    }
    ?>
  </body>
</html>

自分で試したこと

1度article_edit.phpを作り直しましたが改善されず

0

2Answer

「Permission denied」なので、権限の問題ではないかと思います。

環境や設計によって設定色々だと思うので、
「(自身の環境) and chmod 777」とかで調べることをおすすめします。

0Like

Your answer might help someone💌